Menu
CoddyTech

Boss Savaşı

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 64 / 64.

Taş golemi arenadan çıkış kapısını korur. Sana doğru ağır adımlarla ilerler; yaklaştığında yumruklarını bir saniyeliğine kaldırıp yere vurur ve hâlâ yakınındaysan canını yakar. Yere vurduktan sonra dinlenir ve kılıcın ancak o zaman ona zarar verebilir: yürürken veya saldırıya hazırlanırken taş derisi tüm darbeleri savuşturur. Rengi ne yaptığını gösterir: yürürken gri, saldırıya hazırlanırken kırmızı, dinlenirken camgöbeği. Canını 0'a indir, kapı açılsın. Ekranın üst kısmındaki çubuk her darbeyi takip eder.

Golemin beynini, her durum için bir sınıf içeren bir durum makinesi olarak yaz: Boss ve BossStates.cs dosyasındaki ChaseState, WindupState ve RestState. Oyuncu, can çubuğu, kapı, IState, StateMachine ve IDamageable hazır; ayrıca Boss durumlarını zaten oluşturuyor ve makineyi her adımda çalıştırıyor.

challenge icon

Görev

Zor

Golemin durumlarını BossStates.cs içinde yaz.

  1. ChaseState: Tint(Color.gray); oyuncuya doğru speed hızında yürü; slamRange içine girince saldırıya hazırlansın.
  2. WindupState: Tint(Color.red); windupTime geçtikten sonra Slam! mesajını günlüğe yaz, menzildeki oyuncuya slamDamage kadar hasar ver ve dinlen.
  3. RestState: Tint(Color.cyan); restTime geçtikten sonra kovala.
  4. Boss.TakeDamage yalnızca rest durumunda sayılır: miktarı uygula, HealthChanged olayını tetikle, sağlık 0 olduğunda Fall() çağır.

“Oyna” düğmesine bas ve dinlenirken vur. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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)
    {
        // İsabetler yalnızca dinlenirken geçerlidir: amount kadar hasar al, HealthChanged olayını tetikle, sağlık 0 olduğunda Fall() çağır
    }

    // Hazır: golem düşer, kapı açılır ve golem arenadan ayrılır.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // Oyuncunun zemindeki uzaklığı.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // Yürürken gri, saldırıya hazırlanırken kırmızı, dinlenirken camgöbeği.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground