관리 메뉴

도드넷

게임 제작 일지#3 - 유니티 유닛을 이동시켜보자 대각선이동 함수! 본문

창고/게임 제작 [시즌2]

게임 제작 일지#3 - 유니티 유닛을 이동시켜보자 대각선이동 함수!

도드! 2016. 10. 5. 14:32
반응형





게임 제작 일지#3 - 유니티 유닛을 이동시켜 보자!


유닛 선택은 했으니 이제 유닛을 이동시켜 보자!


유닛 명령은 플레이어 컨트롤 스크립트에서 우클릭 명령을 받으면

선택된 유닛에게 목적지와 이동명령을 하달하는 방식으로 작동된다.


#1 유닛에 이동속도 넣기


        This_Rigidbody.velocity = new Vector2(This_Stats.X_Speed, This_Stats.Y_Speed);


당연한 이야기지만 물리(속도)처리를 위한 리지드 바디 필요!


#2 유닛 이동속도 설정하기


특별한 메소드는 필요없고 만약 목적지가 현재 유닛 위치보다 앞에있으면 + 속도를 뒤에있으면 - 속도를 넣어준다.


일부핵심만 보면,


            if (This_Transform.position.x - Destination.x < 0.05)
            {
                if (X_diff < Y_diff)
                {
                    This_Stats.X_Speed = This_Stats.Movement_Speed * Diff_Ratio;
                }
                else
                {
                    This_Stats.X_Speed = This_Stats.Movement_Speed;
                }
            }
            else if (This_Transform.position.x - Destination.x > 0.05)
            {
                if (X_diff < Y_diff)
                {
                    This_Stats.X_Speed = -This_Stats.Movement_Speed * Diff_Ratio;
                }
                else
                {
                    This_Stats.X_Speed = -This_Stats.Movement_Speed;
                }
            }


0.05 라는 값은 여유값으로 if 구문간에 무한 핑퐁을 없애준다.


보면 약간 특이한 변수가 있는데 X_Diff 와 Y_Diff 그리고 Diff_Ratio 라는게 있다.

이건 물체의 효율적인 대각선 움직임을 위한 수단이 된다.


#3 대각선 이동에 대하여



대각선 이동시 X속도와 Y속도를 같은 크기로 조절하면 X Y 크기가 다른 대각선 이동시 비효율적으로 이동하게 된다.

위처럼 빨강점에서 파랑점으로 이동하는데 하늘색 경로가면 훨씬 비효율적이고 어색하다.


그럼 보라색처럼 이동하게 하려면 어떻게 해야할까?


아이러니하게도(?) 속도를 줄여야 더 빨리 도착하게 된다. 


속도는 물체의 위치와 목적지간의 차이가 적은쪽에서 줄여야한다. (위같은경우 Y)


그럼 얼마나 줄여야할까?


X 차이값과 Y 차이값중 큰쪽이 분모가되고 작은쪽이 분자가되는 비율식을 만들고


이것을 차이값이 작은쪽 (속도가 줄어야하는쪽)에 곱해준다.



#4 멈춤 시스템



            // 멈춤
            float XAbs = Mathf.Abs(This_Transform.position.x - Destination.x);
            float YAbs = Mathf.Abs(This_Transform.position.y - Destination.y);

            if (XAbs < 0.05)
            {
                This_Stats.X_Speed = 0;
            }

            if (YAbs < 0.05)
            {
                This_Stats.Y_Speed = 0;
            }

            if (This_Stats.X_Speed == 0 && This_Stats.Y_Speed == 0)
            {
                Order = "Idle";
                This_Anim_Controller.Anim_State = "Idle";
            }



두 점 사이의 거리는 두값을 뺀후 절대값을 취하면 된다.


도착지점과 현재 위치의 거리가 일정수(0.05) 아래로 떨어지면 현재속도를 0으로 해서 멈춘다.


만약 X속도와 Y속도가 0이면 X,Y 모두 도착한것으로 간주 현재 명령을 Idle로 바꾼다.









반응형
Comments