文章目錄
- 一、前言
- 二、孔明燈Blender建模
- 1、Blender下載安裝
- 2、孔明燈模型
- 3、匯出FBX
- 三、孔明燈Unity部分
- 1、Unity匯入FBX
- 2、制作材質
- 2.1、安裝URP
- 2.2、創建UniversalRenderPipelineAsset
- 2.3、設定Scriptable Render Pipeline Settings
- 2.4、創建ShaderGraph
- 2.5、創建ShaderGraph
- 2.6、創建材質球
- 2.7、模型使用材質球
- 3、燈座與線的材質
- 4、制作孔明燈火苗
- 4.1、畫火苗序列幀
- 4.2、粒子系統制作火苗
- 4.3、火苗放入孔明燈中
- 四、制作月球
- 1、月球模型
- 2、月球紋理
- 3、月球材質
- 4、月球放入場景
- 五、星空天空盒
- 1、天空盒資源
- 2、天空盒設定
- 六、寫腳本
- 1、孔明燈生成腳本:GenKongming.cs
- 2、孔明燈升空腳本:KongmingLamp.cs
- 七、運行測驗
- 八、工程原始碼
- 九、完畢
一、前言
嗨,大家好,我是新發,
看過我上一篇文章的同學應該知道,我最近自學了Blender建模,感興趣的同學可以看下我上一篇文章,《【游戲開發創新】當我學了Blender 建模,自制3D電腦桌面,回收站爆發了,把我做的模型都吐了出來(Blender | Unity | FBX)》,
馬上要中秋節了,那我做一個放孔明燈的Demo吧~
Demo最終效果如下,

仰視視角:

高空平視視角:

月亮視角:

下面,我就講下我這個Demo的制作程序吧~
二、孔明燈Blender建模
孔明燈的模型我是使用Blender做的,
1、Blender下載安裝
Blender官網:https://www.blender.org/
Blender中國社區:https://www.blendercn.org/
Blender中文手冊:https://docs.blender.org/manual/zh-hans/2.79/about/introduction.html
我使用的Blender版本是2.93.4,

注:關于
Blender的教程網上蠻多的,這里我就不過多講了,掌味訓本操作和快捷鍵,很快就可以上手建模啦~
2、孔明燈模型
使用Blender建一個簡易的孔明燈模型,
先做燈罩,

接著做燈座,

再做燈線,

最終如下:

網格如下:

3、匯出FBX
在Blender中點擊選單File / Export / FBX,將模型匯出成FBX格式,

如下:

三、孔明燈Unity部分
1、Unity匯入FBX
將孔明燈的FBX檔案匯入到Unity工程中,

將模型拖到場景中,再拖到Prefabs目錄中,保存為預設檔案,如下:

2、制作材質
材質的Shader我準備使用ShaderGraph來制作,
我之前寫過一篇ShaderGraph的文章:《ShaderGraph使用教程與各種特效案例:Unity2020》,推薦先看下這篇文章,
2.1、安裝URP
先通過Package Manager搜索universal rp,點擊Install執行安裝,

2.2、創建UniversalRenderPipelineAsset
在Project視圖中右鍵滑鼠,點擊選單Create / Rendering / Universal Render Pipeline / Pipeline Asset (Forward Renderer),

創建UniversalRenderPipelineAsset,如下

2.3、設定Scriptable Render Pipeline Settings
點擊選單Edit / Project Settings...,打開Project Settings視窗

選擇Graphics分頁,把UniversalRenderPipelineAsset拖到Scriptable Render Pipeline Settings中,

2.4、創建ShaderGraph
在Project視圖中右鍵滑鼠,點擊選單Create / Shader / Universal Render Pipeline / Lit Shader Graph,創建一個PBR的ShaderGraph,

重命名為LampshadeShader,作為燈罩的shader,

2.5、創建ShaderGraph
點擊Open Shader Editor打開編輯器,

我想要有一點半透明的效果,把Surface改為Transparent,設定一下基礎色、自發光和透明度,如下:

設定好后,記得點擊Save Asset保存,

2.6、創建材質球
創建一個材質球,設定Shader為剛剛的LampshadeShader,

2.7、模型使用材質球
將材質球應用到模型燈罩上,如下:

效果如下:

我們加個點光,效果如下:

3、燈座與線的材質
同理,把燈座和線的材質也做了,

效果如下:

4、制作孔明燈火苗
我們需要在燈座上做一個火苗,可以使用粒子系統來做,
4.1、畫火苗序列幀
在PhotoShop中新建一個1024 x 1024的畫布,

如下:

給畫布填充黑色,

因為我們要在畫布上畫火焰的序列幀,為了不畫偏了,建議創建參考線,比如我們要畫2 x 2的序列幀,那么畫布就要分割成4個格子,我們需要知道每個格子的中心點位置等等,
點擊選單 視圖 / 新建參考線,

如下,三條垂直參考線分別是256、512、768,七條水平參考線分別是146、256、366、512、658、768、878,我們在如下的4個位置分別畫火焰的序列幀圖案即可,

新建一個圖層,

在剛剛新建的圖層上畫火焰序列幀圖,憑感覺自由發揮,我也是隨便畫的,

把黑色的底圖圖層隱藏掉,

點擊選單檔案 / 存盤為,

選擇存盤格式為PNG,保存圖片為file.png,

4.2、粒子系統制作火苗
將剛剛的火焰序列幀圖片file.png拷貝到Unity工程中,如下:

圖片格式屬性設定如下:

在Hierarchy視圖空白處右鍵滑鼠,點擊選單Effects / ParticleSystem,

此時場景中就會創建出一個粒子系統,如下:

創建一個材質球,重名名為fire,設定Shader為Mobile/Particles/Additive,并設定貼圖為剛剛的火苗序列幀,

選中場景中的粒子系統,展開Renderer標簽頁,把材質球file拖給粒子系統,如下:

此時可以看到,粒子噴射出來的圖案變成序列幀圖案了:

上面我們看到,雖然粒子噴出來的圖案是火焰序列幀圖案了,但是它噴出來的不是一幀一幀的圖案,我們需要開啟粒子的序列幀屬性,
勾選Texture Sheet Animation,設定Tiles為 2 x 2,
注,如果你的火焰序列幀圖案是3 x 3的,則這里的
Tiles要設定為3x 3,

此時效果如下:
上面我們看到粒子拼命地往上飛,這是因為它的初始速度比較大,我們可以把Start Speed調小,比如調整為0.2 ~ 0.3,如下:

效果如下,現在溫和很多了:

我們看到粒子噴得很散,這是因為粒子的噴射區域是一個圓錐體(Cone),

我們可以把它的區域調小,展開Shape標簽頁,把張開角度Angle調整為20,把半徑Radius調整為0.01,

現在噴射區域很集中了,

我們希望每個粒子的生命周期時長是隨機的,將Start Lifetime設定為0.3 ~ 0.8,

效果如下,到這里已經有點感覺了對不對,

現在給粒子設定一個隨時間而變化的顏色,勾選Color over Lifetime,設定一個漸變色,

效果如下:

上面的這個效果,每個粒子會獨立得更新幀,為了方便觀察,我們先把Max Particles調整為1,

這樣就看的出來了,一個粒子在它的生命周期內獨立地更新它的影像幀,

我們希望每個粒子是固定的某一幀,展開Texture Sheet Animation標簽頁,設定Time Mode為Lifetime,設定Frame over Time為0 ~ 3,

再觀察一下效果,現在每個粒子是固定的某一幀啦,

把Max Particles調整成50,效果如下:

火焰燃燒的時候,是會有那種忽大忽小的效果的,我們希望粒子的大小隨時間而變化,勾選Size over Lifetime,我編輯了一個曲線,

效果如下:

PhotoShop再畫個火星的圖案,

匯入Unity中,對應地做一個材質球,

在火焰粒子節點下再創建一個粒子系統作為火星,

與火焰粒子一樣調整相關引數,火星的引數就不展開講了,上面的火焰效果如果能做出來,火星基本就沒問題的了,

效果如下:

4.3、火苗放入孔明燈中
將火苗粒子保存為預設,并放入孔明燈預設中,效果如下:

四、制作月球
1、月球模型
月球模型,簡單處理,一個球體,

2、月球紋理
紋理貼圖我是在Texture Haven下載的,地址:https://polyhaven.com/textures

這上面的紋理都是免費下載并且可直接商用的,良心網站!
我找了一個巖石紋理,

3、月球材質
月球材質的Shader我也使用ShaderGraph來做,節點如下:

應用到材質球中,預覽效果如下:

4、月球放入場景
把月球放入場景中,放到一個比較高的位置,

五、星空天空盒
1、天空盒資源
找一個天空盒的資源,我用的是這個星空天空盒,可以在AssetStore上免費下載,地址:https://assetstore.unity.com/packages/2d/textures-materials/sky/stellar-sky-99558

2、天空盒設定
下載下來匯入Unity中,點擊選單Window / Rendering /Lighting,

打開Lighting視窗,進入Environment分頁,設定天空盒材質球,設定環境光漸變色,如下:

星空效果有了,

六、寫腳本
1、孔明燈生成腳本:GenKongming.cs
我想要一開始在空中生成很多個孔明燈,寫GenKongming.cs腳本,
先宣告一些變數
/// <summary>
/// 孔明燈預設
/// </summary>
public GameObject lanternObj;
private Transform selfTrans;
/// <summary>
/// 主攝像機的Transform
/// </summary>
private Transform camTrans;
/// <summary>
/// 主攝像機
/// </summary>
private Camera cam;
在Start函式中創建50個孔明燈,
void Start()
{
selfTrans = transform;
cam = Camera.main;
camTrans = cam.transform;
//初始創建50個孔明燈
for (int i = 0; i < 50; ++i)
{
var go = Instantiate(lanternObj);
go.transform.position = new Vector3(Random.Range(-100, 100), Random.Range(50, 100), Random.Range(-100, 100));
go.transform.SetParent(selfTrans, false);
}
}
我們還想讓它每隔一個時間間隔就生成一個孔明燈,無限生成,寫一個協程,并在Start函式中啟動這個協程,
void Start()
{
// ...
// 協程無限回圈創建孔明燈
StartCoroutine(StartGen());
}
private IEnumerator StartGen()
{
while (true)
{
var go = Instantiate(lanternObj);
go.transform.position = new Vector3(Random.Range(-100, 100), 0, Random.Range(-100, 100));
go.transform.SetParent(selfTrans, false);
yield return new WaitForSeconds(1);
}
}
另外,我們希望點擊滑鼠右鍵的時候,在滑鼠的位置生成一個孔明燈,
private void Update()
{
// 點擊滑鼠右鍵,在滑鼠位置處生成一個孔明燈
if (Input.GetMouseButtonDown(1))
{
var go = Instantiate(lanternObj);
var pos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 3f));
go.transform.SetParent(selfTrans, false);
go.transform.position = pos;
}
}
為了可以從多個視角觀察,我們加上攝像機旋轉控制的邏輯,
private void Update()
{
// ...
// 滑鼠左鍵拖動,旋轉攝像機
if(Input.GetMouseButton(0))
{
float inputX = Input.GetAxis("Mouse X")*1.5f;
camTrans.Rotate(Vector3.up, inputX, Space.World);
}
}
我們還可以在高空再創建一個攝像機,通過按空白鍵來控制這個高空攝像機的激活,
/// <summary>
/// 高空攝像機
/// </summary>
public GameObject cam2;
private void Update()
{
// ...
// 高空攝像機的激活控制
if(Input.GetKeyDown(KeyCode.Space))
{
cam2.gameObject.SetActive(!cam2.activeSelf);
}
}
在場景中創建一個空物體,重命名為GenKongming,掛上GenKongming腳本,設定成員變數,

2、孔明燈升空腳本:KongmingLamp.cs
我們希望場景中的孔明燈自身有一個升空的邏輯,創建一個KongmingLamp.cs腳本,代碼很簡單,如下:
using UnityEngine;
public class KongmingLamp : MonoBehaviour
{
private Transform trans;
private Vector3 speed;
void Start()
{
trans = transform;
// 隨機一個升空速度
speed = new Vector3(Random.Range(-0.5f, 0.5f), Random.Range(1, 3), Random.Range(-0.5f, 0.5f));
}
void Update()
{
// 沿著速度方向升空
trans.position += speed * Time.deltaTime;
// 高度達到500,自我銷毀
if (trans.position.y > 500)
{
Destroy(gameObject);
}
}
}
將其掛到孔明燈預設上,

七、運行測驗
運行Unity,效果如下,
仰視視角:

高空平視視角:

加上螢屏后處理,

效果非常棒,

仰視視角:

高空平視視角:

月亮視角:

八、工程原始碼
本工程我已上傳到CODE CHINA,感興趣的同學可自行下載學習,
地址:https://codechina.csdn.net/linxinfa/UnityMidAutumnDemo
注:我使用的Unity版本為Unity 2021.1.9f1c1 (64-bit),

九、完畢
好了,就到這里吧,提前祝大家中秋快樂,愿新年,勝舊年!
我是林新發:https://blog.csdn.net/linxinfa
原創不易,若轉載請注明出處,感謝大家~
喜歡我的可以點贊、關注、收藏,如果有什么技術上的疑問,歡迎留言或私信,我們下期見~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300559.html
標籤:其他
上一篇:IO流之再戰猜拳小游戲
