728x90

저번에는 키보드로 단순하게 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)입니다

 

마찰이 없을때 AddForce로 이동하면 일어나는 모습

 

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이 되도록 해주었습니다

 

*여기서 점프를 했을 때 마찰은 없지만 점프하고 키를 누르면 엄청 빠르게 날아가는 문제가 있습니다.

 

결과

 

마찰력이 적용된 모습

 

 

728x90

+ Recent posts