Simple Camera Controller


3Dシーンで動いて確認したいときに、MainCameraにつけて動かすスクリプト。
InputSystemが標準になって、InputActionとの紐づけが必要になった。
  1. Main Camera オブジェクトに"Player Input"コンポーネントを追加。
  2. 新規アクションマップを作成し、"Player Input"コンポーネントのActionsに設定。

  3. Main Camera に下のC#スクリプトコンポーネントを追加。

//************************************
// Simple Player Camera Controller
//************************************

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerCameraController : MonoBehaviour
{
    private const string ACTION_MOVE = "Move";
    private const string ACTION_LOOK = "Look";
    //private const string ACTION_FIRE = "Fire";

    [SerializeField]
    float _moveSpeed = 3.0f;
    [SerializeField]
    float _lookSpeed = 10.0f;

    private PlayerInput _playerInput = null;
    private Vector2 _currentMoveInputValue = Vector2.zero;
    private Vector2 _currentLookInputValue = Vector2.zero;
    private Vector3 _previousRotation = Vector3.zero;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;

        if (TryGetComponent(out _playerInput))
        {
            _playerInput.actions[ACTION_MOVE].started += OnMove;
            _playerInput.actions[ACTION_MOVE].performed += OnMove;
            _playerInput.actions[ACTION_MOVE].canceled += OnMove;

            _playerInput.actions[ACTION_LOOK].started += OnLook;
            _playerInput.actions[ACTION_LOOK].performed += OnLook;
            _playerInput.actions[ACTION_LOOK].canceled += OnLook;
        }
    }

    void Update()
    {
        Look();
        Move();
    }

    private void Move()
    {
        var delta = new Vector3(_currentMoveInputValue.x, 0, _currentMoveInputValue.y);
        var moveForward = Quaternion.Euler(0, transform.eulerAngles.y, 0) *delta;
        transform.position += moveForward * _moveSpeed * Time.deltaTime;
    }
    private void Look()
    {
        _previousRotation.y += _currentLookInputValue.x * _lookSpeed * Time.deltaTime;
        _previousRotation.x -= _currentLookInputValue.y * _lookSpeed * Time.deltaTime;
        _previousRotation.x = Mathf.Clamp(_previousRotation.x, -89.0F, 89.0F);
        transform.localEulerAngles = _previousRotation;
    }

    public void OnMove(InputAction.CallbackContext context)
    {
        _currentMoveInputValue = context.ReadValue();
    }

    public void OnLook(InputAction.CallbackContext context)
    {
        _currentLookInputValue = context.ReadValue();
    }

    //public void OnFire()
    //{
    //    var ray = new Ray(transform.position, transform.forward);
    //    if (Physics.Raycast(ray, out var hit, 100))
    //    {
    //    }
    //}
}


return