Menu
CoddyTech

Es

Pelajaran 21 dari 25 dalam kursus Game Unity: Tower Defense di Coddy.

Menara Frost hampir tidak memberi kerusakan, tetapi serpihannya memperlambat musuh untuk sementara. Perlambatan adalah kondisi satu musuh, dan kondisi ini memiliki batas waktu: musuh menyimpan faktor dan waktu berakhirnya perlambatan, lalu menghitung kecepatannya setiap frame berdasarkan kecepatan asetnya. Selama Time.time masih sebelum waktu berakhir, faktor tersebut berlaku; setelahnya, musuh kembali ke kecepatan penuh tanpa perlu memulihkan apa pun. Mobil balap yang berada di atas bantalan pendorong:

public void Boost(float multiplier, float seconds)
{
    boost = multiplier;
    boostUntil = Time.time + seconds;
}
float speed = data.topSpeed;
if (Time.time < boostUntil)
{
    speed *= boost;
}

Perlambatan tidak boleh diterapkan pada aset. data.speed *= 0.5f akan memperlambat semua musuh dari jenis itu, termasuk yang belum muncul, dan kecepatannya tidak akan pernah dipulihkan. Serpihan kedua yang mengenai musuh yang sudah melambat akan mengatur faktor dan waktu berakhirnya lagi, sehingga perlambatan berlangsung selama menara Frost terus menyerang, tetapi efeknya tidak semakin kuat.

challenge icon

Tantangan

Sedang

Pecahan es memperlambat musuh selama beberapa saat.

  1. Di TowerData, tambahkan public float slowFactor = 1f; dan public float slowDuration; (FrostData: 0.5 dan 2).
  2. Di Enemy, public void Slow(float factor, float duration) menyimpan faktor dan slowUntil = Time.time + duration; bergerak dengan kecepatan data.speed dikalikan faktor selama Time.time < slowUntil.
  3. Di Projectile, setelah memberikan kerusakan, jika data.slowDuration > 0 dan target memiliki Enemy, perlambat target.

Tekan tombol “Main” dengan menara Frost sebelum menara Arrows-mu: Grunt yang terkena Frost berjalan dengan setengah kecepatan. Lalu tekan tombol “Periksa”.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Tower Defense

Latihan sendiri: Playground Unity