Menu
CoddyTech

이벤트로 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가 실행됩니다.

challenge icon

챌린지

쉬움

사격장입니다. 스페이스 키를 누르면 총(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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨