すべてにダメージを与える
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 43/50。
チャレンジ
中級これで敵も反撃してくるようになります。これまでのレッスンの内容はすべて残してください。敵にはもうタグを付けません。代わりに、攻撃はインターフェースを通じてダメージを与えられる対象を見つけ、敵も同じインターフェースを通じてヒーローにダメージを与えます。
IDamageableは1つのメソッド、void TakeDamage(int amount);を宣言します。Enemyはこれを実装します。health、damage、attackEveryを用意し、Inspectorで設定します(gruntは2、1、1、dasherは1、2、1)。TakeDamageはamountをhealthから差し引き、0以下になったら敵を破棄します。Startでは、ヒーローのIDamageableも保持します。毎フレーム、ヒーローが1.2ユニット以内にいるとき、そのTakeDamage(damage)を呼び出します。ただし、呼び出しはattackEvery秒に1回までです。Heroもこれを実装します。InspectorでswingDamage(1)、maxHealth(5)、safeTime(1)を設定し、AwakeでhealthをmaxHealthから開始させます。攻撃を受けるとamountを差し引き、体力をHero HP: 4としてログに出力し、safeTime秒間、ヒーローがそれ以上攻撃を受けないようにします。体力が0になったらThe hero fallsをログに出力し、Heroスクリプトをオフにします(enabled = false)。倒れたヒーローは攻撃を受けても無視します。- 攻撃ではもうタグの確認もオブジェクトの破棄もしません。攻撃範囲内かつ前方にいて、
IDamageableを持つすべての対象にTakeDamage(swingDamage)を呼び出します。
Playを押して戦い、その後Checkを押してください。
自分で試してみよう
// 後のレッスンでこれを具体化します:ダメージを受ける可能性があるものすべて。
public interface IDamageable
{
}