|  | 
 
| 
Unity 自帶插件 FirstPersonController 可以讓使用者快速控制 CharacterController, 不過亦非沒有缺點, 就例如是視點始終被滑鼠鎖定.
x
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社區。
您需要 登錄 才可以下載或查看,沒有帳號?立即註冊  因為有時候我們需要另外控制視點, 例如在一些過場或爆炸情景, 視點不應該完全由玩家控制, 那成因是甚麼? 如何用其他 Script 控制呢?
 
 成因:
 
 FirstPersonController中的這句就是控制視點的地方
 追蹤MouseLook複製代碼m_MouseLook.LookRotation (transform, m_Camera.transform);
 所以就是 GetAxis("Mouse X") 和 GetAxis("Mouse Y") 直接轉成視覺角度複製代碼        public void LookRotation(Transform character, Transform camera)
        {
            float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
            float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;
            m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);
            m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);
            if(clampVerticalRotation)
                m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);
            if(smooth)
            {
                character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,
                    smoothTime * Time.deltaTime);
                camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,
                    smoothTime * Time.deltaTime);
            }
            else
            {
                character.localRotation = m_CharacterTargetRot;
                camera.localRotation = m_CameraTargetRot;
            }
            UpdateCursorLock();
        }
 解決方法:
 
 1. 自己寫個新的 FirstPersonController (推荐,不過我很懶)
 2. 修改原有的 FirstPersonController (不是不可以,但需要原有FirstPersonController的時候,可能有衝突)
 3. 覆寫? (都是 private 好像不行,這個我不擅長)
 4. 取巧方法(本文重點)
 如何取巧呢? 由上述所見, character.localRotation 和  camera.localRotation 都可以加 Slerp, 所以其實只要將 smooth 開啟並將 smoothTime 設為0, 最終的character.localRotation 和  camera.localRotation 即不會被 FirstPersonController 改變
 
  現在可以自己寫少少 Script 來控制視覺方向
 
 把這個 Script 放在跟 FirstPersonController 同一個的 GameObject, 例如: FPSController複製代碼using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
//Set FirstPersonController smooth=true and smoothTime=0 !!
public class NewBehaviourScriptMouseLook : MonoBehaviour {
        public GameObject CameraObject;
        public float XSensitivity = 2f;
        public float YSensitivity = 2f;
        // Use this for initialization
        void Start () {
                
        }
        
        // Update is called once per frame
        void Update () {
                float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
                float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;
                transform.Rotate (0, transform.rotation.eulerAngles.x + yRot, 0);
                
                if (CameraObject.transform.localRotation.eulerAngles.x -xRot> 270 || CameraObject.transform.localRotation.eulerAngles.x -xRot<90) {
                        CameraObject.transform.Rotate (-xRot, 0, 0);
                }
        }
}
CameraObject是放Camera的Object, 例如: FirstPersonCharacter
 Sensitivity 就是 Sensitivity 不用多說
 其實內容只不過是參考自MouseLook改成的
 | 
 |