【Unity DOTS】 RivalをInputSystemに対応させたい。

# お久しぶりです。
あけましておめでとうございます。雑記久々にやります。誤情報注意報
## 自己紹介
Unityを適当にたしなむ大学生です。
# Rivalとは
Unity公式が配布してるUnity DOTS用キャラクターコントローラーです。なぜか旧Input Managerを使ってるのであれが嫌いな私はInput Systemに変えたいということです。
~~[GitHub](https://github.com/Unity-Technologies/rival-documentation)で配布されてます。~~
公式パッケージになりましたPackage Managerから`com.unity.charactercontroller`でインストールできます。（2023/4/17更新）
## 実際に使う
[これ](https://github.com/Unity-Technologies/rival-documentation/blob/master/tutorial.md)読めばいけます。
# Input Systemを適用していく！！
## 環境
Unity 2022.2.1f1
Entites 1.0.0-pre.15
Input System 1.4.4
Rival 1.0.0-pre.15.1
## 準備
Input Systemの使い方は省略しますが、C#のスクリプトを生成する必要があるので、そこだけ紹介。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083521/a64676ea-eddc-073d-a6f7-41fb97aea17e.png)
Input Action Assetの`Generate C# Class`にチェック入れるだけです。
## コードを書く！
Rivalのチュートリアルをやっていくとキャラクターを動かせる段階まできます。そうすると`ThirdPersonPlayerSystem.cs`もしくは`FirstPersonPlayerSystem.cs`が生成されます。
その中身をちょろっと変えるだけです。
### フィールド
```C#
    private GuardAndStealActions actions;
    private InputAction playerMovementAction;
    private InputAction playerLookAction;
    private InputAction playerJumpAction;
```
フィールドを作ります。`GuardAndStealActions`というクラスは先ほど生成したInput Action Assetのクラスです。
### OnCreate
```C#
    protected override void OnCreate()
    {
        //ここから改変ポイント
        //アクションの初期化
        actions = new();
        actions.Enable();
        playerMovementAction = actions.Player.Move;
        playerLookAction = actions.Player.Look;
        playerJumpAction = actions.Player.Jump;
        //ここまで

        RequireForUpdate<FixedTickSystem.Singleton>();
        RequireForUpdate(SystemAPI.QueryBuilder().WithAll<ThirdPersonPlayer, ThirdPersonPlayerInputs>().Build());
    }
```
ここはInputActionsの初期化を行うだけですね。
#### TIPS
2022.2からC#の新しいバージョンに対応して、インスタンス化の時に
```C#
クラス名 変数名 = new();
```
で型推論してくれて初期化できるようになってます。Dictionaryとかジェネリクス系を使うときはめちゃめちゃ便利なので使ってみてください
### OnDestroy
```C#
    protected override void OnDestroy()
    {
        //アクションの停止
        actions.Disable();
        actions.Dispose();
    }
```
もともとOnDestroyは定義されてないのでここは普通に全部オリジナルです。
### OnUpdate
```C#
    protected override void OnUpdate()
    {
        uint fixedTick = SystemAPI.GetSingleton<FixedTickSystem.Singleton>().Tick;

        foreach (var (playerInputs, player) in SystemAPI.Query<RefRW<ThirdPersonPlayerInputs>, ThirdPersonPlayer>())
        {
            //ここからオリジナル
            playerInputs.ValueRW.MoveInput = playerMovementAction.ReadValue<Vector2>();
            playerInputs.ValueRW.CameraLookInput = playerLookAction.ReadValue<Vector2>();
            playerInputs.ValueRW.CameraZoomInput = 0.0f;
            //ここまで
            
            // For button presses that need to be queried during fixed update, use the "FixedInputEvent" helper struct.
            // This is part of a strategy for proper handling of button press events that are consumed during the fixed update group
            //条件式だけオリジナル
            if (playerJumpAction.ReadValue<float>() > 0)
            {
                playerInputs.ValueRW.JumpPressed.Set(fixedTick);
            }
        }
    }
```
はい。以上です。いたって簡単。特に説明することもないですね。

# 感想
5分ぐらいでInputSystemに変更できました。Rivalが良くできている証拠だと思います。昨日Rivalを発見したばっかりなので全く触ってないですが、DOTSを使ったキャラクターコントローラーは凄く自作難易度が高いと思うのでこのライブラリ神です。
自作難易度高い件については[前の記事](https://qiita.com/AtsuAtsu0120/items/0fe64168091aa68d6b03)を見てもらったらわかるかもしれません。
また、Rivalについては触れます。ではまたいつの日か…