이벤트로 UI 제어하기
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 13번째.
이벤트를 사용하면 게임은 HUD에 대해 아무것도 몰라도 HUD는 게임의 상태를 따라갑니다. 이 Health는 체력 포인트를 소유하고 두 가지를 알립니다. 체력이 변경되었으며, 체력이 0에 도달했다는 것입니다. 막대, 텍스트 또는 게임 오버 화면을 위한 필드가 없으므로, 같은 컴포넌트를 플레이어, HUD가 없는 적, 테스트 씬에서 모두 사용할 수 있습니다:
public class Health : MonoBehaviour
{
public int maxHp = 100;
public event Action<int, int> OnChanged;
public event Action OnDied;
public int Hp { get; private set; }
void Awake()
{
Hp = maxHp;
}
public void TakeDamage(int amount)
{
if (Hp == 0) return;
Hp = Mathf.Max(Hp - amount, 0);
OnChanged?.Invoke(Hp, maxHp);
if (Hp == 0) OnDied?.Invoke();
}
}// HealthBar.cs, HUD에 표시됨
public Health health;
public Image bar;
void OnEnable() { health.OnChanged += Show; }
void OnDisable() { health.OnChanged -= Show; }
void Start()
{
Show(health.Hp, health.maxHp);
}
void Show(int hp, int max)
{
bar.fillAmount = (float)hp / max;
}막대는 OnEnable과 OnDisable 쌍을 사용해 활성화된 동안에만 이벤트를 수신합니다. 이벤트가 두 값을 모두 전달하므로 Show는 Health에서 다른 정보를 가져올 필요가 없습니다. GameOverScreen은 자체 스크립트에서 OnDied를 구독해 패널을 표시하고, 피격 소리는 OnChanged를 구독합니다. 이들 중 어느 것도 Health를 변경하지 않습니다. Hp { get; private set; }을 사용하면 HUD에서 체력을 읽을 수 있지만 변경할 수는 없습니다.
이벤트는 변경 사항을 알리므로 첫 번째 피격 전까지 막대는 아무런 알림도 받지 못합니다. Start에서 현재 체력을 한 번 그립니다. OnEnable에서는 그러지 않습니다. Unity는 각 오브젝트마다 Awake를 호출한 다음 OnEnable을 호출하며, 호출 순서는 보장되지 않습니다. 따라서 Health의 Awake가 Hp를 설정하기 전에 막대의 OnEnable이 실행될 수 있고, 그러면 막대에 0이 표시됩니다. 어떤 Start가 실행되기 전에 모든 Awake가 실행됩니다.
챌린지
쉬움사격장입니다. 스페이스 키를 누르면 총(Gun.cs)이 발사됩니다. 총에는 maxAmmo(6)발이 들어 있으며, 마지막 탄을 발사하면 reloadTime(1.5)초 동안 재장전한 후 다시 탄약이 채워집니다. 아직 HUD에는 이 내용이 표시되지 않습니다. 총이 변경 사항을 알리고 HUD가 이를 수신하도록 하세요. 총에는 HUD를 위한 필드를 추가하지 않습니다.
Gun.cs에 공개 이벤트 두 개를 추가하세요.OnAmmoChanged는 탄약 수와maxAmmo(int 두 개)를 전달하고,OnReloading은 bool을 전달합니다. 재장전이 시작될 때는 true, 끝날 때는 false입니다. 주석으로 표시된 위치에서 이벤트를 발생시키세요.- HUD의
AmmoHud.cs에서 HUD가 활성화되어 있는 동안 두 이벤트를 모두 수신하세요.ammoText에는 탄약을Ammo: 4/6형식으로 표시하고,reloadText(Reloading...라는 텍스트가 있는 오브젝트)는 재장전 중에만 표시하세요. - 첫 발을 쏘기 전인 시작 시점부터 HUD에 올바른 내용이 표시되어야 합니다. 즉,
Ammo: 6/6이 표시되고 재장전 텍스트는 표시되지 않아야 합니다. 총의Ammo및Reloading속성으로 현재 값을 가져올 수 있습니다. - HUD가 파괴되더라도 총은 오류 없이 계속 발사됩니다.
Play를 누르고, 총알을 두 번 모두 소진한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.