Unityでキャラクターに追従するカメラを実装しようとしています。
スタンダードアセットのCameraフォルダにある「FreeLookCameraRig」というスクリプトを利用しています。
実現したいこと
・左クリックでカメラを上下左右に動かしたい
・ゲームパッドでカメラを上下左右に動かしたい
上2つを両立させたいです。
やったことと発生した問題
インプットマネジャーで右スティックに該当する箇所の名前をそれぞれ「Mouse X」「Mouse Y」に(とりあえず)変えました。
→ゲームパッドでもカメラが上下左右に動くようになりました。
スタンダードアセットをそのまま使用すると、画面にマウスをもってきただけで、クリックをしなくてもカメラが動きます。なので、if(InputMouseButton(0)){}を追加しました。
→左クリックでカメラを上下左右に動かすことができましたが、ゲームパッドで動かすことができなくなりました。なお、マウスを左クリックした状態だと右スティックでも動かすことができます。
どうしたらマウス操作とゲームパッドの操作をうまく両立させることができるでしょうか。
初心者のため全く違うやり方ではなく、最小限で修正をかけたいです。
該当のソースコード
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
namespace UnityStandardAssets.Cameras
{
public class FreeLookCam : PivotBasedCameraRig
{
// このスクリプトは、カメラリグのルートオブジェクトに配置するように設計されています。
// それぞれが次の親を持つ3つのゲームオブジェクトからなる:
// Camera Rig // Pivot // Camera [SerializeField] private float m_MoveSpeed = 1f; // ターゲットの位置に追いつくためにリグがどれだけ速く動くか。 [Range(0f, 10f)] [SerializeField] private float m_TurnSpeed = 1.5f; // ユーザー入力からリグが回転する速度。 [SerializeField] private float m_TurnSmoothing = 0.0f; // マウス回転のぎこちなさを軽減するために、回転入力にどの程度のスムージングを適用するか [SerializeField] private float m_TiltMax = 75f; // ピボットのX軸回転の最大値。 [SerializeField] private float m_TiltMin = 45f; // ピボットのX軸回転の最小値。 [SerializeField] private bool m_LockCursor = false; // カーソルを非表示にしてロックするかどうか。 [SerializeField] private bool m_VerticalAutoReturn = false; // 垂直軸を自動復帰させるかどうかを設定します private float m_LookAngle; // リグのy軸回転。 private float m_TiltAngle; // ピボットのX軸回転。 private const float k_LookDistance = 100f; // キャラクターの外観ターゲットは、ピボットよりどれだけ手前にありますか。 private Vector3 m_PivotEulers; private Quaternion m_PivotTargetRot; private Quaternion m_TransformTargetRot; protected override void Awake() { base.Awake(); // カーソルをロックまたはロック解除します。 Cursor.lockState = m_LockCursor ? CursorLockMode.Locked : CursorLockMode.None; Cursor.visible = !m_LockCursor; m_PivotEulers = m_Pivot.rotation.eulerAngles; m_PivotTargetRot = m_Pivot.transform.localRotation; m_TransformTargetRot = transform.localRotation; } protected void Update() { HandleRotationMovement(); if (m_LockCursor && Input.GetMouseButtonUp(0)) { Cursor.lockState = m_LockCursor ? CursorLockMode.Locked : CursorLockMode.None; Cursor.visible = !m_LockCursor; } } private void OnDisable() { Cursor.lockState = CursorLockMode.None; Cursor.visible = true; } protected override void FollowTarget(float deltaTime) { if (m_Target == null) return; // リグを目標位置に向けて動かします。 transform.position = Vector3.Lerp(transform.position, m_Target.position, deltaTime*m_MoveSpeed); } private void HandleRotationMovement() { if (Time.timeScale < float.Epsilon) return; if (Input.GetMouseButton(0)) // ←ここを追加しました { // ユーザー入力を読む var x = CrossPlatformInputManager.GetAxis("Mouse X"); var y = CrossPlatformInputManager.GetAxis("Mouse Y"); // 回転速度と水平方向の入力に比例した量だけ、視角を調整してください。 m_LookAngle += x * m_TurnSpeed; // リグ(ルートオブジェクト)をY軸のみの周りに回転させます。 m_TransformTargetRot = Quaternion.Euler(0f, m_LookAngle, 0f); if (m_VerticalAutoReturn) { // 傾斜入力の場合、マウス入力とタッチ入力のどちらを使用しているかによって動作が異なります。 // モバイルでは、垂直入力は傾斜値に直接マッピングされるため、ルック入力が解放されると自動的に元に戻ります。 // 最小値と最大値が対称でなくてもゼロに自動戻りたいので、ゼロより上か下かをテストする必要があります。. m_TiltAngle = y > 0 ? Mathf.Lerp(0, -m_TiltMin, y) : Mathf.Lerp(0, m_TiltMax, -y); } else { // マウスのあるプラットフォームでは、Yマウス入力と回転速度に基づいて現在の角度を調整します。 m_TiltAngle -= y * m_TurnSpeed; // そして、新しい値が傾斜範囲内にあることを確認してください。 m_TiltAngle = Mathf.Clamp(m_TiltAngle, -m_TiltMin, m_TiltMax); } // Xを中心としたチルト入力がピボット(このオブジェクトの子)に適用されます m_PivotTargetRot = Quaternion.Euler(m_TiltAngle, m_PivotEulers.y, m_PivotEulers.z); if (m_TurnSmoothing > 0) { m_Pivot.localRotation = Quaternion.Slerp(m_Pivot.localRotation, m_PivotTargetRot, m_TurnSmoothing * Time.deltaTime); transform.localRotation = Quaternion.Slerp(transform.localRotation, m_TransformTargetRot, m_TurnSmoothing * Time.deltaTime); } else { m_Pivot.localRotation = m_PivotTargetRot; transform.localRotation = m_TransformTargetRot; } } } }
}
補足情報(FW/ツールのバージョンなど)
Unity2018.3使用
スタンダードアセットのCrossPlatformInputというフォルダもインストールしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。