Unityに関連する記事です

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

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

 今回は、視界内にプレイヤーを感知した際の処理について実装します。


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


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


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



<新しく学習する内容>
 ・UniTask.Delay メソッド
 ・NavMeshAgent に用意されている変数とメソッド



設計


 複数のスクリプトを修正して、視界に入ったプレイヤーを追いかけて、接触したら、ペナルティを与える機能を実装します。

 現在、障害物には視界の機能が備わっていますので、この部分の続きを作成します。

 SearchPlayer スクリプトでは、ReactiveProperty として IsSearch を準備してあります。
この値は、プレイヤーが視界内に侵入した際に true になり、視界外になって見失った際に false になります。

 この情報を MovingObstacle スクリプトで購読(監視)し、IsSearch の値に応じて、自動的に徘徊処理⇔追尾処理を相互に切り替えるようにします。

 障害物とプレイヤーとが接触したら、接触されたことを表示する処理を行います。今回この部分は未実装で、待機時間のみ用意しています。

 その後、GameSceneManager スクリプトに用意しておいたリスタート用のメソッドを実行することで、
プレイヤーの一時停止、キー入力停止、ペナルティを与える処理(残り時間減少、スタート地点へ戻す)、といった処理を暗転させている間に行います。

 よって、暗転用の処理も SceneStateManager スクリプトに新しくメソッドを作成して対応します。

 修正内容が多く、多岐に渡るため、処理のつながりをイメージし、ゆっくりと理解しながら実装を行ってください。


SceneStateManager スクリプトを修正する

 
 暗転用のフェード処理を、フェードインとフェードアウトに分けてメソッド化しておきます。
また、暗転にかかる時間も外部のクラスから取得できるようにゲッターメソッドを準備しておきます。


SceneStateManager.cs

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



GameSceneManager スクリプトを修正する


 UniRX を利用したケースでの修正方法を提示しておきます。

 PlayerController スクリプトの情報を登録しておき、障害物に接触された場合の処理をこのスクリプト内で一元管理します。
そのため、障害物用のスクリプトから実行してもらうためのメソッドを新しく作成しておきます。


GameSceneManager.cs

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



ObstacleState スクリプトを作成する


 障害物の現在の状態を管理するための enum を作成し、状態の種類を列挙子に登録しておきます。
こうすることにより、状態を排他的に管理出来る他、2つ以上の状態が同時に存在することを防ぐことが出来ます。

ObstacleState.cs

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



ObstacleBase スクリプトを修正する


 using に新しい宣言を3つ追加しています。

 Cysharp.Threading.Tasks は UniTask を利用する場合に必要になる宣言です。

 System.Threading は CancellationToken 構造体を利用する場合に必要になる宣言です。
await による非同期処理は、コルーチンとは異なりゲームオブジェクトの破棄に紐づいていません。
そのため、ゲームオブジェクトの破棄に合わせて、await の処理を停止させる処理を用意する必要があります。
CancellationToken 構造体はその際に利用される情報になります。

 System の宣言は、今回の場合、TimeSpan 構造体を利用するために利用しています。

 

ObstacleBase.cs

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



<UniTask.Delay メソッド>


 UniTask の持つメソッドの1つです。await させることで、指定した時間、処理を中断することが出来ます。

  // 3秒待機
  await UniTask.Delay(TimeSpan.FromSeconds(3), cancellationToken : cancellationToken);

  // 3秒待機(同じ処理)
  await UniTask.Delay(3000, cancellationToken : cancellationToken);

 第1引数はミリセコンドにて設定する必要がありますので、3000 = 3 秒の換算になります。

 この処理を行っている間にゲームオブジェクトが破棄されてしまうと、この中断処理は終了せずに残ってしまい、メモリリークを引き起こすため、
CancellationToken を指定しておくことで、ゲームオブジェクトの破棄に合わせて、この Delay 処理も一緒に停止してくれるようになります。


MovingObstacle スクリプトを修正する


 NavMeshAgent コンポーネントを利用した際の処理をベースに修正を行います。

 using の宣言や、クラスの継承部分などに注意しながら記述してください。
どのような処理を実装しているのかを理解しながら学習することで、自分でスクリプトを作成する際に役立ちます。

 主な処理としては、新しく SearchPlayer スクリプトにある ReactiveProperty の IsSearch を購読する処理を追加しています。
この値の変化に応じて、障害物のステートを徘徊→追尾、追尾→待機→徘徊に自動的に切り替えます。

 言葉にすると簡単ですが、実際には新しく6つのメソッドを作成して、連動させています。
そのため、ここに実装する処理が一番複雑かつ、重要な処理になります。

 処理をイメージしつつ、実装を行うようにしてください。


MovingObstacle.cs

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



<NavMeshAgent に用意されている変数とメソッド◆


 NavMeshAgent クラスには多くの変数とメソッドが用意されています。
この機能を上手く活用することにより、AI による NavMeshAgent のルートの自動移動を実装することができます。

 NavMeshAgent 型をスクリプト内で宣言し、各変数やメソッドを利用するためには using UnityEngine.AI; の宣言が必要です。

1.NavMeshAgent.remainingDistance 変数

 NavMeshAgent によって動いているゲームオブジェクトと目標地点までの、残りの距離を測定している float 型の変数です。
この情報を参照することで、NavMeshAgent が目的地に対して、後どのくらいの距離がのこっているかを確認することができます。
 
 計算式とすれば、「NavMeshAgent のゲームオブジェクトの位置 マイナス 目標地点の位置」の値となります(差分値)。

<参考サイト>
Unity 公式スクリプトリファレンス
NavMeshAgent.remainingDistance
https://docs.unity3d.com/jp/current/ScriptReferenc...


2.NavMeshAgent.ResetPath メソッド

 NavMeshAgent の現在の経路を削除します。
そのため、SetDestination メソッドなどによって再度目標地点を設定しない限り、動作しなくなります。

<参考サイト>
Unity 公式スクリプトリファレンス
NavMeshAgent.ResetPath
https://docs.unity3d.com/jp/current/ScriptReferenc...


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


 ゲームを実行し、障害物用のサーチ範囲にプレイヤーを侵入させてください。
徘徊用の経路ではなく、プレイヤーに対して移動を行うようになれば制御成功です。

 サーチ範囲からプレイヤーが出た場合には、再度、徘徊の状態に戻り、指定されている経路内の移動に戻れば、
こちらも制御成功です。

 プレイヤーと障害物が接触した場合には、ゲーム画面に接触されたことを示す表示を行い、
指定された時間後にフェード処理が入り、リスタート地点へ戻されて、残り時間が減少していれば制御成功です。

 このとき、プレイヤーが移動不可状態になっているか、また、残り時間はフェードインが完了してから再度減算が始まるかを確認してください。


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


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


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



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

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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