筆記:角色移動、相機控制與碰撞
1. 角色移動的基礎
- 移動方式選擇:
- Transform 組件:簡單易用,直接改變物件的位置與旋轉。
- Rigidbody 物理效果:通過施加力實現真實移動,但需配置物理屬性。
- 現成組件或 Prefab:如 Unity 的 Character Controller,快速實現移動控制。
- 基本設置:
- 在場景中創建一個膠囊物件作為玩家角色。
- 為膠囊添加 Rigidbody 組件並設置其約束(限制旋轉)。
- 使用 Material 為角色設置顏色。
2. 使用 Transform 控制角色移動
- 向量基礎:
- Unity 使用 Vector3 表示 3D 空間中的位置和方向。
- Vector3.forward 表示物件的正向方向。
- 玩家輸入:
- 通過 Input.GetAxis("Horizontal") 和 Input.GetAxis("Vertical") 捕捉玩家輸入。
- 水平軸 (A/D 或 ←/→) 控制旋轉,垂直軸 (W/S 或 ↑/↓) 控制前進和後退。
- 程式碼實現:
public float MoveSpeed = 10f;
public float RotateSpeed = 75f;
void Update() {
float vInput = Input.GetAxis("Vertical") * MoveSpeed;
float hInput = Input.GetAxis("Horizontal") * RotateSpeed;
transform.Translate(Vector3.forward * vInput * Time.deltaTime);
transform.Rotate(Vector3.up * hInput * Time.deltaTime);
}
3. 相機控制
- 相機跟隨:
- 設置相機與玩家的相對位置(偏移)。
- 使用 TransformPoint 方法動態更新相機位置。
- 程式碼實現:
public Vector3 CamOffset = new Vector3(0f, 1.2f, -2.6f);
private Transform _target;
void Start() {
_target = GameObject.Find("Player").transform;
}
void LateUpdate() {
transform.position = _target.TransformPoint(CamOffset);
transform.LookAt(_target);
}
4. 使用 Rigidbody 改進移動
- Rigidbody 動態物理運算:
- 避免直接修改 Transform,通過 MovePosition 和 MoveRotation 實現平滑移動和旋轉。
- 程式碼更新:
private Rigidbody _rb;
void Start() {
_rb = GetComponent<Rigidbody>();
}
void FixedUpdate() {
Vector3 rotation = Vector3.up * hInput;
Quaternion angleRot = Quaternion.Euler(rotation * Time.fixedDeltaTime);
_rb.MovePosition(transform.position + transform.forward * vInput * Time.fixedDeltaTime);
_rb.MoveRotation(_rb.rotation * angleRot);
}
5. 碰撞與觸發器
- 碰撞:
- Collider 組件允許物件檢測相互碰撞。
- 事件處理: OnCollisionEnter:檢測物件碰撞。 OnTriggerEnter:檢測物件進入觸發區域。
- 觸發器:
- 啟用 isTrigger,物件可以穿過 Collider,觸發相關事件。
- 應用於敵人偵測玩家範圍。
6. 練習與總結
- 實作練習:
- 創建健康補給物件,實現玩家碰撞後拾取的邏輯。
- 為敵人添加觸發區域,實現進入或離開觸發區時的日誌輸出。
- 核心概念:
- Rigidbody 添加真實物理效果。
- Collider 管理物件間的互動與觸發。
- Prefab 提高設計效率,支持多場景重用。