【Unityバージョン:2017.3】
気が付けば松が取れてもう連休明けから仕事始まっちゃうよ。
とりあえず前にいじってたゲームパッドの扱いに関して。
Unityデフォルトだとやっぱりゲームパッドを複数扱うようにしたときがつらい感じだったので、Gamepad Inputを入れる。
これを前に入れたInputEventHandlerでも使えるようにしたかったのだが、イベントの引数として渡すときにボタンの種類に加えてどのゲームパッドから入力されたかを区別する必要があった。
前に導入したのはDictionaryでボタンの名前をKeyCodeに紐づける方法。
いまはGamepad Inputを入れたので、ボタンは生のKeyCodeではなく、Gamepad Inputで独自実装されているGamepadInput.GamePad.{Button|Axis|Trigger}というenumに定義された名前で飛んでくる。
たとえばボタン0を押すとGamepadInput.GamePad.Button.Aが押されたという具合で入力を取得できる。
ただしゲームパッドの番号はGamepadInput.GamePad.Indexと分けて管理されているため、KeyCodeならKeyCode.Joystick1Button0などとリニアに並んだKeyCodeを打てばゲームパッド1番のボタン0などと取れたところが取れなくなっている。
...というところでIndexと{Button|Axis|Trigger}を組にしてイベントの引数として渡す必要が生じ、したがってTupleが必要になった。
ところでUnityでC#、といえば出てくるのがMono。
Mono (software) - Wikipedia
(Monoのバージョンと.NETバージョンとの対応表は英語版Wikipediaには載っているが日本語版Wikiには載っていない...)
UnityにおけるMonoと.NETの違いが微妙だったので、こちらも参考にした。
Unity で生成する Windows アプリの中身とデバッグ
UnityのMonoやC#のバージョン - Qitta
monoの実行ファイルを直接叩いてバージョンを確かめることもできるようだ。
Unityに搭載されているMonoのバージョンに依存してUnityで使えるC#が長らくC#4相当のそれだったのでTupleを使いたいときは自分で実装してみたり、
Tuple implementation for use with Unity3d - gist
あるいはUniRx.Tupleを使うという手段をとることになっていたが、Unity5.5から.NET 4.6は使えるようになっていたようで、
【Unity】.NET 4.6、C# 6対応のUnityエディタ、ベータ版が公開
2017.3では、Unityエディターで、Edit > Project Settings > Playerから、各プラットフォームのOther SettingsのConfigurationから使う.NETのバージョンを変えられる。
C#6.0時代のUnity - Qiita
これでIndexと{Button|Axis|Trigger}を組にしたTupleをGamePadクラスに突っ込んでおき、イベントに渡すようにした。
Enumを数値に、あるいはその逆、またあるいはあるEnumの中にある名前を取ってくる方法の確認。
Enumメモ - Qiita
Enum.GetValuesという便利なのがある。
KeyCodeからTupleを引数に取るようにゲームパッドの入力イベントハンドラをいじるとき、delegate周りをいろいろいじることになったので、もう一度delegateとは、FuncとかActionとはってとこも確認。
デリゲートとは【C#】
Unityでゲームオブジェクトやコンポーネントのメソッドを呼び出す方法色々
これでようやく1コンと2コンがわかりやすく分かれた状態ができた。
次に2コンを自動制御にして、イベントを発火させて1人用の基礎を作る。
となるとタイマーが必要。
Unityでタイマーを使う - Qiita
とりあえず写経して、タイマーをボールを打ち出す装備を持たせたキャラで、COM持ちの制御にしたところに入れ込む。
3秒に一度勝手にボールを打ち出す何かしらができた。
以上。