文章目錄
- 對比前一天沒看任何教程做的東西,看了教程的我頓悟了!(涉及多個高能知識點,建議保存)
- 關于繪制地圖
- 昨天
- 今天
- 關于攝像機跟隨
- 昨天
- 今天
- 關于2D游戲中的UI
- 昨天
- 今天
- 關于影片狀態機的狀態設定
- 昨天
- 今天
- 關于前兩天所說的影片只有向右的,我們如何在按下向左走時得到向左的影片,原來不止有一種方法
- 利用SpriteRender中的Flip X
- 利用localScale自身縮放
- 利用eularEngle自身旋轉
- 優化手感,適配各類機型,Update和FixedUpdate函式的區別
- 目前個人關于unity的部分規范
- 感謝大家!
對比前一天沒看任何教程做的東西,看了教程的我頓悟了!(涉及多個高能知識點,建議保存)
昨天花費了一天的事件,各種方面的考慮太多了,各種寫代碼,還浪費了很多時間,
今天看了一下一些教程,我整個人都


我昨天一天都干了些什么呀!果斷關掉unity,新建了一個專案
不過上面真的有很多值得學習的知識點以及插件!!
下面帶大家看一看,學習一下!
關于繪制地圖
昨天
我是純靠資源包中的精靈一個一個拖進地圖中的,然后Ctrl+D復制,這樣費時費力,還容易出現地圖脫節的情況!
今天
在Hierarchy中創建2D object中的Tilemap,在右邊創建畫板Palette,便能在左邊的Scene地圖中像畫畫一樣創建地圖啦!(我建議事先想好建立幾個Tilemap,因為有的作為邊界是需要碰撞的,而有的作為點綴則不需要碰撞,同時設定好它們的Order In Layer)

創建好Tilemap后,不會直接出現Tile Palette面板,所以怎么打開Palette面板呢?

具體的知識點有點多,而且我自己用的也不是很熟練,給大家一個b站的鏈接看一下簡單操作吧!
鏈接: https://www.bilibili.com/video/BV1ME411K7wF.
關于攝像機跟隨
昨天
我是利用的兩個攝像機,靠自己寫的一個攝像機跟隨的腳本,利用的Vector3中的插值函式Lerp實作的,類似于童年的游戲松鼠大作戰,玩家到達距離右側螢屏一定距離的時候,螢屏才會向右移動,
- 函式實作
public class CameraFollow : MonoBehaviour
{
private Transform transform;
private Transform player;
private void Awake()
{
transform = GetComponent<Transform>();
player = GameObject.FindWithTag("player").transform;
//找到player的transform
}
// Update is called once per frame
void Update()
{
if (player.position.x >= transform.position.x) // 判斷攝像機與玩家的位置的x大小
{
transform.position = Vector3.Lerp(new Vector3(transform.position.x, transform.position.y, transform.position.z),
new Vector3(player.position.x, transform.position.y, transform.position.z), 0.3f);
}
}
}
- 在這里可能就有小伙伴問了,為什么沒有設定向左跟隨?本來我是想設定的,先找到開始的相機與玩家的距離為最大距離,超過這個距離,則攝像機向左移動,保持這個最大距離,但是我想到很多游戲不支持鏡頭向左移動,所以我就沒加這個,
- 但是,問題又又又來了,不寫攝像機跟隨玩家向左,那么玩家一直向左走,不就走到攝像機外面,看不到了嘛?那么這時候就要輪到我們的空氣墻出場了,空氣墻,也就是沒有影像,但是有碰撞體的東西,

但只有這面墻還是不夠的,只是不讓我們在邊界時走出攝像機的范圍,因此,我們還要在這面墻上放上空氣墻跟隨的腳本(注意這里跟隨的物件應該是攝像機)
public class AirWallFollow : MonoBehaviour
{
private Transform camera;
private Vector3 OriginDir;
// Start is called before the first frame update
void Start()
{
camera = GameObject.FindWithTag("followcamera").transform;
OriginDir = camera.position - transform.position;
}
// Update is called once per frame
void Update()
{
transform.position = Vector3.Lerp(transform.position, camera.position - OriginDir, 0.5f);
}
}
- 雖說實作了攝像機的跟隨, 但還有很多不合理的地方,而且寫起來又難受有麻煩,很多功能還實作不了,比如螢屏的移動并不算平滑,感覺有點抖動的感覺,
今天
cinemachine橫空出世,只需要調整引數即可完美實作攝像機跟隨的效果,我將介紹cinemachine的部分重要引數功能,
當然,一開始我還在想這資源要不要錢什么的!

結果發現,這貨現在是unity自帶的插件,在package manager里就能下載到,ohhhhh!!!
使用方法明日介紹,
關于2D游戲中的UI
昨天
昨天創建UI,想在螢屏左側加上一個目前有幾格血的代碼,結果發現這個創建的畫布怎么這么大,而且大小也無法更改

于是我做了一個很沙雕的決定:在攝像機能照到的左上角放入了我需要作為血量的幾張圖片,然后做了一個血量跟隨攝像機的代碼,

代碼與空氣墻跟隨的代碼幾乎一樣,這里就不贅述了,
但是這樣的問題就是會出現,這個血量圖片一直在抖動的鬼畜現象!
今天
終于知道了,這個畫布是不受我們看到的Scene視圖中大小的影響的,無論怎么樣都是會顯示到我們的螢屏中的,設定這么大是unity自帶的,是因為unity不想讓我們在設定畫布時與地圖重合,這樣我們可以更好的控制調整畫布中每一個UI的位置和大小,所以,我又可以放心大膽的設定UI啦,加入了血量,暫停鍵,音量鍵和退出鍵,
關于影片狀態機的狀態設定
要問unity中最能裝b的神器是什么,那還得是影片狀態機,
昨天
一開始我只設定了幾個狀態,但后來發現總是會出現向左走轉到向右走的程序中會莫名其妙有個idle的動作導致動作的連接不順暢以及從走的狀態轉換到跳的狀態轉換不過去只能原地跳的情況,然后我就各種鼓搗設定,最后就變成了這樣:

[真·亂七八糟]
今天
原來我們可以通過一些設定解決這個問題,下面介紹幾個關鍵的屬性:

- Has Exit Time:有無退出影片時間,也就是在這個程序中必須等待idle的影片執行完在執行run的影片,默認勾選,在這里很明顯,我們肯定是取消的,因為我們希望我們一按左右鍵就跑起來,不能出現影片還在idle狀態,玩家就向左右走了,一般都是取消勾選的,但也看情況,如hurt受傷影片則需要等受傷影片執行完再回到idle狀態,
- Fixed duration:固定時間的轉換狀態,一般我都是取消,
- Transition Duration:轉換狀態所需要的時間,問題就在這里了,一直困擾我的原因就是由于各種狀態之間轉換需要時間,才會出現向左走轉到向右走的程序中會有個idle的動作導致動作的連接不順暢的情況,這個時間一定要設定為0,
關于前兩天所說的影片只有向右的,我們如何在按下向左走時得到向左的影片,原來不止有一種方法
注意:后兩種方法必須使用剛體中的transform,否則將出現空參考錯誤,
nullReferenceException: Object reference not set to an instance of an object
利用SpriteRender中的Flip X
if(hor < 0)
{
GetComponent<SpriteRenderer>().flipX = true;
}
else if(hor > 0)
{
GetComponent<SpriteRenderer>().flipX = false;
}
利用localScale自身縮放
if (hor != 0)
{
_rigidbody2D.transform.localScale = new Vector3(hor, 1, 1);
}
利用eularEngle自身旋轉
if(hor < 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0, 180, 0);
}
else if(hor > 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0, 0, 0);
}
優化手感,適配各類機型,Update和FixedUpdate函式的區別
Update是每幀執行一次,但由于各種機型處理器并不完全相同,幀率也就不同,特別是剛體的運動,會導致在其他機型上的運行并不流暢,而FixedUpdate是固定的時間執行,即每0.02秒執行一次,一秒要執行50次,在所有機型上都是一樣的執行速度,因此建議將剛體的運動都寫在FixedUpdate函式中,
目前個人關于unity的部分規范
1. 定義物體上的私有組件名稱均使用下劃線加組件名,
2.對物體上的物理作用進行操作,要寫在FixedUpdate函式中,
3.盡量將代碼塊分開,面向物件,易于維護,
4.影片狀態機中根據需求取消has exit time和fixed duration、Transition Duration,
5.盡量使用虛擬軸和虛擬按鍵,
6.跳躍可以嘗試改變重力的倍數來達到更真實的感覺,gravityscale
7.跳躍的盒子碰撞檢測必不可少,利用關鍵幀的方法是不對的,因為會出現動作無法執行完的情況,
8.除錯方法:可以使用debug.log的日志除錯或者DrawOnGizmos畫圖除錯.
感謝大家!
最后,感謝一下大家的支持!!!雖然不是那么厲害,但看到這個,確實也讓我挺受鼓勵的!希望這些文章給我幫助的同時也能給正在學習unity的朋友一些幫助,少走一些彎路,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297224.html
標籤:其他
上一篇:Unity之C#腳本編譯dll
