Unityに関連する記事です

敵の設計 その2

 前回の設計の続きから進めていきます。

・敵の移動速度、攻撃力、HPは最小値と最大値が設定でき、敵が生成されるたびに、この範囲内でランダムな値を設定するようにする。 <= ここで扱います
 これにより同じ敵でも個体差が表現できるようにする。

・敵は地面の上を移動する。そのため、移動の速度があり、設定できる。 <= ここで扱います
 
・敵は攻撃という行動を持ち、敵の攻撃に対して、プレイヤーはヒット判定を行う。  <= ここで扱います
 ヒットした場合には、プレイヤーのHPを減少させる。減少する値は敵の攻撃力とする。
 敵とプレイヤーがぶつかっただけではヒット判定は行わない。
 敵が攻撃し、その武器がプレイヤーに当たった際に、ヒット判定を行う。

・敵がプレイヤーに対して攻撃する場合のロジックを設計する。索敵範囲は設定はできるがランダムな値は取らない。
  ‐錣帽況發垢襪里任呂覆ぁ
  ∈敵範囲がある。範囲は設定できる。この範囲はゲーム内では見えない。
  索敵範囲内にプレイヤーが入ったら、敵はプレイヤーを発見状態とする。
  と見したら、索敵範囲内でのみプレイヤーの方向に移動を開始し、一定の間隔で攻撃する。攻撃までの間隔は設定できる。
  ズ敵範囲外にプレイヤーが移動した場合には、そこで発見状態は終了し、移動をやめる。
  索敵範囲内にプレイヤーがいない場合には、その場で待機、あるいはウロウロ歩く、を一定の間隔で交互に行う。これらの各間隔は設定できる。

・敵のHPは敵の頭上に横ゲージ表示し、現在値がグラフィカルに伝えられるようにデザインする。ゲージは右端がHP最大、左端がHP最小とする。

敵の行動を設計する

 敵がその場にいるだけでは、ゲームとして臨場感が表現できません。
それでは、どのような設計をすれば、敵の振る舞いとして相応しいものであるかを考えてみましょう。

 ・まずは待機状態でスタートする。待機状態が敵の行動の基礎状態となる。
 ・待機には、待機時間があり、その待機時間が経過するごとに、待機状態から移動、あるいは攻撃を行う。
 ・待機時間にはランダムな値を取る。(最小値と最大値は設定する。)
 ・移動、あるいは攻撃を行った場合には、再度、待機状態になる。待機時間は、また新しくランダムな値を取る
 ・上記の待機→行動→待機をずっと繰り返す。

 ・移動の場合、プレイヤーを探して、その方向を向き、移動時間の間、移動速度に基づき、物理演算を用いて移動をする。
  移動時間はその都度ランダムな値を取る(最小値と最大値は設定する。)
  移動速度はEnemyのクラスに設定する。こちらは敵の生成時にランダムな値が設定され、変更はされない。(最小値と最大値は別途設定する。)

 ・攻撃の場合、敵は自分の前方に向かって、所持している武器による攻撃アニメーションを1回行う。
  武器にはあらかじめコライダーによる当たり判定があり、プレイヤーと当たり判定が発生した場合には、プレイヤーは敵の攻撃力分だけHPが減少する。
  
 ・攻撃力はEnemyのクラスに設定する。こちらは敵の生成時にランダムな値が設定され、変更はされない。(最小値と最大値は別途設定する。)

 以上を仕様案とします。これを元に、実装を考えます。

作成済の敵のクラスを設計仕様に基づき変数を用意する

 敵の行動の設計ができましたので、それを仕様として実装していく方法を考えましょう。
 まず、いくつかの変数が必要になりますので、どういった型で用意すればよいかも含めて用意していきましょう。

敵の移動速度、攻撃力、HPは最小値と最大値が設定でき、敵が生成されるたびに、この範囲内でランダムな値を設定するようにする。


こちらを満たす内容で修正していくようになります。
移動速度、攻撃力などが必要になりますし、それらの最小値、最大値を設定する値も必要ですね。
また敵の行動についての今後の実装も踏まえて、行動管理用のEnumを用意しておきます。

 敵用のコントローラークラスのスクリプトに、変数を追加したものです。

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。

敵を移動させる

・敵は地面の上を移動する。

 移動をさせるための変数の用意は整いました。では、敵の状態を表すEnum変数を利用して、移動処理を実装していきましょう。
敵の移動は物理演算を用いるという設計になっていましたので、そちらを利用して実装をしましょう。

 敵用のコントローラークラスのスクリプトに、移動処理を追加したものです。

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。

敵を攻撃させる

・敵は攻撃という行動を持ち、敵の攻撃に対して、プレイヤーはヒット判定を行う。

 敵には移動と待機の他に、攻撃という行動を設計しました。移動と同じように、一定の間隔で待機状態から攻撃行動に移れるように考えましょう。
 ポイントとしましては、下記の設計仕様をすべて満たすように実装を考えるということです。

 1.ヒットした場合には、プレイヤーのHPを減少させる。減少する値は敵の攻撃力とする。
 2.敵とプレイヤーがぶつかっただけではヒット判定は行わない。
 3.敵が攻撃し、その武器がプレイヤーに当たった際に、ヒット判定を行う。

 敵は武器を持っていますので、武器の形状に合わせてコライダーを設定しましょう。(CapsuleColliderがよいと思います)
このままですと常に武器が当たり判定を行ってしまうため、攻撃のアニメーションのときだけ、コライダーがオンになるようにします。
 攻撃以外の行動の際にはコライダーがオフになるようにしましょう。
こうすることで、「2.敵とプレイヤーがぶつかっただけではヒット判定は行わない」という処理を実装できます。
 ここまでは敵側の仕様実装になります。EnemyControlerをどのように修正して、上記を実装できるかを考えます。

※ コライダーの実装例



敵側の実装例

 敵用のコントローラークラスのスクリプトを修正したものです。

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。

プレイヤー側の実装例

 敵が行った攻撃に対して、プレイヤーがヒットしたかどうかの判定を行うような設計にしました。
こちらはプレイヤー側の仕様実装になりますので、PlayerControllerを修正して、ヒットの判定を追加していきましょう。
また攻撃がヒットした場合には、プレイヤーのHPを敵の攻撃力分だけ減少させる処理も必要になります。
 
 これらの処理によって「1.ヒットした場合には、プレイヤーのHPを減少させる。減少する値は敵の攻撃力とする」と
「3.敵の武器がプレイヤーに当たった際にヒット判定を行う」処理を実装できます。

 プレイヤーのコントローラークラスのスクリプトを修正したものです。

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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