Unity 공부 (13)

도토코·2025년 3월 10일

Unity공부

목록 보기
13/22

Camera(3)


카메라가 벽을 만나면 벽보다 앞으로 이동

CameraController.cs

    void LateUpdate()
    {
        if (_mode == Define.CameraMode.QuaterView)
        {
            RaycastHit hit;
            if(Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall")))
            {
                float dist = (hit.point - _player.transform.position).magnitude * 0.8f;
                transform.position = _player.transform.position + _delta.normalized * dist;
            }
            else
            {
                transform.position = _player.transform.position + _delta;
                transform.LookAt(_player.transform);
            }
        }
    }

1. 벽과의 충돌 검사

if (Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall")))
  • Ray를 발사하여 벽과의 충돌 여부 확인
  • 시작점 : _Player.transform.position(플레이어 위치에서 발사)
  • 방향 : _delta (기본적인 카메라와 플레이어 사이의 적정 Vector3 거리)
  • 최대거리 : _delta.magnitude (카메라가 평소에 위치해야 하는 거리)
  • 충돌 대상 : "Wall"레이어를 가진 오브젝트

2. 벽을 통과하지 않도록 카메라 거리 조절

float dist = (hit.point - _player.transform.position).magnitude * 0.8f;
  • 벽에 부딪힌 지점(hit.point)과 플레이어 위치 사이의 거리(magnitude)를 구함
  • 거리를 80%만 유지하여, 카메라가 벽에 너무 가깝지 않게 조절

3. 벽이 있으면 가까운 거리에 배치

transform.position = _player.transform.position + _delta.normalized * dist;
  • 원래 카메라 위치(_player.transform.position) 대신 계산된 거리(dist)만큼 플레이어의 방향으로 이동한 위치에 카메라 설치
  • 벽이 있을 경우, 원래 위치보다 앞으로 이동하여 벽을 뚫지 않음

4. 벽이 없으면, 기본 위치 유지

else
{
    transform.position = _player.transform.position + _delta;
    transform.LookAt(_player.transform);
}
  • 벽이 감지되지 않으면, 카메라를 원래 거리(_delta)만큼 유지
  • 그리고 캐릭터를 바라보도록 회전
profile
코(딩)(꿈)나무

0개의 댓글