실시간 변동 데이터를 전달할 때 유용한 시스템으로 수치 변화가 있을 때 자주 사용됩니다.
스탯이 변했을 때 알려줄 방송국입니다. PlayerStats를 매개변수로 전달합니다.
// PlayerState.cs
public event System.Action<PlayerStats> OnStatsChanged;
지금 스탯이 변했고, 현재 스탯은 '이거'라고 알려주는 방송입니다. 여기서 ?.는 안전장치 입니다.
// PlayerState.cs의 ModifyHealth, ModifySatiety, ModifyHydration에 들어갑니다.
OnStatschanged?.Invoke(stats);
Event를 PlayerState에서 선언하고, 호출하고 싶을 때를 PlayerState의 Modify함수에 작성했습니다. 이 이벤트가 무엇을 할 것인지를 담당할 스크립트는 UIManager이므로 해당 스크립트를 수정해보겠습니다.
// UIManager.cs
[Header("Player")]
private PlayerState playerState;
void Start()
{
if (player != null)
{
playerState = player.GetComponent<PlayerState>();
UpdateUI(playerState.stats);
playerState.OnStatsChanged += UpdateUI;
}
}
private void UpdateUI(PlayerStats stats)
{
// Text와 Bar를 업데이트 하는 로직
}
Text와 Bar를 업데이트 하기 위해서는 대상이 필요합니다.
Bar: 현재 플레이어 정보를 게이지로 표현함. 현재 수치 / 최대 수치 계산으로 fillAmount를 조절함.
Text: 현재 플레이어 정보를 숫자로 표현함. ToString("F0")을 이용하여 소수점이 드러나지 않도록 함.
// UIManager.cs
[Header("Bar")]
public Image healthBar;
public Image satietyBar;
public Image hydrationBar;
[Header("Text")]
public Text healthText;
public Text satietyText;
public Text hydrationText;
private void UpdateUI(PlayerStats stats)
{
if (healthBar && satietyBar && hydrationBar)
{
healthBar.fillAmount = stats.health / GameConstants.MAX_HEALTH;
satietyBar.fillAmount = stats.satiety / GameConstants.MAX_SATIETY;
hydrationBar.fillAmount = stats.hydration / GameConstants.MAX_HYDRATION;
}
if (healthText && satietyText && hydrationText)
{
healthText.text = stats.health.ToString("F0");
satietyText.text = stats.satiety.ToString("F0");
hydrationText.text = stats.hydration.ToString("F0");
}
}
Text와 Image 제어다음 글에서는: