Cocos Creator

[2.4.5 버그] cc.tween repeatForever

밀하우스 마나스톰 2022. 3. 10. 16:36
this.infiniteRotate = cc.tween(this.wheel).delay(0.8).by(0.4, { angle : -360 }).repeatForever().start();

0.8초의 첫 대기시간을 가진 뒤, 0.4초동안 360도 회전하는 동작을 무한히 반복하는 코드다.

 

크리에이터 버전 2.4.5에서 잘 작동하던 코드가 2.4.8 버전업 하고나서 문제가 생겼다.

 

 

[Action update]. override me 라는 로그가 계속 찍히면서 오브젝트가 회전하지 않았다.

 

구글링 결과 확실히 버전과 연관이 있는 버그였다.

 

https://forum.cocos.org/t/2-1-2-tween-repeatforever/80820

 

 

(중국어 답변을 구글 번역기로 돌림) 여러 차례 이 글을 읽어본 결과.

 

"모든 FiniteTimeAction이 시퀀스에 추가될 수 있어야하지만 RepeatForever는 추가할 수 없다는 것입니다."

 

이 문장이 핵심인것 같다. FiniteTimeAction은 by, to, call 같은 Tween 클래스의 함수들을 의미한다.

 

 

this.infiniteRotate = cc.tween(this.wheel).by(0.4, { angle : -360 }).repeatForever().start();

실제로 delay를 빼니까 정상 작동 했다.

 

delay가 아니더라도 repeatForever 앞에 두 개 이상의 Action이 있으면 repeatForever가 작동을 안하는 문제였다.

 

 

this.infiniteRotate = cc.tween(this.wheel)
                        .delay(0.8).repeatForever(cc.tween().by(0.4, { angle : -360 })).start();

해결책으로 제시되는 방안으로 수정해봐도 문제는 해결되지 않았다.

 

위의 코드는 여전히 같은 에러를 출력하고, delay를 빼야 작동한다.

 

 

this.infiniteRotate = cc.tween(this.wheel)
                        .delay(0.8)
                        .call(() => cc.tween(this.wheel).by(0.4, { angle : -360 }).repeatForever().start())
                        .start();

두 번째 방법으로는 repeatForever 앞에 하나의 작업만 오도록 tween 자체를 2개로 나누는 것이다.

 

이렇게 하면 본래 의도대로 작동을 하긴 하는데...

 

 

this.infiniteRotate.stop();

문제는 this.infiniteRotate 트윈을 중지시켜도, 그 안에 있는 repeatForever 트윈은 멈추지 않는다.

 

repeatForever 트윈까지 변수에 담아서 중지시켜줘야한다.

 

 

코코스 놈들아......