티스토리 뷰

대부분의 게임은 2D던 3D던 간에 상관없이 상하좌우 입력을 받은 만큼 부드럽게 이동하지만, 정해진 픽셀단위만큼 이동해야 하는 게임도 있다. (ex) 턴 제 이동게임)

그런 경우 멋없게 띡띡 이동할 수는 없는 노릇인데, Mathf.Lerp를 이용해 보간값을 가지고 움직임을 매끄럽게 만들어 줄 수 있다.

  
    	IEnumerator smoothMove()
	{
    	while(Input.GetAxisRaw("Horizontal") != 0 || Input.GetAxisRaw("Vertical") != 0)
    	{
            animator.SetFloat("DirX", 0);
            animator.SetFloat("DirY", 0);
        	vector = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * pixelMove;
        	float walkCountReciprocal = 1f / walkCount;
            applyRunCount = walkCount;
        	Vector2 endPosition;
        	if(Input.GetKey(KeyCode.LeftShift))
        	{
          	  applyRunCount = walkCount / 2;
        	}
        	if (vector.x != 0)
        	{
                animator.SetFloat("DirX", vector.x);
                currentWalkCount = 0;
                endPosition = rigidbody.position + Vector2.right * vector.x;
            	while (currentWalkCount != applyRunCount)
            	{
                    rigidbody.MovePosition(Vector2.Lerp(rigidbody.position, endPosition, currentWalkCount * walkCountReciprocal));
                    currentWalkCount++;
                    yield return null;
            	}
        	}
        	else
        	{
                animator.SetFloat("DirY", vector.y);
                currentWalkCount = 0;
                endPosition = rigidbody.position + Vector2.up * vector.y;
            	while (currentWalkCount != applyRunCount)
            	{
                    rigidbody.MovePosition(Vector2.Lerp(rigidbody.position, endPosition, currentWalkCount * walkCountReciprocal));
                    currentWalkCount++;
                    yield return null;
            	}
        	}
 
    	}
    	canMove = true;
        animator.SetBool("Walking", false);
 
	}

속도 조정 변수 : walkCount

이동 거리 : pixelMove


매커니즘 : 코루틴을 사용

Input.getAxisRaw로 특정 입력을 받으면 x축, y축으로 값을 나눠서 진행. (대각선 이동 X)

이동할 위치(endPosition) : 입력받은 값을 벡터화 -> 정규화 * 이동할 픽셀단위(pixelMove) walkCount를 지정하면 currentwalkCount는 이 코루틴이 돌아갈때마다 1씩 증가하고 결과적으로 walkCount == currentwalkCount일때까지 돌아간다.

이동은 Mathf.Lerp를 통해 깔끔하게 움직이게 한다. 시작점 : 현재 위치, 도착점 : 아까 계산한 도착위치, 보간값 : currentwalkCount/walkCount (0~1)까지 값이 일정하게 변한다.

다만 나누기는 연산이 크기 때문에 1/walkCount 값을 따로 계산해둬서 코루틴 내에서는 곱셈만 하도록 한다.

하나의 코루틴이 돌아가는 동안에는 이 코루틴이 또 실행되지 않게 해야 한다. (한번의 깔끔한 이동 후에 다음 이동값을 받아들여야 함) 따라서 canMove 값을 이용한다.


Mathf.Lerp는 그 외에 여러 오브젝트에 적용하기 좋다. 플랫포머 게임에서 으레 나오는 부유하는 이동 발판이나, 공포게임에서 끼익대며 흔들리는 조명까지도 Mathf.Lerp를 적용하면 힙해진다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함