오브젝트 원하는 위치로 이동시키기(USE. 코루틴)
오브젝트 원하는 위치로 천천히이동시키기
화살표 버튼을 눌렀을 때 왼쪽버튼을 누르면 왼쪽으로 이동하고
오른쪽 버튼을 누르면 오른쪽으로 이동하는 코드를 만들려고 한다
맨처음에 이 문제로 엄청 애를 먹었다..
코드 대로 라면 정상적으로 이동이 되어야하는데
내가 원하는대로 구현이 되지 않아서 의문이였는데
유니티에서 보통 오브젝트를 움직이거나 서서히 변화를 주기 위해서
프레임 단위마다 실행되는 Update() 함수에 코드를 작성한다고 한다.
그래서 대부분 원하는 위치로 이동시키에 대한 정보를 찾으면
대부분 Update()안에서 코드를 사용하는것을 볼 수있다.
Update는 프레임마다 실행되는 만큼 대부분의 작업을 의존하게되면 프레임 드롭같이 최적화 문제가 발생하고
필요하지 않은 경우에도 Update는 계속 돌아가기 때문에 Update는 거의 사용하지 않는 것이 좋다.
이렇게 버튼을 눌렀을 때 컷이 움직여
원하는 박스가 가운데 오도록 하는 방법을 구현하려고 하였다.
처음에 작성한 코드는 함수 안에 넣어서 특정 위치 값으로 이동할 수있도록
float speed 값을 조절해서 서서히 포지션의 값이 변하도록 만들었다.
if (!MovePos.Equals(-1200))
{
while (MovePos >= -1200)
{
Debug.Log("MovePOs : " + MovePos + "BaseMovePos :" + BaseMovePos);
Debug.Log("GamePanel.transform.position : " + GamePanel.transform.position);
MovePos -= speed;
GamePanel.transform.localPosition = new Vector3(MovePos, GamePanel.transform.localPosition.y, 0);
if (MovePos == -1200)
{
MovePos = -1200;
GamePanel.transform.localPosition = new Vector3(MovePos, GamePanel.transform.localPosition.y, 0);
break;
}
}
}
Coroutine으로 Update 대체하기 (Update 최적화)
버튼안에 코드를 넣어서 움직이게 하고싶기 때문에
업데이트안에서 작업하지 않고 움직이게 하고 싶어서 위와 같이 코드를 짯으나
이런식으로 코드를 짜게되면
Update 안에서 돌아가는 While 문이 아니라서 매우 빠르게 프레임이 돌아가서
서서히 움직이는 것이 아니라 버튼을 눌렀을 때
이미지가 전환되는 것 처럼 즉시 이동하는 것 처럼 카드가 이동한다.
내가 원하는 것은 서서히 움직여서 애니메이션 처럼 움직이는 것을 원하기 때문에 다음 코드를 수정을 하였다.
방법은 간단하다
코루틴을 사용해서
Update() 처럼
yield return new WaitForSeconds(0.1f);
를 작성하여 0.1초 마다 프레임을 주는 방법도 있고
yield return new WaitForEndOfFrame();
하나의 프레임이 완전히 종료될 때 호출이 되도록 해주었다.
IEnumerator _Move()
{
float MovePos = GamePanel.transform.localPosition.x;
float BaseMovePos = GamePanel.transform.localPosition.x;
float speed = 3f;
while (MovePos <= 1200)
{
Debug.Log("MovePOs : " + MovePos + "BaseMovePos :" + BaseMovePos);
MovePos += speed;
GamePanel.transform.localPosition = new Vector3(MovePos, GamePanel.transform.localPosition.y, 0);
if (MovePos >= 1200)
{
MovePos = 1200;
GamePanel.transform.localPosition = new Vector3(MovePos, GamePanel.transform.localPosition.y, 0);
break;
}
yield return new WaitForEndOfFrame();
}
}
이렇게 단 한줄만으로 완성...
진짜.. 뭐지했는데 이렇게 쉽게 해결될 것을 애먹었던
코루틴에 대한 설명이 잘되어 있어서 여기서 찾아봤다.
참조: http://theeye.pe.kr/archives/tag/waitforendofframe
WaitForEndOfFrame | 아이군의 블로그
유니티에서 사용되는 코루틴(Coroutine)은 왜 필요한가? 유니티에서 화면의 변화를 일으키기 위해서는 Update() 함수 내에서 작업을 하게 됩니다. 이 Update() 함수는 매 프레임을 그릴때마다 호출되며
theeye.pe.kr
[Unity] 유니티 코루틴(Coroutine)
보통 함수는 하나의 프레임내에서 명령이 실행되게 하는데, 여러 프레임에 걸쳐서 코드를 실행시키기 위한 함수가 코루틴(Coroutine)입니다. 쓰레드와 비슷하다고 느낄 수 있지만 비동기가 아니기
scvtwo.tistory.com