sleepyotter
Camera 본문
게임 내 화면을 보여주는 녀석
디아블로 같은 게임을 보면 카메라가 플레이어를 따라다니는데, Camera Controller를 따로 사용하어 셜정한다.
Controller - Camera의 관계로 엮어주어 Controller에 player캐릭터를 붙여 해당 캐릭터의 상대 좌표로 이동하도록 하는 update() 함수를 수정하면 된다.
void Update()
{
transform.position = _player.transform.position + _delta;
}
_delta는 플레이어로부터의 원하는 카메라 위치로의 벡터이다. 카메라 위치가 플레이어로부터 _delta만큼 떨어져 있다고 보면 될듯.
이걸 실행하다보면 카메라가 분명 캐릭터를 따라가는데, 캐릭터가 부드부들 거리는게 보일 것이다.
이 문제는 캐릭터가 움직이고 카메라가 움직일지, 카메라가 움직이고 캐릭터가 움직일지가 똑같은 Update()함수에 있어서 Unity가 자기 맘대로 여러 Update()들을 호출하기 때문에 순서가 일정하지 않아서 그렇다. LateUpdate()를 어느 한쪽에 적용해주면 해결된다.
디아블로처럼 카메라에서 땅을 찍은 위치로 이동케하고 싶다면, Raycast를 사용한다. Raycast를 사용하여 땅과 충돌하도록 설정해주고, hit.position을 사용하면 찍은 땅의 좌표를 알 수 있다. 그러면 PlayerController 혹은 조작중인 캐릭터의 위치를 관리하는 쪽에서 update마다 해당 위치로 조금씩 이동하게 해주면 될 것이다.(순간이동 하면 좀 어색하니까) 하는 방법은 Time.deltatime 이었나? 를 곱해주고, speed라는 값을 따로 줘서 speed값을 바꿔가며 속도를 조절해서 이동해주면 된다.
그리고 스타1에서 폭탄피하기나 러커 겹치기를 해보았다면 알겠지만, 바로 앞의 지점을 클릭하면 움직이지 않는 경우가 있다. 이는 speed값에 따른 최소이동거리값이 앞으로 가야할 거리보다 짧은 경우 이동하지 않게 한거라 생각된다. 만약 이동하게 되면 해당 지점을 오버해서 이동해버리니까. 이럴때, clamp를 사용해서 찝어주면 된다.
와우는...조금 해봤고 마영전을 좀 했었는데, 이런 3D RPG에서는 벽에 캐릭터가 가깝거나 붙어 있는 경우 카메라가 벽과 캐릭터 사이에 착 붙어가지고 캐릭터가 엄청 확대된다.(특정 목적으로 활용한 사람이 많을 것이라 생각한다^^)
이것은 어떻게 구현하냐면 마찬가지로 카메라와 캐릭터 사이에 Raycast를 사용하여 벽에 충돌했을시, 카메라 위치를 캐릭터와 벽 사이에서 벽 사이에 좀 더 가깝게 바꿔주면 된다.
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;
}
hit이야 raycast했을 때 충돌한 결과값을 담을 클래스이고,
if문 안은 Raycast를 했을때, player위치에서 카메라방향(_delta)로 광선을 쐈을 때(길이는 딱 플레이어에서 카메라까지 magnitude활용), 최적화를 위해 layer를 사용하여 벽과 추돌이 있는지 확인한다.
만약 충돌이 있다면 길이를 구한다. 벽과 추돌한 지점 ~ 플레이어 까지의 거리를 구하고 이것의 0.8배를 해준다.
그리고 카메라의 위치를 플레이어의 위치로부터 원래 카메라 방향으로 아까 구한 0.8배 거리만큼 옮겨주면 된다.
무슨 말이냐? 아래 그림과 같다.
'프로그래밍 > UnityEngine기초' 카테고리의 다른 글
State패턴 (0) | 2021.09.04 |
---|---|
Animation (0) | 2021.09.04 |
Ray Casting (0) | 2021.08.17 |
Collision and Trigger (0) | 2021.08.17 |
개요 (0) | 2021.08.17 |