原文地址
转载请注明,原文地址:iTween和DOTween的选择
文章来源:笨木头与游戏开发
正文
在游戏开发里,补间动画是不可少的,像简单的向前移动、上下重复飘动、按照预设路径移动等。这些功能要是都自己写的话,游戏得开发到何年何月,所以我们必须要用现成的工具。
1. iTween
我们最常听到的应该就是 iTween 了吧,反正我到网上一搜,最先看到的就是它。
它确实很好用,官方文档很详细,很整洁,功能也挺全的。
然而,这是在我发现 DOTween 之前的事情。
2. DOTween
就在前天,我偶然发现了 DOTween(以前叫做 HoTween),怎么说呢,那真的是相逢见晚(旁白:是恨晚!恨晚!)。
DOTween 的官方文档咋一看,感觉年代十分久远,没有 iTween 那么高大上。
但是,硬着头皮看了之后,我如获至宝。
举个例子吧,
iTween 要移动某个物体,需要这么做:
iTween.MoveTo(gameObj, new Vector(2, 3, 2), 0.4f);
而 DOTween 要移动某个物体,只需要这么做:
gameObject.transform.DOMove(new Vector3(2, 3, 2), 0.4f );
怎么样,是不是 DOTween 要简单多了...啊个屁啊!完全没区别好吗,不就是静态函数和扩展函数的区别吗,哪里简单多了。
咳咳,是的,如果仅仅是要移动某个物体的话,确实没有什么太大的区别。
但是....
3. 复杂的调用方式
如果我想以恒定的速度移动到某个地方,并且要指定移动方式、移动完成时要回调函数。 那么,iTween 需要这样做:
iTween.MoveTo(gameObject, iTween.Hash(
"position", valueTo,
"speed", Speed,
"easetype", iTween.EaseType.linear,
"oncomplete", "ArriveAim"
)
);
是的,我得记住一堆字符串参数,虽然我记性不差,但是...我刚刚说到哪来着?
哦,对,虽然我记性不差,但是要记住这些参数还是 很讨厌 的好吗?
再来看看 DOTween 是怎么做的:
gameObject.transform
.DOMove(valueTo, Speed)
.SetSpeedBased()
.SetEase(Ease.Linear)
.OnComplete(ArriveAim);
我的天啊,这样写代码才是享受啊,我只需要大概记住某个函数的名字就行了,编辑器会提示我有哪些函数可以用,一瞬间就找到了,根本不需要记住它们。
而且,我还能直接一个个函数看注释,等于在看文档,很方便 的好吗。
这两天我就在干一件事情,把我目前在开发的游戏的所有 iTween 替换成 DOTween,然后把 iTween 彻底删掉,再也不用它。
我相信,同为开发者的你,一定更愿意使用 DOTween 这种调用方式。
而且它的官方文档并没有看起来的那么挫,习惯之后,就会觉得很不错,而且远比 iTween 的要好。
附上地址:dotween.demigiant.com(当然你直接百度 DOTween 也可以)
4. DOTween 的坑
当然,DOTween 也有一个小坑。
比如这样的一个功能:角色自动向前移动,遇到进入攻击范围的敌人就停下来,开始攻击。同时,角色会不停上下飘动,不管是不是在移动。
这就有 两个需求,上下飘动以及向前移动。上下飘动 用 DOTween即可实现,向前移动,我还是比较倾向于在 Update
里修改角色x坐标,这样控制起来比较灵活。
然而,使用 DOTween 对物体进行上下飘动(MoveTo
函数)的过程中,我无法对其修改 x
坐标(会无效)。
本以为这是 DOTween 的 缺陷,我差点就用 iTween 来实现这些特殊的地方了。
幸好,我继续研究了官方文档,发现了一个 神奇 的函数:DOBlendableMoveBy
使用 DOBlendableMoveBy
移动物体的时候,允许同时存在多个 DOBlendableMoveBy
调用,相互之间 不会覆盖,也 不会冲突。
我想,这个就是和 iTween 的机制一样的东西了,使用这个函数执行动画时,我依旧可以主动去修改物体的坐标,相互之间不会冲突。于是,我的需求完美解决了,DOTween 也将成为我未来很长一段时间都会依赖的工具。
5. 其他的更好的东西?
如果你还知道比 DOTween 更好用的工具,请一定要告诉我,对于厉害的工具,我真的完全没有抵抗力。
一定要和我分享。