ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 마우스 클릭 지점으로 캐릭터 회전 + 이동시키기
    Unity유니티/캐릭터 2022. 6. 14. 19:53

    마우스를 클릭하였을떄 해당좌표로 캐릭터를 이동 + 회전 시키는걸 만들어보고싶다

     

    유니티에선 편하게 제공되는것이 많기에 그걸 적극 이용할 생각이다

    먼저 Input.mousePosition이 있다, F12로 들어가서 확인해보면

     

    픽셀좌표계에서의 현재  마우스포지션값을 가져올수있다

     

     

    유니터의 기본 카메라, 메인카메라를 호출해 사용할수있는 다른 함수도 있는데

    Camera.main.ScreenPointToRay가 있다

    인자를 보면  Vector3 position 이 있고

    설명으로는

    카메라에서 스크린을 통과하는 점을 반환한다고 한다

    그리고 반환값이 레이 구조체이다

    레이캐스트를 써야겠다!

    RatcastHit 구조체가 있다

    레이를 쏘고 어떠한 충돌이 일어낫을떄 , 즉 레이가 어떠한것에 닿앗을떄 그 정보를

    담아두고 추후 사용을 할떄 써먹는 아주 좋은 구조체이다

    또한 Camera.main.ScreenPointToRay(Input.mousePosition) 함수로

    사용할 레이또한 만들었다

    Physics.Raycast(ray, out hit)

    레이구조체 내부를 F12로 보면 레이의 오리진, 출발지점과

    Direction 방향또한 있는걸 알수가 있다

    그래서 ray를 생성후 인자로 넣을시 시작지점과 방향도 넣은셈이된다

     

    (주석의 "방향벡터구하기"는 지우는걸 깜빡한것같다)

    먼저 dest 변수는 가야할 목적지 변수이다

    hit가 충돌한 정보를 가지고있는데

    충돌한 정보란! 내가 스크린에서 마우스 클릭을 하였을떄,

    해당방향으로 레이가 발사되고 어떠한 오브젝트에 닿앗을떄! 그 오브젝트 정보를 가지고있다

    그래서 충돌체의 위치지점이 가야할 목적지가 된다 (허나 난 xz로 이동을 하기에 y값은 고정하였다)

    그리고 회전량을 의미하는 degree변수도있다

     

    Managers._Rot.Rot_Q4는 일전에 만들어둔 함수인데

    인자로 현재 플레이어Transform과   타겟의 Vector3이다

     

     

    전방벡터, 방향벡터 그리고 외적을 구한다

    외적을 구하는 이유로는 내 좌우 방향을 판단하려고!

     

    그후 전방벡터와 방향사이의 내적으로 회전량을 구해보았다

     

    끝으로 아까 구해두었던 외적의 값으로 방향을 구했다 하엿는데

    좌 우 마다 반전한 회전값을 적용하여 마지막 Angle 값을 반환해준다.

     

     

    마지막으로 함수를 나와 어디로 이동해야하는지 그리고 얼마나 회전하는지 그 총량들을 구했기에

    회전과 이동을 시키면 된다

    마우스 한번 클릭으로 서서히 이동하는 그림이 떠올라서

    코루틴을 쓰는게 어떨까 싶었다

    코루틴 실행전, 스탑올코루틴을 넣은 이유는

    내가 클릭후 곧바로 다른 곳을 클릭할떄 위치와 회전을 새로 해야할테니

    코루틴을 중지시키고 바뀐 값으로 새코루틴을 실행하기로했다

     

    코루틴은 2개이고 파라미터 구조는 같다

    현재 플레이어Transform, 각도나 목적지, 시간량이다

    time은 총 어느만큼의 시간을 최대치로 잡을지 리미트개념으로 넣엇는데

    단거리 이동을 방금 시켜보니 큰 의미가 없는거같다...(항상 내가 만드는건 럭비공같이 어디로 튈지를 모르겠다)

    내부의 변수 elapsedTime은 경과시간을 의미하는데, 코루틴내 실행할 Lerp의 t역할이 되어준다

    끝으로 yield return null은  한 프레임마다 잠깐 쉬어주는것이다 사실 특별한 이유는 없고 반복문에 어울리는거같다

     

    초라하지만.. 완성본!

    아쉬운게 좀 있지만 앞으로도 더 기본기를 쌓아야겠다

Designed by Tistory.