Menu
CoddyTech

凍結

Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 15/18。

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タワーが攻撃し続ける間はスローが持続しますが、効果がさらに強くなることはありません。

challenge icon

チャレンジ

中級
  1. TowerDataに、public floatであるslowFactor(デフォルト値1:減速なし)とslowDuration(デフォルト値0)を追加します。FrostDataでは0.5と2を設定します。
  2. Enemyにpublic void Slow(float factor, float duration)を追加し、減速係数と減速が終了する時刻を保持します。減速が続いている間、敵は各フレームでアセットの速度に係数を掛けた速度で移動します。
  3. Projectileでは、ダメージを与えた後、データのslowDurationが0より大きく、ターゲットがEnemyである場合、データの係数と時間を使って減速させます。

ショップには、FrostDataアセットとFrostShardの投射物を持つFrostタワーが用意されています。Playを押し、Arrowsの前にFrostタワーを設置してから、Checkを押します。

自分で試してみよう

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);
        }
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:タワーディフェンスのすべてのレッスン