|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社區。
您需要 登錄 才可以下載或查看,沒有帳號?立即註冊
x
Unity 自帶插件 FirstPersonController 可以讓使用者快速控制 CharacterController, 不過亦非沒有缺點, 就例如是視點始終被滑鼠鎖定.
因為有時候我們需要另外控制視點, 例如在一些過場或爆炸情景, 視點不應該完全由玩家控制, 那成因是甚麼? 如何用其他 Script 控制呢?
成因:
FirstPersonController中的這句就是控制視點的地方- m_MouseLook.LookRotation (transform, m_Camera.transform);
複製代碼 追蹤MouseLook
- 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();
- }
複製代碼 所以就是 GetAxis("Mouse X") 和 GetAxis("Mouse Y") 直接轉成視覺角度
解決方法:
1. 自己寫個新的 FirstPersonController (推荐,不過我很懶)
2. 修改原有的 FirstPersonController (不是不可以,但需要原有FirstPersonController的時候,可能有衝突)
3. 覆寫? (都是 private 好像不行,這個我不擅長)
4. 取巧方法(本文重點)
如何取巧呢? 由上述所見, character.localRotation 和 camera.localRotation 都可以加 Slerp, 所以其實只要將 smooth 開啟並將 smoothTime 設為0, 最終的character.localRotation 和 camera.localRotation 即不會被 FirstPersonController 改變
現在可以自己寫少少 Script 來控制視覺方向
- 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);
- }
- }
- }
複製代碼 把這個 Script 放在跟 FirstPersonController 同一個的 GameObject, 例如: FPSController
CameraObject是放Camera的Object, 例如: FirstPersonCharacter
Sensitivity 就是 Sensitivity 不用多說
其實內容只不過是參考自MouseLook改成的 |
|