前回は Unity で見下ろし型ゲームを作るアセット TopDown Engine のサンプルゲーム Koala Dungeon で銃の攻撃方向をマウスと右スティックで両立する試みとして Unity の InputManager で仮想の同じ入力名をマウスと右スティックから受けるように多重に設定し、どちらからでも操作できることを確認しました。
これでマウスと右スティックによる AIM の両立が実現したと喜びたいのですが、影響範囲が大きすぎる気がします。
できたら、Aim の処理に特化してカスタマイズしたいので、前々回に調べていた WeaponAim コンポーネント(AimControl は Script を設定)を他のコンポーネント (WeaponAutoAim など) から制御する方法で実現できないか改めて調べようと思います。
※ Unity は 2021.3.14f1、TopDown Engine は 3.1.1 です。主人公のキャラクター画像はぴぽや倉庫様のキャラクターチップを使っています。
マウスと右スティック両立のための WeaponAim への操作内容
いろいろと試行錯誤した結果、一番シンプルな結論に至りました。
- WeaponAim.AimControl を最新の入力に応じて切り替える
これだけです。
AimControl 変数はどこの入力を Aim 操作に対応させるかといった選択肢です。
AimControl に Mouse を指定すれば、マウスポインタの位置が照準になります。
AimControl に SecondaryMovement を指定すれば、右スティックの傾いている方向に攻撃します。
参照:Weapons | TopDown Engine Documentation
最初は、WeaponAim2D.cs, WeaponAutoAim2D.cs を参考に、 WeaponAim の Aim 位置を独自プログラムで更新するつもりでしたが、処理が複雑で理解できないことも多くとん挫しかけました。
そんなときに、 AimControl は public メンバ変数であり、外部から切り替えられる仕様であることに気づき、それを切り替えるだけにしました。
そのあとは WeaponAim 派生のコンポーネントがその都度指定された AimControl の入力に応じて Aim やレチクル(照準マーク)などを制御してくれます。
ソースコード
ソースコードは github に公開しています。
Start イベント関数では、操作対象の WeaponAim コンポーネントや、入力を検知するための InputManager に紐づいた Weapon コンポーネントを取得し、メンバー変数に保持しています。
Update イベント関数では、マウス・右スティックの入力の有無を確認し、入力のあった方を WeaponAim.AimControl に割り当てます。
マウスの入力が検知されれば AimControl = Mouse に設定し、右スティックの入力が検知されれば AimControl = SecondaryMovement に設定します。
これを Update イベント関数が呼ばれるたびに行います。
そのあとは、先ほど話した通り、現在の AimControl に応じた入力を受けて WeaponAim 派生コンポーネントが AIM 操作をしてくれます。
マウスの入力の有無の判定
Update イベント関数が呼ばれるたびに、マウスの現在位置を直前の位置と比較します。
もしも位置が変わっていたら入力がされたと判断しています。
そのために直前の位置をメンバ変数で保持し、比較の後に更新しています。
右スティックの入力の有無の判定
マウスと同じく Update イベント関数が呼ばれるたびに確認します。
右スティックの入力判定は遊びの範囲を超えた入力がその瞬間にあるかどうかで判定します。
スクリプトの使い方
前述の github に公開しているスクリプト SCMMWeaponAimMouthAndSecondaryMovement.cs は、 WeaponAim コンポーネントを持つ武器のプレハブに追加するだけで動作します。
前提条件は WeaponAim 派生コンポーネントと Weapon 派生コンポーネントを持つゲームオブジェクトに追加することです。
TopDown Engine の武器のプレハブは Weapon 派生コンポーネントを付加する前提なので、サンプルならば全てに適用できます。
参照:Weapons | TopDown Engine Documentation
武器プレハブの探し方は「!過去の記事のリンク」を参考にして下さい。
サンプルのほとんどの武器のプレハブは、 TopDownEngine/Demos/XXX/Prefabs/Weapons 内にあります。
テストプレイ
SCMMWeaponAimMouthAndSecondaryMovement.cs を、Add Component ボタンやドラッグ&ドロップで、武器プレハブに追加したら、右スティックとマウスのどちらからも Aim 操作ができるか確認します。
前回(!リンク)追加した Unity の Input Manager のマウスからの入力を受ける SecondaryHorizontal と SecondaryVertical はその項目の上で右クリックのポップアップメニュー [Delete Array Element] で削除してから確認を行います。
入力の設定の個数 Size が、TopDown Engine をインポートした直後の 116 に戻っていることを確認してください。
スクリプトの追加、 InputManger の設定数の確認が済んだら、再生ボタンでテストします。
GIF 動画の右下に独自スクリプト SCMMWeaponAimMouthAndSecondaryMovement.cs が追加されています。
右スティックで銃の向きを変えられ、その後、マウスを動かすとそちらで照準を移動できました。
さらにマウスの照準が近くにある状態で、再び右スティックで銃の向きを変更できました。
※独自スクリプトのコンポーネントを外すと、 AimControl は SecondaryMovement に固定され、マウスによる照準の移動が行われないことも確認できます。
今回は、TopDown Engine のスクリプトの勉強になりましたが、かなり労力がかかり、結果的に 3 日程度たって思いついたシンプルなアイデアがうまくいってほっとしています。
これからも無理せず調べながら作りたいゲームにアレンジしていきます。
コメント