質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

878閲覧

カメラの回転方法について、ゲームパッドとマウスで両立させたい

Mogx3

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/03/02 09:44

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というフォルダもインストールしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
一つの記述で両方を兼ねるのではなく、マウス用と右スティック用に分けてあげればいいのではないかと思い、InputMouseButton(0)のブロック範囲外に回転部分の記述をまるまるコピペして、右スティック用に各所変更することで考えてたとおりの挙動になりました。

投稿2019/03/03 05:23

Mogx3

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問