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

Unity - 플레이어가 이동할때 카메라가 플레이어 쳐다보게 하기

by 코딩하는 돼징 2023. 2. 21.
반응형

1. 카메라가 플레이어 쳐다보게 하기

01 Define.cs에 CamerMode 설정

public class Define
{
    public enum CameraMode
    {
        QuaterView,
    }
}

02 변수 설정

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

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


03 QuaterView setting

public void SetQuaterView(Vector3 delta)
{
    _mode = Define.CameraMode.QuaterView;
    _delta = delta;
}

04 매 프라임마다 카메라가 플레이어를 따라 이동하도록 설정

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

Update 문에 있으면 문제가 되는 이유
Player 둘다 업데이트 문에 있으므로 누가 먼저 업데이트 됐는지 몰라서 덜덜 떨려보인다.

해결방법

LateUpdate()사용하면된다. 그러면 Player Update 된 후 이동하기 떄문에 문제가 해결된다. 

void LateUpdate()
{
    if (_mode == Define.CameraMode.QuaterView)
    {
        transform.position = _player.transform.position + _delta;
        transform.LookAt(_player.transform); 
    }
}

3. 마우스로 캐릭터 이동 지점 설정

01 ScreenPointToRay를 통해 도착지점 설정

void OnMouseClicked(Define.MouseEvent evt)
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0F, Color.red, 1.0f);

    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Wall")))
    {
        _destPos = hit.point;
        _moveToDest= true;
    }
}

그림 참조


4. 플레이어 이동

01 이동 방향 설정

방향 벡터 = 도착 위치 - 플레이어 이동방향

Vector3 dir = _destPos - transform.position;

02 도착했는지 확인

1) 도착했을 경우

magnitude을 이용해서 도착 여부를 알 수 있다. 이는 벡터의 크기를 나타내는데 이게 0.001보다 작으면 도착했다고 간주한다.

if(dir.magnitude<0.001f) // 목적지 도착(magnitude = 벡터의 크기)
{
    _moveToDest = false;
}

2) 도착하지 않았을 경우

플레이어 이동시키기

else
{
    float moveDist = Mathf.Clamp(_speed*Time.deltTime,0,dir.magnitude);
    transform.position += dir.normalized * moveDist;
    transform.rotation = Quaternion.Slerp(tranform.rotation, Quaternion.LookRotation(dir), 10*Time.deltaTime);
    transform.LookAt(_destPos);
}

 

 

 

 

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

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

 

 

 

 

 

 

 

반응형

댓글