InputSystemでマウス右を押した状態での移動量を取得する方法

InputSystem

マウスでsubstance painterやblenderみたいなカメラ操作をしたかったです。それを実現するためにマウスのボタンを押した状態での移動量を取得する必要があります。

CustomComposite

InputSystemではCustom Compositeで自作するだけで実現できます。

そしてそのサンプルはPackageManager InputSystemからimportできます!!!

#if UNITY_EDITOR
    [InitializeOnLoad] // Automatically register in editor.
#endif
   
    [DisplayStringFormat("{firstPart}+{secondPart}")]
    public class Vector2WithOneModifier : InputBindingComposite<Vector2>
    {
        
        [InputControl(layout = "Button")]
        public int modifier;

        [InputControl(layout = "Vector2")]
        public int vector;

       
        public override Vector2 ReadValue(ref InputBindingCompositeContext context)
        {
            if (context.ReadValueAsButton(modifier))
            {
                return context.ReadValue<Vector2, Vector2MagnitudeComparer>(vector);
            }
            return default;
        }

       
        static Vector2WithOneModifier()
        {
           
            InputSystem.RegisterBindingComposite<Vector2WithOneModifier>();
        }

        [RuntimeInitializeOnLoadMethod]
        static void Init() { } // Trigger static constructor.
    }

サンプルを改造してこんな感じに実装しました。これで何かのボタンを押したときのみVector2量を返すようなcompositeができました。(別にマウスボタンに限定されず、パッドのAボタンでも構わないのです

InputSystemで使ってみる

InputSystem側では、こんな感じ。

マウス右ボタン押してるときのマウス移動量をカメラの回転(CameraRotate)に結び付けてます。

上記例だと、ゲームパッドの右スティックもCameraRotateに結び付けてます。

マウスとゲームパッドの戻り値の差を合わせたい

ちなみにゲームパッドとマウスだと返す値の最大値に差があるのでは?と思うところでしょう。実際差があります。

そこで返すVector2値に適当に補正してやります。それがProcessorの一つであるScaleVector2。掛け算してくれます。Processorも自作できるんで複雑な関数にしたければ自作するのがよいでしょう。

C#でVector2取得

    public class InputFromInputSystem : IInputWrapper
    {
        private PlayerInput _input = null;
        private InputAction _action;

        public InputFromInputSystem(PlayerInput input)
        {
            _input = input;
            _action = _input.actions["CameraRotate"];
        }


        public Vector2 GetVector2()
        {
            return _action.ReadValue<Vector2>();
        }
    }

ゲーム中ではこんな感じでInputSystemをさらに抽象化して使ってます。