728x90
이 글은 Inflearn - Rookiss : C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 듣고 정리한 글입니다.

 

목차.

  1. 개요
  2. 코드
  3. 코드분석
  4. 카메라가 장애물을 통과하는 모습

 

개요

 

유니티 게임 개발 중, 플레이어와 카메라 사이에 장애물이 있을 때, 이러한 장애물을 감지하고 카메라를 조정하는 것은 대부분의 게임 환경서 필수적인 요소 중 하나입니다.

이 글에서는 유니티에서 오브젝트와 플레이어 사이에 오브젝트가 있다면 카메라를 플레이어에게 가까이 이동시키는 코드를 구현해 보겠습니다.

 

 

코드

 

  private void LateUpdate()
    {
        if (_mode == Define.CameraMode.QuarterView) 
        {
            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);
            }
        }
    }

 

코드분석

dist : 카메라로부터 플레이어 방향으로 Raycast를 쏘고 hit.point- 플레이어 위치의 결과 크기 벡터를 0.8 곱셈

 

_delta : 플레이어를 바라보고 있는 카메라의 방향으로 현재 (0,6,-5)로 설정

 

1. Physics.Raycast를 사용하여 플레이어에서 레이를 쏴, 레이가 "Wall"레이어에 부딪히면 장애물이 있다고 간주합니다.

2. 장애물이 감지되면, 해당 지점까지의 거리를 계산하고 카메라를 이동시켜 장애물을 피합니다.

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

3. 장애물이 감지되지 않으면 카메라는 플레이어를 향해 일정 거리를 유지시킵니다.

 else 
 {
     transform.position = _player.transform.position + _delta;
     transform.LookAt(_player.transform);
 }

 

카메라가 장애물을 통과하는 모습

 

카메라가-장애물을-피하는모습
카메라가 장애물을 피하는모습

 

이번 글에서 Raycast를 사용해서 카메라와 플레이어 사이에 장애물이 있다면,

카메라와 플레이어 사이의 거리를 줄여서 장애물을 피하는 기능을 구현했습니다.

728x90

+ Recent posts