저번에는 키보드로 단순하게 AddForce 이동 구현했었습니다.
여기서 추가적으로 오브젝트가 움직이는 방향으로 회전하게 만들고
바닥을 체크해서 Drag값을 제어해보겠습니다.
움직이는 방향이 앞이 되도록 코드를 한번 작성해봤습니다.
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), Time.deltaTime * 10); |
Quaternion.Lerp 함수인자로 (Quaternion a , Quaternion b , float t)가 들어갑니다
회전시키려는 오브젝트를 첫번째 인자로 넣었고 두 번째는 입력에 따라 앞을 보게 하는 함수 LookRotation을 넣어줬습니다.
게임을 실행해보면 키 입력에 따라 정상적으로 회전하는 모습을 볼 수 있습니다 하지만 키를 입력하지 않으면 다시 앞을 바라보는 문제가 있습니다 그래서 키를 입력하지 않는다면 회전하지 않도록 해주었습니다.
if(horizontal != 0 || vertical != 0) |
간단한 조건문을 통해 horizontal과 vertical 둘 중 하나만이라도 0이 아니라면 회전하고 둘 다 0이라면 회전을 하지 않게 해주는 조건문입니다.
그럼 이제 어떤 문제가 남아있을까요?
마찰력(drag)입니다
transform.Translate로 이동을 구현한다면 마찰력은 전혀 문제가 되지 않습니다 마찰과 상관없이 오브젝트 위치 그 자체를 이동시키는 코드이기 때문인데
반면 AddForce는 물리작용을 통해 이동시키기 때문에 영향을 받습니다
오브젝트의 drag값을 높인다면 이런 일은 없겠지만 만약 점프를 했을 때 공중에서도 마찰이 적용돼서 천천히 점프하고 천천히 낙하하면 엄청 부자연스러울 것입니다.
그래서 바닥을 체크해서 바닥에서만 마찰이 적용되고 공중이라면 적용되지 않게 해 보겠습니다.
bool grounded;
public LayerMask groundcheck;
void Update()
{
InputK();
grounded = Physics.Raycast(transform.position, Vector3.down, 1* 0.5f + 0.2f, groundcheck);//오브젝트의 y값 1
if (grounded)
rigidbody.drag = 3;
else
rigidbody.drag = 0;
}
Physics.Raycast를 통해 오브젝트 밑에 ray를 쏴서 충돌하고 그게 groundcheck라는 레이어라면 grounded에 true값이 들어가게 될 것입니다
그래서 만약 바닥이 groundcheck 레이어라면 마찰력이 3 아니라면 0이 되도록 해주었습니다
*여기서 점프를 했을 때 마찰은 없지만 점프하고 키를 누르면 엄청 빠르게 날아가는 문제가 있습니다.
결과
'유니티' 카테고리의 다른 글
[Unity] 유니티 : Raycast LayerMask 다루기 (0) | 2022.08.25 |
---|---|
[Unity 3D] 유니티 3D : 그림자 갈라짐, 끊어짐 현상 (0) | 2022.08.25 |
[Unity 3D] 유니티 3D : AddForce 이동구현(1) (1) | 2022.08.23 |
[Unity 3D] 오브젝트의 속도 측정하기 (0) | 2022.08.19 |
[Unity] 코드로 Text,TextMeshPro 출력하기 (0) | 2022.08.19 |