文章目錄
- 一、前言
- 二、Blender建模
- 1、Blender下載安裝
- 2、回收站模型
- 3、展UV
- 4、制作紋理
- 5、應用紋理
- 6、匯出FBX格式
- 7、制作其他模型
- 三、Unity場景搭建
- 四、回收站影片
- 五、寫腳本
- 1、最后的紙團:TheLastSpitball.cs
- 2、回收站:RecycleBin.cs
- 六、運行效果
- 七、工程原始碼
- 八、完畢
一、前言
嗨,大家好,我是新發,
這兩天我自學了一下blender建模,練習了一些模型的制作,不過在練習程序中,我做了一堆奇奇怪怪的模型,感覺不是很好,然后就洗掉,進了回收站,
然后…我腦袋里就冒出了一個想法,于是我做了下面這個Demo,劇情如下:
當我把最后一個紙團模型丟進回收站的時候,回收站終于滿了,把被我洗掉的模型都吐了出來…


下面,我就來講講我的制作程序吧~
二、Blender建模
1、Blender下載安裝
官網:https://www.blender.org/
中國社區:https://www.blendercn.org/
中文手冊:https://docs.blender.org/manual/zh-hans/2.79/about/introduction.html
Blender的教程網上蠻多的,這里我就不過多講了,掌味訓本操作和快捷鍵,很快就可以上手建模啦~
下面我以建 回收站 模型為例進行講解,
2、回收站模型
我使用的Blender版本是2.93.4,

首先創建一個正方體,

編輯一下形狀,變成一個梯形的柱體,
提示:物體模式下,按
S縮放物體,按Tab進入編輯模式,按數字3切換成面選,選中面再按S縮放平面

把頂部的面刪掉,
提示:在編輯模式下,選中面,按
x鍵,然后點擊Faces即可洗掉面

添加厚度,
提示:添加
Solidify修改器,調節厚度即可

添加倒角(圓角),
提示:添加
Bevel修改器,調節倒角段數和長度即可

3、展UV
進入UV編輯模式,

在UV視窗中,點擊新建,

新建一張彩色柵格圖,方便做UV映射,如下,

在編輯模式下按A選中全部面,可以看到UV如下,

我們切到Shading視圖中,添加圖片節點,使用上面的彩色柵格圖作為貼圖,

效果如下,由于我們對模型做了一些縮放,導致貼圖有點變形,

現在我們執行一下智能UV投射,

投射后效果如下:

4、制作紋理
我們要在B5的位置貼一個回收的圖示,

我們先匯出UV布局圖,

匯出的布局圖是不含坐標資訊的,

沒關系,我們把柵格圖也匯出一下,

把兩張圖都匯入到PhotoShop中,

接著,我們找一個回收的圖示,進入阿里圖示庫:https://www.iconfont.cn/
搜索關鍵字回收,

找到一個合適的圖示,如下:

把圖示下載下來后,放到PhotoShop中,放到B5的位置,如下:

把布局和柵格圖隱藏掉,

匯出成JPG格式即可,
5、應用紋理
回到Blender中,把貼圖替換成帶圖示的貼圖,

效果如下:

6、匯出FBX格式
在Blender中將模型匯出成FBX格式檔案,

如下:

匯入到Unity中,效果如下:

這樣,我們的回收站模型就做好了~
7、制作其他模型
繼續制作其他模型,
我的電腦:

電池:

檔案夾:

紙團:

剪刀:

螺絲刀:

齒輪:

三、Unity場景搭建
把剛剛的模型都匯入到Unity工程中,存盤為預設,如下:

搭建場景如下,一個3D電腦桌面,娃哈哈,

四、回收站影片
給回收站制作一個抖動的影片,如下:

使用影片狀態機組織影片,通過shake布爾變數來控制狀態,如下:

關于影片狀態機的詳細介紹,我之前寫過一篇文章:《Unity影片狀態機Animator使用》,對影片控制不熟悉的同學建議看下,

五、寫腳本
1、最后的紙團:TheLastSpitball.cs
邏輯很簡單,就是檢測滑鼠點擊并根據滑鼠的位置移動紙團,
其中檢測滑鼠點中紙團用的是射線檢測,介面:
// Camera.cs
public Ray ScreenPointToRay(Vector3 pos);
根據滑鼠移動紙團用到了坐標轉換,介面:
// Camera.cs
public Vector3 ScreenToWorldPoint(Vector3 position);
需要注意的就是坐標轉換,我這里的攝像機是有點斜向下俯視的角度,要讓紙團在世界坐標的z坐標保持不變,

完整代碼如下:
using UnityEngine;
/// <summary>
/// 最后的紙團腳本
/// </summary>
public class TheLastSpitball : MonoBehaviour
{
private Camera cam;
private Transform camTrans;
private Transform selfTrans;
private bool canMove = false;
private float m_posZ;
void Start()
{
cam = Camera.main;
camTrans = cam.transform;
selfTrans = transform;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
// 滑鼠點中了物體
if (selfTrans == hit.transform)
{
// 快取物體與攝像機的距離
m_posZ = Vector3.Distance(selfTrans.position, cam.transform.position);
canMove = true;
}
}
}
if (Input.GetMouseButtonUp(0))
{
canMove = false;
}
// 滑鼠按住中
if (canMove && Input.GetMouseButton(0))
{
var pt = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, m_posZ));
var pc = camTrans.position;
var zo = selfTrans.position.z;
float t = (zo-pc.z)/(pt.z-pc.z);
var po = pc + t * (pt - pc);
// 讓物體的坐標跟著滑鼠走
selfTrans.position = po;
}
}
}
把TheLastSpitball.cs腳本掛到最后的紙團上,

2、回收站:RecycleBin.cs
回收站的腳本邏輯也非常簡單,通過OnCollisionEnter來檢測最后的紙團是否碰撞到了垃圾桶(簡單理解為丟進了回收站里),如果是則啟動一個協程,隨機實體化模型并添加一個向上的力,實作模型噴射的效果,
完整代碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 回收站腳本
/// </summary>
public class RecycleBin : MonoBehaviour
{
[SerializeField]
public GameObject[] modelObjs;
private Transform trans;
public Animator animator;
void Start()
{
trans = transform;
}
/// <summary>
/// 開始吐模型
/// </summary>
/// <returns></returns>
IEnumerator StartVomit()
{
yield return new WaitForSeconds(1);
animator.SetBool("shake", true);
for (int i = 0; i < 100; ++i)
{
var index = Random.Range(0, modelObjs.Length);
var obj = Instantiate(modelObjs[index]);
obj.transform.position = trans.position + Vector3.up;
obj.transform.forward = Vector3.up;
var rig = obj.GetComponent<Rigidbody>();
rig.AddForce(new Vector3(Random.Range(-50, 50), 50, Random.Range(-50, 50)));
yield return new WaitForSeconds(0.05f);
}
animator.SetBool("shake", false);
}
private void OnCollisionEnter(Collision collision)
{
if("最后的紙團" == collision.gameObject.name)
{
StartCoroutine(StartVomit());
}
}
}
把RecycleBin.cs腳本掛到回收站上,并賦值成員物件,如下:

六、運行效果
運行Unity,測驗效果如下,這個故事告訴我們,要定期清理回收站~

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

八、完畢
好了,就到這里吧,
我是林新發:https://blog.csdn.net/linxinfa
原創不易,若轉載請注明出處,感謝大家~
喜歡我的可以點贊、關注、收藏,如果有什么技術上的疑問,歡迎留言或私信,我們下期見~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299381.html
標籤:其他
上一篇:學透CSS-當CSS遇到古詩和月亮,月亮動起來!!!
下一篇:2021-09-11
