Event C# di Unity
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 10 dari 50.
Saat skor berubah, ada beberapa hal yang memerlukannya: teks skor, suara, pencapaian. Jika ScoreKeeper memanggil masing-masing hal itu, ia memerlukan field untuk setiap hal, dan setiap fitur baru berarti mengeditnya. Event membalikkan keadaan: ScoreKeeper mengumumkan perubahan, lalu siapa pun yang memerlukannya berlangganan. Kamu sudah mengenal event dan Action dari C#. Di Unity, publisher dan listener adalah komponen, biasanya pada GameObject yang berbeda:
using System;
using UnityEngine;
public class ScoreKeeper : MonoBehaviour
{
public event Action<int> OnScoreChanged;
private int score;
public void AddPoints(int points)
{
score += points;
OnScoreChanged?.Invoke(score);
}
}// ScoreLabel.cs, pada teks HUD
public ScoreKeeper keeper;
public TMP_Text label;
void Start()
{
keeper.OnScoreChanged += ShowScore;
}
void ShowScore(int score)
{
label.text = "Score: " + score;
}Action<int> berarti setiap listener adalah method yang menerima satu int, dalam kasus ini skor baru. Invoke memanggil setiap method yang berlangganan, sesuai urutan mereka berlangganan. Jika tidak ada listener, event bernilai null, sehingga OnScoreChanged(score) biasa akan memunculkan NullReferenceException, sedangkan ?. melewati pemanggilan. Kata kunci event membatasi skrip lain agar hanya bisa menggunakan += dan -=: di ScoreLabel, keeper.OnScoreChanged(5) atau keeper.OnScoreChanged = null tidak bisa dikompilasi.
ScoreKeeper tidak memiliki field untuk label dan tidak tahu bahwa label itu ada. Penghitung combo atau pemutar suara bisa berlangganan dengan cara yang sama, sementara ScoreKeeper tetap seperti semula, dan scene pengujian tanpa HUD berjalan tanpa error. Listener menemukan publisher melalui referensi Inspector, seperti di sini, atau dengan cara lain yang kamu ketahui, seperti GetComponent atau singleton. Menghapus listener dengan -= penting setelah object dihancurkan, dan hal ini dibahas di pelajaran berikutnya.
Tantangan
MudahCombo petarung bertambah setiap kali Space ditekan dan kembali ke 0 setelah comboWindow (1) detik tanpa terkena pukulan. Saat ini, Fighter.cs mengatur teks combo dan ukuran nyala api sendiri, jadi class ini memerlukan field untuk masing-masing. Ubah cara kerjanya dengan event:
- Di
Fighter.cs, deklarasikan event publik bernamaOnComboChangedyang meneruskan combo (sebuah int). Picu event tersebut dengan combo baru setiap kali combo berubah, termasuk saat direset ke 0, dan pastikan pukulan tidak menimbulkan error saat tidak ada yang mendengarkan event. - Hapus field
comboTextdanflamemilik Fighter serta baris yang menggunakannya: Fighter tidak mengetahui apa pun tentang HUD. - Di
ComboText.csdanComboFlame.cs, subscribe methodShowdanGrowke event fighter diStart(). Keduanya memiliki fieldfighteryang ditautkan di scene.
Tekan Play, pukul samsak dengan Space beberapa kali, tunggu satu detik, lalu tekan Periksa.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class Fighter : MonoBehaviour
{
public float comboWindow = 1f;
public TMP_Text comboText;
public Transform flame;
private int combo;
private float sinceHit;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
combo++;
sinceHit = 0f;
comboText.text = "Combo x" + combo;
flame.localScale = Vector3.one * (0.5f + 0.25f * combo);
}
else if (combo > 0)
{
sinceHit += Time.deltaTime;
if (sinceHit > comboWindow)
{
combo = 0;
comboText.text = "";
flame.localScale = Vector3.one * 0.5f;
}
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest3Event
Event C# di UnityBerlangganan di OnEnableField UnityEventEvent Menggerakkan UIRingkasan: Popup Pencapaian