Menu
CoddyTech

Pertarungan Bos

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 64 dari 64.

Golem batu menjaga gerbang keluar arena. Ia mengentakkan kaki ke arahmu, lalu saat kamu mendekat, ia mengangkat tinjunya sebentar dan menghantam tanah. Hantamannya melukaimu jika kamu masih berada di dekatnya. Setelah menghantam, ia beristirahat, dan hanya saat itulah pedangmu bisa melukainya: kulit batunya menangkis setiap serangan saat ia berjalan atau bersiap menghantam. Warnanya menunjukkan apa yang sedang dilakukannya: abu-abu saat berjalan, merah saat bersiap menghantam, dan sian saat beristirahat. Kurangi kesehatannya hingga 0 untuk membuka gerbang. Bilah di bagian atas layar mengikuti setiap serangan.

Tulis otak golem sebagai mesin state dengan satu class untuk setiap state: Boss, serta ChaseState, WindupState, dan RestState di BossStates.cs. Pemain, bilah kesehatan, gerbang, IState, StateMachine, dan IDamageable sudah siap, dan Boss sudah membuat state-nya serta menjalankan mesin.

challenge icon

Tantangan

Sulit

Tulis semua state golem di BossStates.cs.

  1. ChaseState: Tint(Color.gray); berjalan mendekati pemain dengan speed; saat berada dalam jangkauan slamRange, bersiap menyerang.
  2. WindupState: Tint(Color.red); setelah windupTime, catat Slam!, lukai pemain dalam jangkauan sebesar slamDamage, lalu beristirahat.
  3. RestState: Tint(Color.cyan); setelah restTime, kejar pemain.
  4. Boss.TakeDamage hanya menghitung kerusakan saat berada dalam state rest: kurangi health sebesar jumlah kerusakan, picu HealthChanged, lalu panggil Fall() saat health mencapai 0.

Tekan tombol “Main” dan serang saat golem beristirahat. Lalu tekan tombol “Periksa”.

Coba sendiri

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour, IDamageable
{
    public Transform player;
    public float speed = 2f;
    public float slamRange = 2.5f;
    public float windupTime = 1f;
    public float restTime = 2f;
    public int slamDamage = 2;
    public int maxHealth = 6;

    public event Action<int, int> HealthChanged;
    public UnityEvent onDefeated;

    public StateMachine machine;
    public IState chase;
    public IState windup;
    public IState rest;

    private int health;

    void Awake()
    {
        health = maxHealth;
        machine = new StateMachine();
        chase = new ChaseState(this);
        windup = new WindupState(this);
        rest = new RestState(this);
    }

    void Start()
    {
        HealthChanged?.Invoke(health, maxHealth);
        machine.ChangeState(chase);
    }

    void Update()
    {
        machine.Tick();
    }

    public void TakeDamage(int amount)
    {
        // Serangan hanya dihitung saat golem beristirahat: kurangi nyawanya sebesar amount, picu HealthChanged, lalu panggil Fall() saat nyawanya 0
    }

    // Siap: golem tumbang, gerbang terbuka, dan golem meninggalkan arena.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // Jarak pemain di sepanjang permukaan tanah.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // Abu-abu saat berjalan, merah saat bersiap menyerang, sian saat beristirahat.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity