【Unity】タッチ入力でカメラを回転させる
タッチ入力でカメラを操作するには、タッチ入力の移動距離を取ってその値を回転に加える。今回はTouchScriptのScreenTransformGestureを使ってこの機能を実装する。
1.FullScreenLayerとScreenTransformGestureをアタッチ
回転させるオブジェクトにFullScreenLayerとScreenTransformGestureをアタッチする。LayerはMainCamera、GestureはTranslationにチェックを入れる。これらをつけたオブジェクトが回転するため、カメラにつけた場合は一人称視点、プレイヤーやオブジェクトなどにつけた場合は三人称視点になる。
2.スクリプトの作成
移動距離を取得し、その値をオブジェクトのオイラー角に加えて回転させる。タッチでカメラを操作する場合、画面をスワイプしてその移動量に応じてカメラを回転させると感覚通りの挙動をする。
そこでタッチの移動距離を取得する関数がScreenTransformGestureのDeltaPositonである。DeltaPositionで前フレームと現在フレームの差分をVector3で取得できる。今回はオイラー角に代入してカメラを回転させるため、この数値をオイラー角に足し続ける必要がある。仮にこの処理を行わない場合は、オイラー角がDelataPositonで取得したVector3の値になるので微小の回転を繰り返すだけになる。また、Transform.eulerangleは360度以上の回転を加えると増加させるのに失敗するため、あらかじめMathf.Clampや回転させる場合の条件をつけて回転の上限を設ける必要がある。
RotateにDeltaPositonを加えて回転させることも可能である。その場合はDeltaPositionで取得したx,yの値をそのまま使う。
// CameraController.cs // https://skeyll.hateblo.jp/entry/camera_rotate_TouchScript // // Created by Skeyll on 2019.06.20. using System; //EventHandlerに必要 using UnityEngine; using System.Collections; using TouchScript.Gestures.TransformGestures; //ScreenTransformGestureに必要 using TouchScript.Gestures.TransformGestures.Base; //DealtaPositionに必要 public class CameraController : MonoBehaviour { [SerializeField] ScreenTransformGesture transformGesture; //回転させるオブジェクト。 [SerializeField] Transform controlObject; //タッチ入力分だけしか回転させないなら必要ない。 float rotateSpeed = 20.0f; //カメラの回転に制限をつけないなら必要がない。 //この場合は左右110度までしか回転せず、方向転換はできない。 [SerializeField] float limitRotateX = 110.0f, limitRotateY = 90.0f; float startRotateX, startRotateY; void Start() { startRotateX = controlObject.transform.rotation.eulerAngles.x; startRotateY = controlObject.transform.rotation.eulerAngles.y; } void OnEnable() { transformGesture.Transformed += OnRotating; } void OnDisable() { transformGesture.Transformed -= OnRotating; } void OnRotating(object sender, EventArgs e) { Vector3 deltaPos = transformGesture.DeltaPosition; float rotateX = deltaPos.x * rotateSpeed; float rotateY = deltaPos.y * rotateSpeed; //transform.eulerAnglesに直接座標を指定してるのでここがなければ常にdeltaの座標を向くようになる。 startRotateX = startRotateX + rotateY; startRotateY = startRotateY + rotateX; controlObject.transform.eulerAngles = new Vector3(Mathf.Clamp(-startRotateX, -limitRotateX, limitRotateX), Mathf.Clamp(startRotateY, -limitRotateY, limitRotateY), 0); } }
3.回転させるオブジェクトにスクリプトをアタッチ
LayerとGestureをつけたオブジェクトにCameraControllerをアタッチする。その後、CameraControllerにインスペクタ上からGestueと回転させるオブジェクトを入れる。カメラを回転させる場合は以上で回転させられる。もし回転させる対象をプレイヤーなどのオブジェクトにした場合は、カメラをそのオブジェクトの子に設定し、オブジェクトの回転にカメラを追従させる必要がある。
もし、移動パネルなどを作りそのパネル上でスライドした移動量でカメラを回転させたい場合はTransformGestureで1ー3と同様のことをする。その場合は新たにFullScreenLayerをアタッチする必要はない。
参考
ScreenTransformGesture Class
http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_ScreenTransformGesture.htm
UnityEngine.Transform - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2018.2/ScriptReference/Transform.html
C# - Unityで回転制限をつけたいです。|teratail
https://teratail.com/questions/83342