본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 - 50

by LemongO 2024. 3. 21.

 

 


Bullet 피격과 HUD UI 연동

 

Bullet 피격은 탄막을 작업하는 팀원과 엮이는 부분이기 때문에 합체!를 하는 과정이 필요했다.

 

public enum BulletOwner
{
    Player,
    Enemy,
}

public class Bullet : PoolAble
{
    [SerializeField] BulletOwner owenr;

    private void OnTriggerEnter(Collider other)
    {
        switch (owenr)
        {
            case BulletOwner.Player:
                if (other.TryGetComponent(out Boss boss) == true && owenr == BulletOwner.Player)
                {
                    boss.GetDamaged(5);

                    EnemyBulletPoolManager.instance.OnReturnedToPool(gameObject);
                }
                break;

                // 콜리젼으로 바뀜
            //case BulletOwner.Enemy:
            //    if (other.TryGetComponent(out PlayerStateMachine playerState) == true && owenr == BulletOwner.Enemy)
            //    {
            //        playerState.Player.GetDamage(5);

            //        EnemyBulletPoolManager.instance.OnReturnedToPool(gameObject);
            //    }
            //    break;
        }
    }
}

 

Bullet이라는 부모 클래스에서 현재 Bullet을 발사한 주체가 누구인지 확인하기 위해 Enum BulletOwner를 받아

트리거 체크를 하게 해주었고, TryGetComponent를 통해 Bullet이 타격해야할 대상이 맞다면

GetDamage 메서드를 호출해 데미지를 입히도록 해주었다.

 

그리고 이 또한 피격 시 체력UI 변화가 필요했고 하는김에 현재 만들어 놓은 모든 HUD UI를 연동시키게 하였다.

 

// ### Boss.cs

public void GetDamaged(float damage)
{
    CurrentHelth = Mathf.Max(0, CurrentHelth - damage);
    float percent = CurrentHelth / Data.maxHealth;
    Managers.ActionManager.CallBossAPChanged(percent);
    if(CurrentHelth <= 0)
        IsAlive = false;
}

보스가 피격당할 때 CallBossApChanged를 호출하여 현재체력 / 전체체력 퍼센트를 넘겨줬다.

 

플레이어 또한 비슷한 맥락

// ### PlayerStatus.cs

public static event Action<float, float> OnChangeArmorPoint;

public void GetDamage(float damage)
 {
     _currentArmor -= damage;
     if (_currentArmor <= 0)
         Dead();
     OnChangeArmorPoint?.Invoke(Armor, _currentArmor);
 }

 

부스터 또한 사용 시 대기시간을 시각적으로 알릴 수 있으면 좋기 때문에 이벤트 처리하였다.

// ### PlayerStateMachine

private void HandleDashCoolDown()
{
    if (_dashCoolDownTime >= TIME_TO_SWITCHABLE_DASH_MODE)
        return;

    _dashCoolDownTime += Time.deltaTime;
    float percent = _dashCoolDownTime / TIME_TO_SWITCHABLE_DASH_MODE;
    Managers.ActionManager.CallUseBooster(percent);

    if (_dashCoolDownTime >= TIME_TO_SWITCHABLE_DASH_MODE)
    {
        CanDash = true;
        _dashCoolDownTime = TIME_TO_SWITCHABLE_DASH_MODE;        
    }
}

 

리페어 키트또한 마찬가지

// ### PlayerStatus.cs

public void Repair()
{
    _currentArmor = Mathf.Min(_currentArmor + 250, Armor);
    OnChangeArmorPoint?.Invoke(Armor, _currentArmor);
}

 

그리고 이 모든것은 HUD 에서 적용된다.

// ### UI_HUD.cs

PlayerStatus.OnChangeArmorPoint += ChangeAPValue;
Managers.ActionManager.OnCoolDownRepair += (percent) => _repairFill.fillAmount = percent;
Managers.ActionManager.OnCoolDownBooster += (percent) => _boosterFill.fillAmount = percent;
Managers.ActionManager.OnBossAPChanged += (percent) => _bossAPFill.fillAmount = percent;