Unityに関連する記事です

 引き続き、障害物について設計と実装を行います。

 障害物の視界機能について、2回に分けて実装を行います。

 今回の設計では障害物の視界の設定を行い、次の手順では、視界内にプレイヤーを感知した際の処理について実装します。


<実装動画>
動画ファイルへのリンク


 青い半透明の扇型の部分が障害物の視界になります。




<新しく学習する内容>
 ・OnDrawGizmos メソッドと OnDrawGizmos メソッド内で利用できるメソッド



設計


 障害物に視界の情報を与えて、この範囲内にプレイヤーが侵入したときだけ、追いかけたりするようにします。

 コライダー全体を視界としてもよいですが、その場合、通常は見えない後方まで視界として認識してしまうため、
コライダーのうち、障害物の前方に扇形をイメージし、その範囲内のみを視界として利用するようにすることで、より人間的な視界として機能させます。


視界となるサーチ範囲用のゲームオブジェクトを作成する


 障害物のゲームオブジェクトの子オブジェクトとして、視界用のゲームオブジェクトを作成します。
新しく Sphere ゲームオブジェクトを作成し、そのコライダーの範囲の一部を視界として判定に利用する設計です。

 MeshRenderer コンポーネントは不要ですので、スイッチを切るか、リムーブしてください。

 コライダーのサイズは任意です。


ヒエラルキー画像



Scene ビュー画像



インスペクター画像



SearchPlayer スクリプトを作成する


 UniRX の Triggers では OnTriggerEnter メソッドなどのコールバックメソッドを非同期処理として実装することが出来ます。
今回は学習のため、そちらの方式で記述しています。

 ReactiveProperty である IsSearch の情報は、後程 MovingObstacle スクリプトの方で購読し、値の変化を利用します。

 今回の実装では、コライダーの全範囲を視界とはせず、コライダー内の指定した角度を視界として利用します

 こちらの記事を参考に作成しています。ありがとうございます。
かめくめ 様
Unityで敵が主人公を検知する範囲を視覚内に限定する
https://gametukurikata.com/program/onlyforwardsear...


SearchPlayer.cs

<= クリックすると開きます



<OnDrawGizmos メソッドと OnDrawGizmos メソッド内で利用できるメソッド>


 コライダーの範囲を可視化する場合には、OnDrawGizmos メソッドと Handles クラスにあるメソッドを利用すると便利です。
OnDrawGizmos メソッドは、MonoBehaviour クラスを継承していれば利用できますが、
Handles クラスを利用するためには、 using UnityEditor の宣言が必要になります。

 Handles クラスにあるメソッドは、専用の OnDrawGizmos メソッド内に記述しないとエラーが発生します。
OnDrawGizmos メソッドはコールバック・メソッドですので、コライダーがある限り、自動的にこのメソッドの処理が実行されます。

#if UNITY_EDITOR
  // Scene ビューに視界範囲を可視化
    private void OnDrawGizmos() {

    // using UnityEditor 用のクラス。色の設定。アルファを下げて透明度を上げている
        Handles.color = new Color(0, 0, 1, 0.3f);

    // 扇形を作成し、視界範囲の情報を可視化
        Handles.DrawSolidArc(transform.position, Vector3.up, Quaternion.Euler(0f, -searchAngle, 0f) * transform.forward, searchAngle * 2.0f, searchArea.radius);
    }
#endif

参考サイト
Unity公式スクリプトリファレンス
MonoBehaviour.OnDrawGizmos
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
Handles
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
Handles-color
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
Handles.DrawSolidArc
https://docs.unity3d.com/ja/current/ScriptReferenc...


サーチ範囲用のゲームオブジェクトに SearchPlayer スクリプトをアタッチする


 SearchPlayer スクリプトをドラッグアンドドロップしてアタッチし、設定を行います。

 SearchArea 変数には、サーチ範囲用のゲームオブジェクトの SphereCollider コンポーネントをドラッグアンドドロップしてアサインしてください。

 SearchAngles 変数には、0 〜 360 度の中で、任意の値を設定してください。それが視界の角度として利用されます。


インスペクター画像



 Scene ビューを確認してください。OnDrawGizmos メソッドにより、コライダー内のうちで、障害物の視界として設定されている範囲が可視化されます。
これは searchAngele 変数をインスペクターで変更することで、動的に変化しますので、角度は任意の角度に調整してください。
障害物によって変化させてもよいでしょう。


Scene ビュー画像



 以上で設定は完了です。


PlayerController スクリプトを作成する


 PlayerController スクリプトを作成するか、OVRPlayerController ゲームオブジェクトにアタッチされているスクリプトに処理を追記します。


PlayerController.cs

 <= クリックすると開きます

 
 作成したら、任意のゲームオブジェクトにアタッチします。
OVRPlayerController ゲームオブジェクトでもよいですが、仮のゲームオブジェクトを作成してアタッチしてデバッグを行ってもいいです。


ゲームを実行して動作を確認する


 いままでと同じように、障害物を移動させてみてください。
視界が障害物の向きに合わせて変わっていることが分かると思います。

 まだプレイヤーを見つけた際の処理はすべて完成していませんので、
現時点では、Console ビューにプレイヤー発見の文字が出れば制御成功です。


<実装動画>
動画ファイルへのリンク





 以上でこの手順は終了です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます