
Action<int> OnCountChangedAction OnButtonClickedvoid SetDisplay(int value)using System;
using UnityEngine;
public class ClickModel
{
public int Count;
public event Action<int> OnCountChanged;
public void Clicked(int count)
{
Debug.Log($"Changed the count!! {Count} -> {count}");
Count += count;
OnCountChanged?.Invoke(Count);
}
}
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class ClickView_Text : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI _tmp;
[SerializeField] private Slider _slider;
[SerializeField] private Button _btn;
public event Action OnButtonClicked;
public void OnEnable()
{
_btn.onClick.AddListener(OnClick);
}
public void OnDisable()
{
_btn.onClick.RemoveListener(OnClick);
}
public void OnClick()
{
Debug.Log("Pressed the button!!");
OnButtonClicked?.Invoke();
}
public void SetDisplay(int count)
{
if (_tmp != null) _tmp.text = count.ToString();
if (_slider != null) _slider.value = count / 100f;
}
}
using UnityEngine;
public class ClickPresenter : MonoBehaviour
{
private ClickModel _clickModel = new();
public ClickView_Text _clickViewText;
private void OnEnable()
{
_clickViewText.OnButtonClicked += Count;
_clickModel.OnCountChanged += _clickViewText.SetDisplay;
}
private void OnDisable()
{
_clickViewText.OnButtonClicked -= Count;
_clickModel.OnCountChanged -= _clickViewText.SetDisplay;
}
public void Count()
{
_clickModel.Clicked(1);
}
}
int currentHp, int maxHpAction<float> OnHpRatioChanged (0.0~1.0 비율 전달)SetGauge(float ratio) 함수로 슬라이더 갱신.SetText(int current, int max) 함수로 숫자 표시.SetWarning(bool active) 함수로 경고창 On/Off.※ 주의: 각 View는 서로의 존재를 절대 몰라야 하며, 본인한테 할당된 UI 컴포넌트 역할만 수행합니다.
핵심 로직 (1:N 연결):
구찮아서 Button Handling 은 그냥 Presenter 에서 해버림 ㅋㅋ
using System;
using UnityEngine;
public class BossStatModel
{
public int CurrentHp = 100;
public int MaxHp = 100;
public event Action OnCurrentHpChanged;
public void TakeDamage(int damage)
{
CurrentHp -= damage;
OnCurrentHpChanged?.Invoke();
}
}
using UnityEngine;
using UnityEngine.UI;
public class BossHpBarView : MonoBehaviour
{
private Slider _slider;
public void Awake()
{
_slider = GetComponent<Slider>();
}
public void OnSetValue(float value)
{
_slider.value = value;
}
}
using TMPro;
using UnityEngine;
public class BossHpTextView : MonoBehaviour
{
private TextMeshProUGUI _text;
private void Awake()
{
_text = GetComponent<TextMeshProUGUI>();
}
public void OnSetText(string text)
{
_text.text = text;
}
}
using TMPro;
using UnityEngine;
public class BossWarningView : MonoBehaviour
{
private TextMeshProUGUI _text;
private void Awake()
{
_text = GetComponent<TextMeshProUGUI>();
}
public void OnSetText(string text)
{
_text.text = text;
}
}
using UnityEngine;
public class BossPresenter : MonoBehaviour
{
BossStatModel _bossStat = new();
[SerializeField] BossHpBarView _hpBarView;
[SerializeField] BossHpTextView _hpTextView;
[SerializeField] BossWarningView _bossWarningView;
public void Start()
{
HpBarView();
HpTextView();
}
public void OnEnable()
{
_bossStat.OnCurrentHpChanged += HpBarView;
_bossStat.OnCurrentHpChanged += HpTextView;
_bossStat.OnCurrentHpChanged += WarningView;
}
public void OnDisable()
{
_bossStat.OnCurrentHpChanged -= HpBarView;
_bossStat.OnCurrentHpChanged -= HpTextView;
_bossStat.OnCurrentHpChanged -= WarningView;
}
public void OnAttack()
{
int damage = 5;
_bossStat.TakeDamage(damage);
}
private void HpBarView() => _hpBarView.OnSetValue(_bossStat.CurrentHp / (float)_bossStat.MaxHp);
private void HpTextView() => _hpTextView.OnSetText($"{_bossStat.CurrentHp}/{_bossStat.MaxHp}");
private void WarningView()
{
float ratio = _bossStat.CurrentHp / (float)_bossStat.MaxHp;
if (ratio < 0.3f)
{
_bossWarningView.OnSetText($"위험!!! ");
}
}
}