오늘은 만들고 있는 게임 코드를 전반적으로 다시 살펴보는 시간을 가졌다.
먼저 플레이어의 이동을 담당하는 InputSystem 이번에는 Behavior를 SendMessages가 아닌 InvokeUnityEvents로 해보았다. 버튼ui의 onclick처럼 이벤트를 등록해서 사용할 수 있다.
InputSystem
위 사진처럼 플레이어에서 사용할 인풋 이벤트를 넣어주었다.
이번에는 jump에서 vector2가 아닌 delta값을 받아주었다.
Delta는 마우스나 조이스틱 등의 장치에서 "이동량"을 의미한다.
Delta말고 vector2로도 구현이 가능하지만 delta는 마우스의 이동변화량을 바로 받아 회전을 구현할 수 있지만, vector2는
//vector2
mouseDelta = context.ReadValue<Vector2>() - new Vector2(Screen.width / 2, Screen.height / 2);
//delta
mouseDelta = context.ReadValue<Vector2>();
이런식으로 화면의 중심과 비교해서 상대적인 위치 변화량을 계산해주어야 한다.
1인칭 같은 게임에서는 Delta가 더 사용하기 좋을것 같다!
RayCast
점프를 구현할 때, 바닥에 플레이어가 닿아있다면, 점프를 할 수 없어야 하는데 이를 구현하기 위해 ray를 쏴서 검사를 해준다.
private bool isGrounded()
{
Ray[] rays = new Ray[4]
{
new Ray(transform.position + (transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
new Ray(transform.position + (-transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
new Ray(transform.position + (transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down),
new Ray(transform.position + (-transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down)
};
for (int i = 0; i < rays.Length; i++)
{
if (Physics.Raycast(rays[i], 0.1f, groundLayerMask))
{
return true;
}
}
return false;
}
위 코드처럼 ray를 총 4개 생성하여, 정확도를 높히는 방법으로 사용하였다.
바닥이 평평하지 않는 곳도 있을 수 있기에, player위치에서 0.2만큼 앞뒤좌우에서 그리고 플레이어가 0,0,0에 있을 때, 즉 바닥과 붙어있을 때는 ray가 인지오류를 발생할 수 있으니, 살짝 위로 띄어주기위해 up으로 0.01정도 올려주고 vector3.down으로 아래방향에 ray를 쏘도록 하였다.
for문으로 raycast를 돌려 ground에 해당하는 layermask가 있다면 true를 반환하여 바닥에 있는지를 검사한다.
Raycast 작성
Raycast(ray, maxdistance, layermask)
이런식으로 작성해주면 된다.
ray가 닿은 물체의 정보를 얻고 싶을 때는 RaycastHit을 이용하면 닿은 오브젝트 정보를 가져올 수 있다.
이럴땐,
Raycast(ray, out hit, maxdistance, layermask)
이런식으로 작성하면 된다.
움직임 파트는 이정도로만 하고 다음시간에,,이어서 정리를,,