前言
項目中使用的基本角色控制腳本是由 Unity Learn 中的官方教程 John Lemon's Haunted Jaunt(很不錯的教程)中的示例控制腳本改進而來。其基本思路是根據輸入計算一個 2 維向量lookDirection作為角色的「面向」,並根據這一向量移動剛體以及播放動畫。
它能夠保證對於任意角度,角色的移動速度都保持一致,並且這一向量對於腳印效果的實現很重要。
如有疑問可以查閱底部的教程連結或直接下載腳本。
部分腳本參考
基本思路:
首先來梳理一下想要的人物足跡的特性:
在人物移動時生成,並在一段特定時間後消失,最好有個淡出效果
足跡會沿人物移動軌跡左右交互排列
足跡的指向與人物移動方向相同,也就是說在人物轉向時,足跡也應旋轉對應的角度
第一反應:建一個腳印的 prefab,利用動畫器實現淡出效果,用腳本實現腳印的生成、銷毀、鏡像與旋轉。之後深入一想腳本大概要怎麼寫,感覺頭大的不行,又想到了 Hierarchy 裡面被 FootStep12345678 塞得滿滿當當的壯麗場面..還是換個方法吧
轉念一想:unity 的粒子系統似乎可以滿足所有特性:生成淡出銷毀全自動,跟隨人物也是基本操作,比較存疑的就是用腳本控制粒子的鏡像與旋轉。
之後當然就是搜索有沒有現成的輪子可以用,別說,還真在 unity forums 找到了一個官方比較完美的粒子系統足跡效果。唯一的問題就是它是一個 3D 示例,而我的遊戲則是純 2D。
所以現在的問題就是如何將這一方案轉換在 2D 中實現。
先來分析一下它的實現腳本:
用來生成腳印粒子的核心代碼是Update()中的這一部分:
其中比較重要的有兩個量:transform.right與transform.rotation
transform.right:物體X軸的方向,垂直於物體的面向。腳印需要在此方向上左右偏移。transform.rotation.eulerAngles.y:物體Y軸方向上的的旋轉角度,在這個示例中也是它的移動方向旋轉的角度。
俯視角的 2D 遊戲中並不經常直接操作角色對象的旋轉,所以這兩個量在腳本中沒有意義,需要找一個與它們類似的變量來替代它們的功能。
而在之前的角色控制腳本中,恰恰有一個很重要的二維向量:lookDirection,從某種意義上它就是角色的「面向」,能夠起到與 3D 中的transform.front類似的效果。
果斷使用lookDirection向量進行等效替換:
transform.right與transform.front垂直,也就是說我們需要一個與lookDirection垂直的向量。
而兩向量垂直怎麼算來著?X1X2+Y1Y2 = 0嘛。
transform.right * gap * dir 等效替換為 new Vector3(lookDirection.y * gap * dir, -lookDirection.x * gap * dir, -5)
transform.rotation.eulerAngles.y為物體面向旋轉的角度,那麼直接計算lookDirection與Vector2(0, 1)向量的夾角就完事了。
transform.rotation.eulerAngles.y 等效替換為 Vector2.Angle(new Vector2(0, 1), lookDirection)
OK!腳本的基本思路完成了,之後就是設置粒子系統了。
創建足跡系統使用的腳印材質:
創建一個默認材質,然後將它的shader更改為Legacy Shaders / Particles / Alpha Blended,將腳印的 sprite 拖拽到選框中。重命名為footPrint。
設置粒子系統
在 Player 對象下新建一個粒子系統,並命名為FootStep
如圖設置粒子系統:
最後,根據情況修改角色控制腳本並調整參數
之後就是快樂的測試 -> 改代碼 -> 測試 -> 改代碼循環往復...
最終效果:
第一次寫教程,囉裡囉嗦寫得不好還請見諒哈
連結:
官方提供的使用 Ringbuffer 實現的3D 腳印效果示例:
https://pan.baidu.com/s/1g9s9GIiILRZpMVeQ640_5Q
提取碼:e8g6
項目中使用的 Charactor Controller 腳本(項目本身太大了就不放了):
https://pan.baidu.com/s/1a6A46aG1fD2ub3d__P4Nvg
提取碼:rqn1
參考:
https://learn.unity.com/tutorial/wan-jia-jiao-se-di-2-bu-fen?projectId=5dfa9a5dedbc2a26d1077ca8#5e391a9dedbc2a00227146d5
John Lemon's Haunted Jaunt 玩家角色 第二部分
https://forum.unity.com/threads/particle-system-ringbuffer-demo.740207/
Particle System Ringbuffer demo