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.
Görev
ZorGolemin durumlarını BossStates.cs içinde yaz.
ChaseState:Tint(Color.gray); oyuncuya doğruspeedhızında yürü;slamRangeiçine girince saldırıya hazırlansın.WindupState:Tint(Color.red);windupTimegeçtikten sonraSlam!mesajını günlüğe yaz, menzildeki oyuncuyaslamDamagekadar hasar ver ve dinlen.RestState:Tint(Color.cyan);restTimegeçtikten sonra kovala.Boss.TakeDamageyalnızcarestdurumunda sayılır: miktarı uygula,HealthChangedolayını tetikle, sağlık 0 olduğundaFall()ç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;
}
}
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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground