Unityに関連する記事です

 攻撃の機能が実装できましたので、この手順では敵役のゲームオブジェクトを作成し、攻撃の処理が正常に動作するかを検証します。

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



手順16 ー動かない敵の実装ー

<新しく学習する内容>
 ・Mathf クラスの各メソッド ーMathf.Max メソッド、Mathf.Min メソッド、Mathf.Clamp メソッドー



設計


 攻撃の相手役として敵のゲームオブジェクトを作成します。

 ここでは HP などの設定のみを行うだけに留めておき、プレイヤーの攻撃機能が正常に動作しているかを確認します。

 また後の手順で、敵の移動などの機能を追加していきます。


敵役のゲームオブジェクト用のアセットをインポートする


 アセットストアにて無料のアセットを入手してインポートします。
「Free Creature」「Free LowPoly」といったワードで検索すると、複数のアセットがヒットします。

 いくつか紹介しておきます。教材で利用しているのは、下記の Slime Rabbit です。



Slime Rabbit
https://assetstore.unity.com/packages/3d/character...





Meshtint Free Polygonal Metalon
https://assetstore.unity.com/packages/3d/character...





Little Ghost
https://assetstore.unity.com/packages/3d/character...




ヒエラルキーに敵役の Enemy ゲームオブジェクトを配置する


 インポートしたアセットから Enemy 用のゲームオブジェクトを Sceneビューに配置するか、ヒエラルキーに配置してください。
任意のもので構いません。

 今回教材で利用しているアセットの場合は、下記のパスにあるプレハブを利用しています。

パス
Assets/amusedART/SlimeRabbit/Prefab/SlimeRabbit_Prefab.prefab


フォルダ




 Enemy 用のゲームオブジェクトの位置については、デバッグしやすいように、プレイヤーのゲームオブジェクトの近くになるように設定してください。


 下記はサンプルです。
Transform コンポーネント以外は、アセットによりアタッチされているコンポーネントが異なります


インスペクター画像



 ゲームオブジェクトの名前は Enemy のようにわかりやすい名前に変えておいてください。


インスペクター画像




Enemy ゲームオブジェクトの設定を行う


 ヒエラルキーにある Enemy ゲームオブジェクトを選択し、インスペクターの最下段にある Add Component ボタンを押して
Rigidbody コンポーネントをアタッチします。Freeze Rotation にはすべてチェックを入れてください。
それ以外の設定は初期値のままで問題ありません。

 また Enemy ゲームオブジェクトに利用したアセットによっては、コライダーがアタッチされていない場合があります。
その際には、CapsuleCollider をアタッチして、コライダーのサイズを、ゲームオブジェクトのサイズに合わせて調整を行ってください。
コライダーについては色々な角度から見ていくようにしてください。サイズはあっていても意図していない位置になっていることがあります。

 最初からコライダーが設定されている場合には、サイズの確認だけしておいてください。

 以下はサンプルです。

 
インスペクター画像



Scene ビュー コライダー設定



Scene ビュー コライダー設定



Scene ビュー コライダー設定



 以上に設定は完了です。


Health スクリプトを作成する


 Hp の管理を行うための Health クラスを作成します。

 このクラスでは Hp の最大値と現在値の管理、および Hp の更新処理を行います。


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




 ダメージ用の TakeDamage メソッドと、回復用の Heal メソッドに、処理を分けて用意しています。

 これは1つのメソッドで処理を行うようにしても問題はありません。


/// <summary>
/// 兼用
/// </summary>
/// <param name="amount"></param>
public void ChangeHealth(int amount)
{
    currentHp = Mathf.Clamp(currentHp + amount, 0, maxHp);
}

 処理の流れをしっかりと把握できるまでは、メソッドを分けておいた方がよいでしょう。


Mathf 構造体の各メソッド ーMathf.Max メソッド、Mathf.Min メソッド、Mathf.Clamp メソッドー


 Mathf 構造体は、Unity が用意している、数学関数の変数やメソッドをまとめてある構造体です。
通常の Math クラスと異なり、戻り値は float 型で用意されています。


参考サイト
Unity 公式スクリプト・リファレンス
Mathf


1.Mathf.Max メソッド


 Max メソッドは「指定した2つ以上の値から、大きい方の値を1つ返す(取得する)」処理になります。
引数を2つ指定する方法と、配列を1つ指定する方法があります。

 currentHp = Mathf.Max(currentHp - damage, 0);
 第1引数に現在の Hp - ダメージ値を指定し、第2引数に 0 の値を指定しています。
この処理により、2つの値のうちの大きい値が currentHp 変数に代入され、常に 0 以上で、かつ現在値を取得できます。



 Max メソッドには引数のオーバーロードがあり、引数の型は、float 型か int型でそれぞれ利用が出来るようになっています。

参考サイト
Unity 公式スクリプトリファレンス
Mathf.Max


2.Mathf.Min メソッド


 Min メソッドは「指定した2つ以上の値から、小さい方の値を1つ返す(取得する)」処理になります。
引数を2つ指定する方法と、配列を1つ指定する方法があります。

 currentHp = Mathf.Min(currentHp + recoveryPoint, maxHp);

 第1引数に現在の Hp + 回復値を指定し、第2引数に最大 Hp の値を指定しています。
この処理により、2つの値のうちの小さい値が currentHp 変数に代入され、常に最大値以下でかつ、現在値を取得できます。



 Min メソッドには引数のオーバーロードがあり、引数の型は、float 型か int型でそれぞれ利用が出来るようになっています。


参考サイト
Unity 公式スクリプトリファレンス
Mathf.Min


3.Mathf.Clamp メソッド


 Clamp メソッドは、「制御したい指定値を、指定した範囲内の最小値、最大値に収めてくれる(置き換えてくれる)」処理になります。

<メソッドの記法>
  制御したい指定値 = Mathf.Clamp(制御したい指定値, 最小値, 最大値);
 
 このメソッドを利用して、計算処理後の hp 変数の値を制限することが出来ます。
上記のメソッドの書式に、制御したい値を当てはめて処理を組み立ててみましょう。

  // Hp の値を減算した結果値を、最低値と最大値の範囲内に収まるようにして更新
  hp = Mathf.Clamp(hp -= amount, 0, maxHp);



 Clamp メソッドにはオーバーロードがあり、引数の型は、float 型か int 型でそれぞれ利用が出来るようになっています。
hp 変数の型は int 型ですので、今回は自動的に int 型を利用しています。


参考サイト
Unity 公式スクリプトリファレンス
Mathf.Clamp


Enemy ゲームオブジェクトに Health スクリプトをアタッチし、設定を行う


 Enemy ゲームオブジェクトに Health スクリプトをアタッチし、インスペクターより MaxHp 変数の設定を行います。
任意の値を設定してください。

 ただし、デバッグをおこなうことを前提に値を考えてください
MaxHp 変数を元に CurrentHp 変数が設定され、CurrentHp 変数はプレイヤーの攻撃によって減少し、0 になると破壊される処理を制御しているため、
デバッグの際には、この両方の制御処理のチェックが必要になります。

 そのため破壊確認のデバッグをしている間は、あまり大きな値にしない方がよいでしょう。


インスペクター画像




AttackPlayer スクリプトを修正する


 前回の手順で作成した AttackPlayer スクリプトを修正し、侵入判定の処理を追加します。
TODO で記述してある部分に追加しますので、まずは自分で処理を書けるか挑戦してみてください。


AttackPlayer.cs

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



処理の内容を把握・理解する


 新しく追加したメソッドを利用して、武器のコライダーと敵のコライダーを利用した侵入判定を行います。

 どのように処理が連動しているかを理解しておきましょう。

1.攻撃のボタンを押す
2.攻撃のアニメーションが再生される
3.攻撃のアニメーションの途中で SwitchWeaponCollider メソッドが実行され、引数として 1 が渡されるため、武器のコライダーがオンになる
4.武器のコライダーがオンの間(攻撃しているアニメーションの間)、敵のコライダーに侵入した場合、OnTriggerEnter メソッドが実行される
5.攻撃のアニメーションの途中で SwitchWeaponCollider メソッドが実行され、引数として 0 が渡されるため、武器のコライダーがオフになる
6.攻撃のアニメーションが終了する

 このようなロジックにより、前回の手順で作成したアニメーションイベントによるメソッドの実行と
OnTriggerEnter メソッドが連動していることで攻撃の機能を構築しています。
また、きちんと処理の始まりと終わりがあるため、1つのサイクルとして繰り返し機能できる状態であることも分かります。

 処理の理解をしておくことで、もしも問題が生じた場合、どこまで処理が動いているのかを把握出来るようになります。

 逆に処理の流れを理解できていない場合、問題が生じた場合にどの部分を調べていってよいのか検討がつきません

 デバッグを行う前には、自分が作成した処理がどういった機能になっているのか、またそれはどういった手順で動いているのか
しっかりと理解しておくようにしてください。


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


 プレイヤーの攻撃が敵に当たるか、確認します。
その際、Hp が減少していけば制御成功です。Hp が 0 になって破壊されるかも確認しておきましょう。


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


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

 => 次は 手順17 −連続攻撃機能の実装  です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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