InputSystemで入力を取得(Entity Component System)

InputSystemで入力を取得(Entity Component System)

キー入力(WASDキー)をInputSystemから取得してCubeを動かします。

Script

Component

Cubeの移動速度を決めるComponentです。

取得したキー入力を渡すためのComponentです。

以上のComponentを追加したEntityを作成します。

System

ISystemはマネージドなフィールドを持つことができません。よって、InputSystemを利用する際にはSystemBaseを使います。

取得した入力によりCubeを動かします。

Debug.Log

BurstCompileを利用する場合、文字列リテラル、string.Format及びfixed stirngを使用する必要があります。詳しくはUnity, 文字列のサポートを参照してください。

Systemの実行順

Systemの実行順序を適切に設定する必要があります。例えば、PlayerSystemが実行されてからPlayerInputSystemが動いた場合、PlayerSystemは入力を受け取れません。よって、PlayerInputSystemの後にPlayerSystemが実行されるようにしなければなりません。また、オブジェクトの移動等はTransformの更新を行うSystemの前に実行する必要があります。そのため、適切なタイミングでSystemが実行されるように属性を指定します。今回は以下のように設定しています。

PlayerInputSystem

InitializationSystemGroupはUpdateの前に実行されます。OrderLast = trueによりInitializationSystemGroupの最後に実行されるようになっています。

PlayerSystem

PlayerSystemはCubeの位置を変更します。よって、Transformに変更を加えるのでTransformSystemが更新される前に実行します。

Systemの確認方法

Window→Entities→Systemより開くとこができるWIndowによって実行されているSystemを確認することができます。それぞれのSystemが指定されたタイミングで実行されていることが確認できます。

InputSystem

InputSystemを用いてPlayerInputSystemで入力を受け取っています。InputSytemはPackageManagerからインストールする必要があります。インストール後はCreateメニューにInput Actionsが追加されます。そこから、Input Actionを作成します。作成したInput Actionをダブルクリックすることでエディターを開くことができます。このエディターで各種入力に関する設定を行います。今回はWASDキーに割り当てを行います。

ActionMapを追加し、名前をPlayerMapに変更します。

New actionの名前をPlayerMoveへ変更し、ActionTypeをValueと設定します。また、Bindingは不要なので削除します。

Add Up¥Down¥Left¥Right CompositeよりCompositeを追加します。

BindingのPathへ使用したいキーを割り当て、保存します。自動的にScriptが生成されるので、このScriptを用いてキー入力を受け取ります。

設定と実行結果

SubeSceneにCube(Player)を作成します。そのCubeへPlayerAuthoringを追加します。

実行するとWASDキーでCubeを動かすことができます。

参考ページ

Unity, 文字列のサポート

テラシュールブログ,【Unity】ECSのComponentSystem実行順をコントロールする

ねこじゃらシティ,【Unity】Input Systemの使い方入門

Turbo Makes Games, Data-Oriented Input in Unity ECS – DOTS + Input System 2023