我的人形控制開發筆記(一)

前言

這系列的筆記會省去一堆基礎的程序實作, 程序碼亦會因為不同版本或為了新功能而修改,但核心的功能及實作時遇到的問題跟解法則會較詳細的記錄下來.

Locomotion 是甚麼?

所謂的 https://whatis.techtarget.com/definition/locomotion 在人物操作上就是一個混集了「基礎」移動的動畫合集.
例:

  • 靜止
  • 步行
  • 跑步

Unity3D 裡其實滿多範例解說的, 但其實 Unity 本身的範例有學習研究透徹的就會做出差不多這樣的圖.

詳見 Animator – Blending 一文

那麼餘下的問題就只是怎樣讀取玩家的輸入, 然後變為這個 Blend Tree 裡的 X, Y 值(圖片B部分)

常用的運算是.

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 direction = (transform.right * horizontal) + (transform.forward * vertical);
// convert 2D movement into 3D based on character current rotation.

在 3D 人物背後操縱時一般會把上面的 transform.forward / right 改為鏡頭(Camera)的方向,
因為大部分玩家是以看到的畫面來決定人物的移動方位的.

Local camera direction
// based on avatar current standing plane, to calculate the cameraForward.
public Vector3 CameraForwardOnPlane => Vector3.ProjectOnPlane(Camera.main.forward, transform.up).normalized;
public Vector3 CameraRightOnPlane => Vector3.ProjectOnPlane(Camera.main.right, transform.up).normalized;

取得向量資料, 然後就是簡單的 local / world 轉換跟剛剛取到的 Horizontal & Vertical 做運算.
就可以用此作為人物的位移指令.

 // Convert 2D input into 3D local direction
Vector3 direction = (Horizontal * CameraRightOnPlane) + (Vertical * CameraForwardOnPlane);

到此應該可以建構到一個簡單能跑的人形.

2 Comments

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料