반응형
플레이어가 따라가던 카메라가 벽에 막히면 벽 뚫기
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
반응형
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - Mouse입력 Action으로 처리해보기 (0) | 2023.09.15 |
---|---|
Unity - Mathf.Clamp (0) | 2023.09.15 |
Unity - Physics.OverlapBox 설명(플레이어 바닥 체크에 이용해보기) (0) | 2023.09.09 |
Unity - Bounds 속성 2D기준 설명 (0) | 2023.09.09 |
Unity - Tilemap에서 BoundsInt의 Properites , PositionEnumerator 구조체 (0) | 2023.08.17 |
댓글