DOtween多个动画执行

多个动画同时执行

dotween是个很好用的工具,作一些UI动画的适合非常方便。其OnComplete回调也是非常有用的一点。今天用dotween偶然发现了一个之前忽略过的问题,就是在用dotween作批量动画,并且带有OnComplete回调时会比较容易出错。

如下代码:

for (int i = 0; i <  obj.Length; i++) {
	obj [i].rectTransform.DOAnchorPos (target[i].rectTransform.anchoredPosition, 1.5f).OnComplete(()=>{
		obj[i].transform.SetParent(target[i].transform);
	});
}
这段代码的目的是让白色img移动到对应红色img位置上去,并且实现对应的SetParent操作。

DOtween多个动画执行_第1张图片

可是实际执行的情况却是这样的:

DOtween多个动画执行_第2张图片

并没有执行后面的设置父对象的操作。断点调试一下,如下:

DOtween多个动画执行_第3张图片

也就是说,在执行OnComplete的时候,i已经走到了最后,超出了界限,所以就不执行了。至于为什么,大概是tween动画从编译走到此处时就开始执行,等循环完毕后,一般还是没有执行完的,所以就会出现走到了OnComplete后,却发现i已经过了界限了,至于为什么会过界限,我也不是很清楚。

所以,了解了原因,要做的话就简单了,用协程来做,开相应调协成,互不干扰,不受i的影响。

void Start () {
		for (int i = 0; i <  obj.Length; i++) {
			//	StartCoroutine (Setp(i));
		}
	}

	IEnumerator  Setp(int i){
		obj [i].rectTransform.DOAnchorPos (target[i].rectTransform.anchoredPosition, 1.5f).OnComplete(()=>{
			obj[i].transform.SetParent(target[i].transform);
		});
		yield return 0;
	}
这样就可以完美实现功能了。

多个tween依次发生

有了上面的问题,就会知道,不能用循环来实现多个tween按次序播放的动画,可以利用OnComplete回调,结合递归来实现。
下面是一个依次执行的动画:
DOtween多个动画执行_第4张图片
public Image[] obj;
public Image[] target;
int i = 0;
void Start () {
	SetP ();
}

void SetP(){
	obj [i].rectTransform.DOAnchorPos (target[i].rectTransform.anchoredPosition, 1.5f).OnComplete(()=>{
		obj[i].transform.SetParent(target[i].transform);
		i++;
		if (i



你可能感兴趣的:(DOTween,unity)