본문 바로가기
유니티 공부/Unity

Unity - 플레이어 따라가던 카메라가 벽에 막히면 벽 뚫기

by 코딩하는 돼징 2023. 9. 15.
반응형

플레이어가 따라가던 카메라가 벽에 막히면 벽 뚫기

1. Define 설정하기

Define.cs

public enum CameraMode
{
    QuaterView,
}

2. 변수 설정

CameraContorller.cs

[SerializeField]
Define.CameraMode _mode = Define.CameraMode.QuaterView;
[SerializeField]
Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f);
[SerializeField]
GameObject _player = null;

_mode = Define의 CameraMode 상태를 선택 -> 디폴트 값을 QuaterView로 설정

_delta = 카메라의 위치를 플레이어 위치에서 얼마나 떨어져 배치할지

(미리 카메라를 플레이어의 자식으로 한번 넣어보고 난 후 얼마만큼의 거리가 좋을지 카메라의 로컬 적정 위치를 설정)

_player  = 플레이어의 위치 + _delta 값을 카메라의 위치


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); // 무조건 상대 오브젝트 트랜스폼을 강제로 로테이션 시킴
        }
    }
}

01 Raycast가 벽에 충돌한 경우를 처리

(hit.point - _player.transform.position).magnitude는 플레이어와 충돌 지점 사이의 거리를 계산한다. 이를 0.8f을 곱해주면서 카메라가 플레이어에 너무 가깝게 붙지 않고 장애물과의 간격을 유지한다.

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

-카메라 위치를 조금 앞당겨야 하므로

trasform.position = _player.transform.position * _delta.normalized * dist;


02 Raycast가 벽에 충돌하지 않는 경우

카메라를 기본적으로 _delta거리에 위치시키고 LookAt를 사용하여 카메라가 플레이어를 바라보도록 한다.

else
{
    transform.position = _player.transform.position + _delta;
    transform.LookAt(_player.transform); // 무조건 상대 오브젝트 트랜스폼을 강제로 로테이션 시킴
}

 

-

 

 

 

 

 

 

 

참고 :  본 내용은 MMORPG  PART3 강의를 수강하여 작성하였습니다.

https://www.inflearn.com/course/mmorpg-%EC%9C%A0%EB%8B%88%ED%8B%B0/dashboard

 

 

 

 

 

반응형

댓글