One_KWS

게임 개발 일지 #4 - 몬스터 데미지, 체력바, 카메라 이동 본문

게임 개발

게임 개발 일지 #4 - 몬스터 데미지, 체력바, 카메라 이동

One-Kim 2023. 1. 13. 21:25

몬스터에게 데미지 주기

공격 범위 내에 몬스터가 있는지 판단하기 위해 Physics.OverlapBox 함수를 사용했다. 플레이어의 앞에 직사각형 범위의 몬스터들을 감지하고 몬스터의 Health 클래스의 TakeDamage 함수를 통해 데미지를 전달해 주도록 구현했다.

public class PlayerCombat : MonoBehaviour, IBehaviour {
	
    ...
    
    private readonly Vector3 HALF_EXTENTS = new Vector3(1f, 0.5f, 1f);
	
    ...

    private void TakeDamageToEnemies() {
        var center = transform.position + transform.forward.normalized + Vector3.up;
        var enemies = Physics.OverlapBox(center, HALF_EXTENTS, Quaternion.identity);

        foreach (var enemyCollider in enemies) {
            var health = enemyCollider.GetComponent<Health>();
            if (health != null && health.gameObject.CompareTag("Player")) {
                continue;
            }

            health?.TakeDamage(weapon.Damage);
        }
    }   
}

 

OnDrawGizmosSelected 함수를 이용하여 OverlapBox의 범위를 Gizmo로 표시하면 아래와 같이 보인다. 

//플레이어가 선택되었을 때 Gizmo를 그린다.
private void OnDrawGizmosSelected() {
    var center = transform.position + transform.forward.normalized + Vector3.up;
    var halfExtents = new Vector3(1f, 0.5f, 1f);
    Gizmos.DrawWireCube(center, halfExtents);
}

  

체력바 

체력바를 만들기 위해 Slider를 만들었고 Handle 같은 필요없는 부분은 삭제했다. 항상 카메라의 정면으로만 보이게 하도록 체력바의 forward를 카메라와 일치시켜 주었다. 또한 몬스터나 플레이어의 Health 클래스에서 현재 체력과 최대 체력을 제어해 줄 수 있도록 MaxHealth, CurrentHealth 프로퍼티를 만들었다.

HealthBar의 Hierachy

public class HealthBar : MonoBehaviour {
    [SerializeField] private Slider slider_health;

    public float MaxHealth {
        get => slider_health.maxValue;
        set => slider_health.maxValue = value;
    }

    public float CurrentHealth {
        get => slider_health.value;
        set => slider_health.value = value;
    }

    private Camera mainCamera;

    private void Awake() {
        mainCamera = Camera.main;
    }

    private void Update() {
        transform.forward = mainCamera.transform.forward;
    }
}

 

Health 클래스에서는 아래와 같이 사용했다. Awake에서 체력값을 초기화해주고 공격을 받을 때 TakeDamage 함수에서 현재 체력값을 변경하여 체력바에도 반영되도록 했다.

private float healthPoint = 100f;

private void Awake() {
    ...
    
    //체력바 초기값 설정
    healthBar.MaxHealth = healthPoint;
    healthBar.CurrentHealth = healthPoint;
}


public void TakeDamage(float damage) {
    healthPoint -= damage;
    healthBar.CurrentHealth = healthPoint;
    ...
}

 

 

카메라

카메라는 Cinemachine을 사용했다. Virtual Camera를 만들고 Follow를  Player로 설정해 주었다. 

 

Virtual Camera의 Body Damping X, Y 값과 Soft Zone Width/Height 값을 아래와 같이 설정해서 카메라가 부드럽게 따라오도록 했다.

Cinemachine 적용