Menu
CoddyTech

빙결

Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 21번째.

Frost 타워는 피해를 거의 주지 않지만, 파편은 적을 잠시 느리게 합니다. 감속은 적 한 명의 상태이며, 끝나는 시점이 있습니다. 적은 감속이 풀리는 배율과 시간을 보관하고, 매 프레임 에셋의 속도를 기준으로 자신의 속도를 계산합니다. 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를 사용하면 아직 생성되지 않은 적까지 포함해 해당 종류의 모든 적이 느려지고, 속도를 원래대로 되돌릴 방법도 없습니다. 감속된 적에게 두 번째 파편이 명중하면 배율과 종료 시점이 다시 설정됩니다. 따라서 Frost 타워가 계속 명중하는 동안 감속이 유지되지만, 감속 효과가 더 강해지지는 않습니다.

challenge icon

챌린지

중급

서리 파편은 적을 잠시 느리게 합니다.

  1. TowerData에 public float slowFactor = 1f;와 public float slowDuration;을 추가합니다(FrostData: 0.5와 2).
  2. Enemy에서 public void Slow(float factor, float duration)은 계수를 저장하고 slowUntil = Time.time + duration을 설정합니다. Time.time < slowUntil인 동안 data.speed에 계수를 곱한 속도로 이동합니다.
  3. 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);
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임: 타워 디펜스의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드