Unity相機跟隨和第三人稱視角
- 介紹
- 鏡頭視角
- 跟隨人物方向進行旋轉的鏡頭視角
- 固定球和人的鏡頭視角
- 思路
- 跟隨人物方向進行旋轉的鏡頭視角
- 固定球和人的鏡頭視角
- 鏡頭旋轉代碼
- 人物移動的參考代碼
- 注意
介紹
最近足球項目的鏡頭在做改動,觀察了一下實況足球的視角,發現他有多種鏡頭模式,帶球時跟隨人物進行旋轉的第三人稱視角,不帶球時鏡頭鎖定人和球都能看到的視角,其實還有很多鏡頭視角,這里我主要選擇這兩個來講一下做一個demo。(我這里的demo不會做的很細大概做一個出來,他的鏡頭很細致細致到旋轉多少度才會有反饋,并不是實時旋轉反饋的)
鏡頭視角
跟隨人物方向進行旋轉的鏡頭視角
固定球和人的鏡頭視角
這里大家可以參考一下,因為如果要做細致的話其實還有很多需要寫的地方,這里我也只是做了個簡單的demo給需要類似這種鏡頭的伙伴一個思路。
思路
跟隨人物方向進行旋轉的鏡頭視角
參考我上面的這個gif,其實可以觀察的出來,其實相機的是始終在你控制的人物正后上方,這樣只需要計算出來相機應該在的位置,然后用現在的位置與最終的位置做一個lerp差值移動,緩慢移動到最終位置。
固定球和人的鏡頭視角
根據上面的圖我們大概可以看出來,相機是始終以球和人為中心,轉向也始終是球和人,相機的位置這里就是球到人連線的后方,旋轉方向也是這個反向量,這塊也很好理解。
鏡頭旋轉代碼
這里我不做太多的解釋了,大家應該都看得懂。
target是相機跟隨的目標
football是附屬固定的次要目標
offset是相機的高和前后距離
還有兩個平滑度參數也可以進行調整
這個直接掛在相機上即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FollowCamera : MonoBehaviour
{public Transform target; // 要跟隨的目標對象public Transform football; // 其次要跟隨的目標public Vector2 offset = new Vector2(2, 5); // 相機與目標之間的偏移量public float smoothSpeed = 0.125f; // 相機跟隨平滑度public float rotateSpeed = 0.125f;public bool IsHasBall = true;void LateUpdate(){if (target == null)return;if (Input.GetKeyDown(KeyCode.Q)) {IsHasBall = !IsHasBall;}if (IsHasBall){Vector3 desiredPosition = target.position + Vector3.up * offset.y - target.forward * offset.x;Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);transform.position = smoothedPosition;// 獲取目標對象的正前方Vector3 lookDirection = target.forward;// 使用 Quaternion.LookRotation 方法計算相機的旋轉方向Quaternion targetRotation = Quaternion.LookRotation(lookDirection);// 應用旋轉transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);}//沒有球的狀態else{//自身到足球的單位向量Vector3 dir = (target.position - football.position).normalized;Vector3 desiredPosition = target.position + Vector3.up * offset.y + dir * offset.x;Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);transform.position = smoothedPosition;//足球設置位置//求出自己和球的中點,讓相機朝向這個中點Vector3 tar = ((target.position + football.position) * 0.5f - smoothedPosition).normalized;// 獲取目標對象的正前方Vector3 lookDirection = tar;// 使用 Quaternion.LookRotation 方法計算相機的旋轉方向Quaternion targetRotation = Quaternion.LookRotation(lookDirection);// 應用旋轉transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);}}
}
人物移動的參考代碼
人物移動的有很多種方式,這里我為了測試用了個比較簡單的方式去做,參考一下即可
正常的人物移動是需要按照鏡頭的方向前進后退等,這里我只是為了方便測試沒有寫的很細。
using UnityEngine;public class RoleCtrlTest : MonoBehaviour
{public float moveSpeed = 5f; // 人物移動速度public float rotationSpeed = 180f; // 人物轉向速度void Update(){// 獲取玩家的輸入float moveHorizontal = Input.GetAxis("Horizontal");if (moveHorizontal == 0){}else if (moveHorizontal > 0){transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);}else if (moveHorizontal < 0){transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);}if (Input.GetKey(KeyCode.W)){transform.Translate(transform.forward * moveSpeed * Time.deltaTime, Space.World);transform.position += transform.forward * moveSpeed * Time.deltaTime;}}
}
注意
鏡頭其實還有很多的插件可以使用,比如Cinemachine插件,其實還有很多也不舉例子了,因為插件想要符合多種鏡頭模式需要長時間經歷注入,所以我選擇了手寫一個。
感謝大家的支持和關注