1. 程式人生 > >Unity MMORPG手遊中控制角色相機的移動跟隨(二)

Unity MMORPG手遊中控制角色相機的移動跟隨(二)

實現:通過鍵盤控制相機圍繞角色進行上下左右旋轉以及相機視角的縮放。

  1. 相機的建立 建立四個空物體,分別為下圖的命名,給相機四層父物體結構,以方便實現相機在三維場景中圍繞角色旋轉以及縮放 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

    position=(0,0,0) rotation為實時LookAt角色。 Main Camera上面暫時什麼都不用加,位置和角度均為0,後期相機上可以掛載一些震屏,螢幕特效之類的需要。 自此準備相機的準備工作就好了。下面是程式碼部分

  2. 程式碼控制視角轉變 首先是相機程式碼: 將相機設定成簡單的單例,並新增控制相機的幾種方法,然後可以在角色程式碼中進行呼叫。將程式碼掛載在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外掛的事件來,控制在移動平臺下對視角的控制。