티스토리 뷰
대부분의 게임은 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를 적용하면 힙해진다.
'■ 기타 공부들 > ◻ Unity' 카테고리의 다른 글
씬 간의 이동과 플레이어 로드 (0) | 2018.09.13 |
---|---|
LitJson을 이용한 데이터 로드/저장 (+ 안드로이드) (1) | 2018.09.04 |
스크립트의 유기적 관계 (0) | 2018.08.02 |
[Unity2D]2D 애니메이션 적용 과정과 스크립트 (0) | 2018.07.27 |
테스트 (0) | 2018.07.27 |