Unity MMORPG手遊中控制角色相機的移動跟隨(二)
阿新 • • 發佈:2018-12-10
實現:通過鍵盤控制相機圍繞角色進行上下左右旋轉以及相機視角的縮放。
-
相機的建立 建立四個空物體,分別為下圖的命名,給相機四層父物體結構,以方便實現相機在三維場景中圍繞角色旋轉以及縮放 CameraFollowAndRotate position=player.position rotation=(0,y,0) rotation.y控制視角圍繞角色水平方向移動且實時 CameraUpAndDown position=(0,0,0) rotation=(0,0,z) rotation.z控制視角圍繞角色豎直方向移動 CameraZoomContainer position=(10,0,0); rotation=(0,0,0); position.x控制視角縮放 CameraContainer
-
程式碼控制視角轉變 首先是相機程式碼: 將相機設定成簡單的單例,並新增控制相機的幾種方法,然後可以在角色程式碼中進行呼叫。將程式碼掛載在CameraFollowAndRotate下。
public class CameraCtrl : MonoBehaviour {
//單例 public static CameraCtrl Instance; /// <summary> /// 控制攝像機水平方向旋轉 /// </summary> [SerializeField] private Transform m_CameraFollowAndRotate; /// <summary> /// 控制攝像機上下旋轉 /// </summary> [SerializeField] private Transform m_CameraUpAndDown; /// <summary> /// 控制攝像機的縮放 /// </summary> [SerializeField] private Transform m_CameraZoomContainer; /// <summary> /// 攝像機容器 /// </summary> [SerializeField] private Transform m_CameraContainer; void Awake() { Instance=this; } /// <summary> /// 初始化 /// </summary> public void Init() { m_CameraUpAndDown.transform.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(m_CameraUpAndDown.localEulerAngles.z, 35f, 80f)); m_CameraZoomContainer.transform.localPosition = new Vector3(Mathf.Clamp(m_CameraZoomContainer.transform.localPosition.x, 3f, 5f), 0, 0); } /// <summary> /// 設定攝像機水平旋轉 /// </summary> /// <param name="rotateDir">0=左 1=右</param> public void SetCameraRotate(int rotateDir) { m_CameraFollowAndRotate.Rotate(0, 40 * Time.deltaTime * (rotateDir == 0 ? 1 : -1), 0); } /// <summary> /// 設定攝像機上下旋轉 /// </summary> /// <param name="rotateDir">0=上 1=下</param> public void SetCameraUpAndDown(int rotateDir) { m_CameraUpAndDown.Rotate(0, 0, 30 * Time.deltaTime * (rotateDir == 0 ? 1 : -1)); m_CameraUpAndDown.transform.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(m_CameraUpAndDown.localEulerAngles.z, 35f, 80f)); } /// <summary> /// 設定攝像機縮放 /// </summary> /// <param name="type">0=拉近,1=拉遠</param> public void SetCameraZoom(int type) { m_CameraZoomContainer.Translate(10 * Time.deltaTime * (type == 1 ? -1 : 1), 0, 0); m_CameraZoomContainer.transform.localPosition = new Vector3(Mathf.Clamp(m_CameraZoomContainer.transform.localPosition.x, 3f, 5f), 0, 0); } /// <summary> /// 實時看著主角 /// </summary> /// <param name="pos"></param> public void AutoLookAt(Vector3 pos) { m_CameraContainer.LookAt(pos); } void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, 15f); Gizmos.color = Color.blue; Gizmos.DrawWireSphere(transform.position, 14f); Gizmos.color = Color.green; Gizmos.DrawWireSphere(transform.position, 12f); }
}
3.角色程式碼中呼叫這幾種方法
void Start () { if(CameraCtrl.Instance!=null) { CameraCtrl.Instance.Init(); } } void Update() { CameraAutoFollow(); } /// <summary> /// 相機自動跟隨 /// </summary> private void CameraAutoFollow() { if (CameraCtrl.Instance == null) return; CameraCtrl.Instance.transform.position = this.transform.position; CameraCtrl.Instance.AutoLookAt(transform.position); if (Input.GetKey(KeyCode.A)) { CameraCtrl.Instance.SetCameraRotate(0); } if (Input.GetKey(KeyCode.D)) { CameraCtrl.Instance.SetCameraRotate(1); } if (Input.GetKey(KeyCode.W)) { CameraCtrl.Instance.SetCameraUpAndDown(0); } if (Input.GetKey(KeyCode.S)) { CameraCtrl.Instance.SetCameraUpAndDown(1); } if (Input.GetKey(KeyCode.I)) { CameraCtrl.Instance.SetCameraZoom(0); } if (Input.GetKey(KeyCode.L)) { CameraCtrl.Instance.SetCameraZoom(1); } }
自此,我們已經通過角色移動以及視角的上下左右旋轉以及縮放,下一篇,主要講通過EasyTouch外掛的事件來,控制在移動平臺下對視角的控制。