凍結
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 21/25。
Frostタワーはほとんどダメージを与えませんが、その欠片は敵の動きをしばらく遅くします。スローとは敵1体の状態であり、終了時刻があります。敵はスローの倍率と効果が切れる時刻を保持し、毎フレーム、アセットの速度をもとに自身の速度を計算します。Time.timeが終了時刻より前であれば倍率が適用され、それを過ぎると、元に戻す処理がなくても敵は通常の速度に戻ります。ブーストパッドに乗ったレーシングカーの例です。
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}スローをアセットに書き込んではいけません。data.speed *= 0.5fとすると、まだスポーンしていない敵も含め、その種類の敵すべての速度が遅くなり、速度を元に戻す方法もなくなります。スロー状態の敵に2つ目の欠片が命中すると、倍率と終了時刻が再設定されます。そのため、Frostタワーが攻撃し続ける間はスローが持続しますが、効果がさらに強くなることはありません。
チャレンジ
中級フロストの破片は、しばらくの間、敵の移動速度を低下させます。
TowerDataに、public float slowFactor = 1f;とpublic float slowDuration;を追加します(FrostData: 0.5と2)。Enemyで、public void Slow(float factor, float duration)は係数を保持し、slowUntil = Time.time + durationを設定します。Time.time < slowUntilの間は、data.speedに係数を掛けた速度で移動します。Projectileで、ダメージを与えた後、data.slowDuration > 0で、対象がEnemyの場合は、移動速度を低下させます。
矢のタワーより先にフロストタワーを配置して、「プレイ」を押します。凍ったグラントは半分の速度で歩きます。その後、「確認」を押します。
自分で試してみよう
using System;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour, IDamageable
{
public static readonly List<Enemy> All = new List<Enemy>();
public static event Action<Enemy> ReachedBase;
public static event Action<Enemy> Killed;
public EnemyData data;
public Transform[] waypoints;
private int next = 1;
private int health;
void Awake()
{
health = data.maxHealth;
}
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
void Update()
{
Vector3 target = waypoints[next].position;
transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
if (transform.position == target)
{
next++;
if (next == waypoints.Length)
{
ReachedBase?.Invoke(this);
Destroy(gameObject);
}
}
}
public void TakeDamage(int amount)
{
if (health <= 0)
{
return;
}
health -= amount;
if (health <= 0)
{
Killed?.Invoke(this);
Destroy(gameObject);
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド