
Project. DayLight오전에는 플레이어 파라미터를 UI와 연동하여 구현한 로직이 맞는지 테스트하는 시간을 가졌고, 오후에는 아이템 S.O를 생성하는 툴에 레시피까지 생성하도록 구현했다. 추가로 생성한 레시피를 바탕으로 크래프팅 UI에 연동하는 것까지 하려고 했는데 Git 충돌이 생겨 해결한다고 시간을 조금 잡아먹었다.
이번에 공유할 코드는 캐릭터 파라미터와 UI 연동에 활용한 MVP 패턴이다. 실제 코드는 파라미터 간 상호작용이 있어 조금 더 복잡하지만 정말 단순히
Modelpublic class PlayerProperty : MonoBehaviour
{
public Property<float> MoveSpeed;
public Property<float> AtkSpeed;
public Property<float> AtkDamage;
[SerializeField] private float _baseMoveSpeed;
[SerializeField] private float _baseAtkSpeed;
[SerializeField] private float _baseAtkDamage;
private void Update()
{
ParameterAct();
}
private void ParameterAct()
{
AtkDamage.Value = _atkDamage;
AtkSpeed.Value = _atkSpeed;
MoveSpeed.Value = _moveSpeed;
}
private void Init()
{
AtkSpeed = new Property<float>(_baseAtkSpeed);
MoveSpeed = new Property<float>(_baseMoveSpeed);
AtkDamage = new Property<float>(_baseAtkDamage);
}
}
Viewpublic class PropertyHudUI : MonoBehaviour
{
[SerializeField] private TMP_Text _speed;
[SerializeField] private TMP_Text _atkDamage;
[SerializeField] private TMP_Text _atkSpeed;
public void SpeedUpdate(float value)
{
_speed.text = $"Speed : {value}";
}
public void AtkDamageUpdate(float value)
{
_atkDamage.text = $"AtkDamage : {value}";
}
public void AtkSpeedUpdate(float value)
{
_atkSpeed.text = $"AtkSpeed : {value}";
}
}
Presenterpublic class HudManager : MonoBehaviour
{
[SerializeField] private PropertyHudUI _propertyHudUI;
[SerializeField] private ParameterHudUI _parameterHudUI;
private PlayerProperty _property;
private void SpeedUpdate(float value)
{
_propertyHudUI.SpeedUpdate(value);
}
private void AtkDamageUpdate(float value)
{
_propertyHudUI.AtkDamageUpdate(value);
}
private void AtkSpeedUpdate(float value)
{
_propertyHudUI.AtkSpeedUpdate(value);
}
public void Init(PlayerProperty playerProperty)
{
_property = playerProperty;
_property.MoveSpeed.OnChanged += SpeedUpdate;
_property.AtkDamage.OnChanged += AtkDamageUpdate;
_property.AtkSpeed.OnChanged += AtkSpeedUpdate;
SpeedUpdate(_property.MoveSpeed.Value);
AtkDamageUpdate(_property.AtkDamage.Value);
AtkSpeedUpdate(_property.AtkSpeed.Value);
}
}
SceneMediator다만 InGame씬과 UI씬이 달라서 각 씬에 있는 것들을 참조시켜주는 중재자가 필요해서 이를 위해 중재자 클래스를 생성했다.
public class SceneMediator : MonoBehaviour
{
[Header("Drag&Drop")]
[SerializeField] private PlayerProperty _playerProperty;
private void Start()
{
Init();
}
private void Init()
{
HudManager hudManager = FindObjectOfType<HudManager>();
if (hudManager != null)
{
hudManager.Init(_playerProperty);
}
else
{
Debug.LogError("HudManager를 찾을 수 없습니다");
}
}
}