simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:InputSystemのInputActionsによるカメラ操作

ゲームパッドの左スティックでカメラの移動
右スティックでカメラのパン・チルト調整を行うように実装してみました。

次のクラスを Camera にアタッチすると機能します。

TPSCameraBehaviour.cs

using UnityEngine;
using UnityEngine.Experimental.Input;

[RequireComponent(typeof(Camera))]
public class TPSCameraBehaviour : MonoBehaviour, ICameraActions
{
    [SerializeField]
    TPSCameraInput cameraInput;

    void Awake()
    {
        cameraInput.Camera.SetCallbacks(this);
    }

    void Start()
    {
        _camera = GetComponent<Camera>();
    }

    void Update()
    {
        var nextEuler = _camera.transform.eulerAngles;
        nextEuler += _cameraRotateEuler;
        _camera.transform.eulerAngles = nextEuler;
        _camera.transform.LookAt(_camera.transform.forward + _camera.transform.position);
        _camera.transform.position += _cameraVelocity;
    }

    void OnEnable()
    {
        cameraInput.Enable();
    }

    void OnDisable()
    {
        cameraInput.Disable();
    }

    public void OnLeftStick(InputAction.CallbackContext context)
    {
        var value = context.ReadValue<Vector2>() * 0.1f;
        _cameraVelocity = _camera.transform.right * value.x;
        _cameraVelocity += _camera.transform.forward * value.y;
    }

    public void OnRightStick(InputAction.CallbackContext context)
    {
        var value = context.ReadValue<Vector2>();
        _cameraRotateEuler.y = value.x;
        _cameraRotateEuler.x = -value.y;
        _cameraRotateEuler.z = 0;
    }

    public void OnLeftClick(InputAction.CallbackContext context)
    {
        Ray ray = _camera.ScreenPointToRay(_mousePosition);
        // GameManager.Instance.SetAgentDestination(ray);
    }

    public void OnMousePosition(InputAction.CallbackContext context)
    {
        _mousePosition = context.ReadValue<Vector2>();
    }

    Camera _camera;
    Vector3 _cameraVelocity = Vector3.zero;
    Vector3 _cameraRotateEuler = Vector3.zero;
    Vector2 _mousePosition = Vector2.zero;
}

上記で登場する TPSCameraInput ・ ICameraActions クラスは自動生成されたものです。
Assets > Create > InputActions で TPSCameraInput という名前で InputActions を作成すると作られます。
内部の ActionMaps に Camera を追加すると ICameraActions クラスが作られます。

f:id:simplestar_tech:20190112185357j:plain
Create>InputActions で TPSCameraInput を作成・編集した様子

参考にした記事

tsubakit1.hateblo.jp