はじめに
前回からの続きで、TANKSNETアセットプロジェクトの中で、戦艦大和を自在に操作することを実現すべく努力しましたが、ちょっと引っかかっていました。結果、ようやくできるようになったのでしょうもない内容なのだけどここで整理しておきます。
キー操作で戦艦を操作する仕組みの探索
アプローチ方法
戦車プレファブを戦艦大和プレファブに変えていますが、mac上だとキー操作で前後動作(“w”,”s”キー)と回転動作(”a”,”d”キー)ができます。この動作が軽い戦車ゲームの動作なのでこれを自分色に変える必要がありますが、プロジェクト内のどのスクリプトで実現しているのかを探さなければなりません。
トップダウンでプロジェクト構成を説明したドキュメントがありませんので、結果としてまるで考古学のように、複数年代の発掘品が混在して存在する遺跡から、発掘品の断片をひとつひとつジグソーパズルのように組み合わせながら全体のシステム構成を見出していく作業のようです。
TANKSNETアセットにはものすごく多数(200を超える)のスクリプトが存在します。そして内容を見ていくと継承されたクラスが多数存在します。いろいろなケースを想定しての基本アプローチなのだろうけど、ちょっと自分のレベルを遥かに超えていて難しすぎます。
戦車のキー操作スクリプトの場所
戦車(戦艦大和プレファブ)の操作はiPhone/Androidではタッチ操作。macでの操作ではキー+マウス操作となっています。その実現は下記のinstructionswapでされているのでしょう。そしてまずはキー操作(含マウス)を実行しているスクリプトを見つける必要があります。
戦艦大和プレファブには多くのスクリプトがアタッチされていますが、下のほうにTankKeyboardinputというスクリプトがあります。同列にTankTouchiInputというのも存在しますので、実行場所によってこのどちらかを選択して動作していると推測されます。
TankKeyboardInputスクリプトの中身
これを見るとマウス操作は書いてあるのだけど、キーボードの”w”,”s”,”a”,”d”キーの状態をgetするコードがありません。Input.GetKey(keycode.w)とかを想定しています(結果的には実はこれが間違いだったのですけど)。
TankKeybordInputクラスはTankInputクラスを継承していました。そしてvertical, override, abstract等が登場してきます。まああまり理解できていませんが、とにかく元クラスだろうが何だろうがキー入力処理を行っているスクリプトを探し続けます。それでも見つかりません。
更なるキー入力処理の探索
いちばんありそうな場所にキーボードの”w”,”s”,”a”,”d”キーの状態を入力する処理がありませんので、他の場所の探索を始めます。
まあかなり多くの場所を探索しましたが、どこにもありません。やっぱりTankKeyboardInputクラスしかないのだろうなという確信が持てるまで多大な時間を浪費しました。ワールドカップ再放送見ながらですけど。
キー入力処理の発見
結果的にキー入力処理の場所を見つけました。見つけられなかったのは自分が無知だっただけです。UnityではInput.GetAxisRawという便利な入力処理があるのですね。目の前にあった意味不明のコードが戦艦大和を動かしていた処理だったのです。
float y = Input.GetAxisRaw(“Vertical”); // y位置の入力
float x = Input.GetAxisRaw(“Horizontal”); // x位置の入力
ここでVertical, Horizontalとう文字列が設定されていますが、この設定はUnityのメニューの、Edit->ProjectSettings->Inputを選択するとInspectorに下記画像のようにInputManagerが表示されます。この中でどのキーが何の属性に割り当てているのかが決められていたのですよ。知らんかった。最初からちゃんと知っていたら便利なキーだったのだろうなと感じます。まあそれはともかく、キー入力を扱うスクリプトがわかりました。mac用にはTankKeyboardInputクラスです。iPhone/Androidでのタッチ入力はTankTouchInputクラスでしょう。場所さえわかればどう扱うかは簡単です。最終的なアプリ制御を考えてから実際に戦艦大和を自在に動かすためのスクリプトを追加していきます。
しかし、この探索は疲れました。それでもNetwork関連の処理に関してはまるでわかっていませんからね。
戦艦操作系の構築
どこをどういじると何が変わるのかは見えたのですが、戦車と異なっていて、戦艦自体の速度パラメータを自分で保持していたいのです。現状はアクセルを停めると即停止。ですが、その速度情報をどこに持たせると後々までうまく整合を取って創ることができるのかはちょっと調べる必要があります。なのでちょっとこの動作創りこみは現状プロジェクト構成調査の後で行うことにします。
ということで本日はここで検討作業放棄です。すみません..
さいごに
ちょっとポーランド戦を控えていて、かつメンバーを大変更の情報とか見ていて自分として浮足立っています。なのでまあ今日はここまでとさせて頂きます。キリンビールを買って応援しなければなりませんしね。
でもひとつ壁を突破できました。良い方向に整理できたらここでまた報告させて頂きます。
以上
参考:元となる戦艦大和アプリです。