TopDownEngineサンプルの照準を右スティックとマウスで両立(3)

前回Unity で見下ろし型ゲームを作るアセット TopDown Engineサンプルゲーム Koala Dungeon で銃の攻撃方向をマウスと右スティックで両立する試みとして Unity の InputManager仮想の同じ入力名をマウスと右スティックから受けるように多重に設定し、どちらからでも操作できることを確認しました。

TopDownEngine のサンプルで右スティックとマウスでのAIMの両立を InputManager の同一入力名設定で実装

TopDownEngine のサンプルで右スティックとマウスでのAIMの両立を InputManager の同一入力名設定で実装

これでマウスと右スティックによる AIM の両立が実現したと喜びたいのですが、影響範囲が大きすぎる気がします。
できたら、Aim の処理に特化してカスタマイズしたいので、前々回に調べていた WeaponAim コンポーネント(AimControl は Script を設定)他のコンポーネント (WeaponAutoAim など) から制御する方法で実現できないか改めて調べようと思います。
※ Unity は 2021.3.14f1、TopDown Engine は 3.1.1 です。主人公のキャラクター画像はぴぽや倉庫様のキャラクターチップを使っています。

マウスと右スティック両立のための WeaponAim への操作内容

いろいろと試行錯誤した結果、一番シンプルな結論に至りました。

  • WeaponAim.AimControl を最新の入力に応じて切り替える

これだけです。

AimControl 変数はどこの入力を Aim 操作に対応させるかといった選択肢です。

WeaponAim2Dコンポーネントの AimControl の選択を切り替えます。

WeaponAim2Dコンポーネントの AimControl

AimControl に Mouse を指定すれば、マウスポインタの位置が照準になります。
AimControl に SecondaryMovement を指定すれば、右スティックの傾いている方向に攻撃します。
参照:Weapons | TopDown Engine Documentation

最初は、WeaponAim2D.cs, WeaponAutoAim2D.cs を参考に、 WeaponAim の Aim 位置を独自プログラムで更新するつもりでしたが、処理が複雑で理解できないことも多くとん挫しかけました。
そんなときに、 AimControlpublic メンバ変数であり、外部から切り替えられる仕様であることに気づき、それを切り替えるだけにしました。

そのあとは WeaponAim 派生のコンポーネントがその都度指定された AimControl の入力に応じて Aim やレチクル(照準マーク)などを制御してくれます。

ソースコード

ソースコードは github に公開しています。

TopDownEngineExtension/SCMMWeaponAimMouthAndSecondaryMovement.cs at main · sakura-crowd/TopDownEngineExtension

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

SCMMWeaponAimMouthAndSecondaryMovement スクリプトの追加先の例

SCMMWeaponAimMouthAndSecondaryMovement スクリプトの追加先の例

武器プレハブの探し方は「!過去の記事のリンク」を参考にして下さい。
サンプルのほとんどの武器のプレハブは、 TopDownEngine/Demos/XXX/Prefabs/Weapons 内にあります。

テストプレイ

SCMMWeaponAimMouthAndSecondaryMovement.cs を、Add Component ボタンやドラッグ&ドロップで、武器プレハブに追加したら、右スティックとマウスのどちらからも Aim 操作ができるか確認します。

前回(!リンク)追加した UnityInput Managerマウスからの入力を受ける SecondaryHorizontalSecondaryVertical はその項目の上で右クリックのポップアップメニュー [Delete Array Element]削除してから確認を行います。
入力の設定の個数 Size が、TopDown Engine をインポートした直後の 116 に戻っていることを確認してください。

Unity InputManager で設定数が 116 であることを確認します。消す場合はポップアップメニュー Delete Array Element を選択します。

Unity InputManager で設定数が 116 であることを確認します。消す場合はポップアップメニュー Delete Array Element を選択します。

スクリプトの追加、 InputManger の設定数の確認が済んだら、再生ボタンテストします。
GIF 動画の右下独自スクリプト SCMMWeaponAimMouthAndSecondaryMovement.cs が追加されています。
右スティックで銃の向きを変えられ、その後、マウスを動かすとそちらで照準を移動できました。
さらにマウスの照準が近くにある状態で、再び右スティックで銃の向きを変更できました。
※独自スクリプトのコンポーネントを外すと、 AimControl は SecondaryMovement に固定され、マウスによる照準の移動が行われないことも確認できます。

独自スクリプト(右下)が有効な場合、右スティックとマウス両方でAIM操作できました。

独自スクリプト(右下)が有効な場合、右スティックとマウス両方でAIM操作できました。

今回は、TopDown Engine のスクリプトの勉強になりましたが、かなり労力がかかり、結果的に 3 日程度たって思いついたシンプルなアイデアがうまくいってほっとしています。
これからも無理せず調べながら作りたいゲームにアレンジしていきます。

参照サイト Thank You!

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました