[Unity] Project. DayLight_6

Lingtea_luv·2025년 6월 24일

Project

목록 보기
32/38
post-thumbnail

Project. DayLight

오전에는 플레이어 파라미터를 UI와 연동하여 구현한 로직이 맞는지 테스트하는 시간을 가졌고, 오후에는 아이템 S.O를 생성하는 툴에 레시피까지 생성하도록 구현했다. 추가로 생성한 레시피를 바탕으로 크래프팅 UI에 연동하는 것까지 하려고 했는데 Git 충돌이 생겨 해결한다고 시간을 조금 잡아먹었다.

작업 완료 기능

  1. 플레이어 회전 마우스 y입력값 적용 수정
  2. 플레이어 문 - 상호작용 상태, 모션 구현
  3. 총알 탄피 모션 추출
  4. 공격/피격 타이밍 로직 구현
  5. 몬스터 AI, 모션 연동
  6. 인벤토리, 루팅, 퀵슬롯 UI 적용
  7. 플레이어 파라미터 UI 연동
  8. 레시피 S.O 자동 생성 툴 구현

작업 중 기능

  1. 낙하 데미지 구현, 계단 인식 구현
  2. 공격 모션에 선딜, 후딜, 쿨타임 적용
  3. 몬스터 공격 로직, 모션 연동, InGame 맵에서 NavMesh Bake 확인
  4. 크래프팅 기능 구현
  5. 레시피 - 크래프팅 UI 연동, 레시피 관리
  6. URP 변환 작업 진행

코드 공유

이번에 공유할 코드는 캐릭터 파라미터와 UI 연동에 활용한 MVP 패턴이다. 실제 코드는 파라미터 간 상호작용이 있어 조금 더 복잡하지만 정말 단순히

Model

public 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);
    }
}

View

public 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}";
    }
}

Presenter

public 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를 찾을 수 없습니다");
        }
    }
}
profile
뚠뚠뚠뚠

0개의 댓글