香港新手遊戲開發者論壇

 找回密碼
 立即註冊
查看: 1444|回復: 0

[研究] FirstPersonController 視點被滑鼠鎖定問題

[複製鏈接]

63

主題

67

帖子

83 小時

在線時間

管理員

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

積分
453
發表於 2017-1-15 15:50:15 | 顯示全部樓層 |閱讀模式

馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?立即註冊

x
Unity 自帶插件 FirstPersonController 可以讓使用者快速控制 CharacterController, 不過亦非沒有缺點, 就例如是點始終被滑鼠鎖定.
因為有時候我們需要另外控制視點, 例如在一些過場或爆炸情景, 視點不應該完全由玩家控制, 那成因是甚麼? 如何用其他 Script 控制呢?

成因:

FirstPersonController中的這句就是控制視點的地方
  1. m_MouseLook.LookRotation (transform, m_Camera.transform);
複製代碼
追蹤MouseLook
  1.         public void LookRotation(Transform character, Transform camera)
  2.         {
  3.             float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
  4.             float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;

  5.             m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);
  6.             m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);

  7.             if(clampVerticalRotation)
  8.                 m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);

  9.             if(smooth)
  10.             {
  11.                 character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,
  12.                     smoothTime * Time.deltaTime);
  13.                 camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,
  14.                     smoothTime * Time.deltaTime);
  15.             }
  16.             else
  17.             {
  18.                 character.localRotation = m_CharacterTargetRot;
  19.                 camera.localRotation = m_CameraTargetRot;
  20.             }

  21.             UpdateCursorLock();
  22.         }
複製代碼
所以就是 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 來控制視覺方向
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityStandardAssets.CrossPlatformInput;

  5. //Set FirstPersonController smooth=true and smoothTime=0 !!
  6. public class NewBehaviourScriptMouseLook : MonoBehaviour {

  7.         public GameObject CameraObject;
  8.         public float XSensitivity = 2f;
  9.         public float YSensitivity = 2f;

  10.         // Use this for initialization
  11.         void Start () {
  12.                
  13.         }
  14.         
  15.         // Update is called once per frame
  16.         void Update () {

  17.                 float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
  18.                 float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;

  19.                 transform.Rotate (0, transform.rotation.eulerAngles.x + yRot, 0);
  20.                
  21.                 if (CameraObject.transform.localRotation.eulerAngles.x -xRot> 270 || CameraObject.transform.localRotation.eulerAngles.x -xRot<90) {
  22.                         CameraObject.transform.Rotate (-xRot, 0, 0);
  23.                 }

  24.         }
  25. }
複製代碼
把這個 Script 放在跟 FirstPersonController 同一個的 GameObject, 例如: FPSController
CameraObject是放Camera的Object, 例如: FirstPersonCharacter
Sensitivity 就是 Sensitivity 不用多說
其實內容只不過是參考自MouseLook改成的
個人簽名
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

手機版|Archiver|植物油氣

GMT+8, 2024-9-20 06:50 AM , Processed in 0.051170 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表