高速上手Unity中最好的补间动画插件DFTween



出处:http://blog.csdn.net/u010019717

author:孙广东      时间:2015.3.17   23:00

DFTween 是一个在 Unity 游戏引擎中高速和easy使用的animation动画库。

它支持不论什么对象的tweening补间的属性, 并能够轻松地进行工作与您自己自己定义数据类型。API 非常简单可是功能非常强大,使其易于创建复杂的tweens补间和sequences序列。它已被优化从优秀性能。同一时候具有低内存和低CPU 要求。

·高速

查阅在线演示。直接比較与其它unity补间tweens图书馆的性能,看看为什么DFTween补间动画库是unity中最快的。

·优化

DFTween 不会分配不论什么每帧存储器,具有极低的资源使用情况,甚至在低功率的移动设备上不是processor-intensive处理器密集型。 看看下面的比較:DFTween:unity最好的补间tween动画系统

·表现力

DFTween 同意极具表现力的fluent syntax (method chaining)什么是流利语法Fluent Syntax ,这样,您能够创建复杂的tweens补间和sequences序列与最少的代码易于阅读和维护。假设更好地适合于您的个人喜好,你也能够选择使用多个标准的面向对象的编码风格。

·灵活

提供最灵活的tween补间动画系统,DFTween能够使用不论什么数据类型或属性。tween补间有内置的提供全部常见的unity的数据类型(如 Vector3、 Vector2、Color等)。和 DFTween 可通过同意您定义自己定义赋值和属性分配回调来处理您的自己定义数据类型。

·链式

多步动画非常easy就能够创建 — — 您能够直接链接在一起,补间或使用groups组和timelines时间表能够准确地控制tween补间执行时和顺序。groups组和timelines时间表除了能够包括除了正常的tween补间动画还能够包括其它groups组和timelines时间表。同意您创建补间层次结构。以适应不论什么情况。

翻译自官方:http://daikonforge.com/dftween/documentation/

高速入门

1.创建tweens补间

•使用Helper方法

•直接Instantiation实例化

•UsingReflection to Tween Named Properties

•内置ObjectPooling对象池

2. Combining Tweens结合补间

•ChainingTweens Directly直接链接补间

•Concurrent-ModeTween Groups并发模式补间组

•Sequential-ModeTween Groups序贯模式补间组

•Timelines时间线

创建tweens补间:

DFTween 库提供了多种创建tweens补间动画。范围能够从使用Helper方法的方便性和易用性对创建tweens补间手动为更精细的控制。

使用Helper方法:

我们先这里開始用最简单的 — — 使用Helper方法。DFTween 已经定义了几种扩展方法为您提供便利,涵盖了最常见的动画方案。Extensionmethods扩展方法是会出现”added on” 现有类型的方法。DFTween 定义的Component, Transform, Material, TextMesh, GUIText, and Sprite类的几种这样的方法。在此演示样例中,我们将使用扩展方法的Transforms变换补间对当前组件的位置:

this.transform
.TweenPosition()
.SetEndValue( new Vector3( 100, 100, 0 ) )
.SetDuration( 1 )
.Play();

上面的演示样例中将在一秒钟内变换位置,从 0,0) 到 (100,100,0) 进行动画处理。

注:非执行状态DFTween 库总是返回tweens补间,它開始playing播放之前。给你机会全然自己定义tween’s补间的行为。

这意味着必须手动调用 Play 方法才干启动动画。

注:当使用的helper方法,tween补间的StartValue 和 EndValue 属性将设置默认情况下,为该对象的当前值(比如,使用 TweenPosition helper方法时,对象的当前位置position将被用作默认 StartValue)。在此页上的样例假设省略 SetStartValue() 或 SetEndValue()。然后你能够假定这些值使用默认值。

直接实例化

如上文所述,DFTween 提供了最常见的情形 — — 动画color颜色、opacity不透明度、position位置、rotation旋转或scale大小,不论什么游戏对象的helper方法。

这些方法将创建tween补间动画,并将实用的默认值分配给tween补间动画的各种属性和回调。

为了不涵盖通过上述联系。或当你须要很多其它地控制结果的情况下。您还须要显式创建新tween补间的选项。在下面演示样例中。我们将手动创建float tween补间能够用来对camera的fieldOfView属性进行动画处理:

var tween =
new Tween<float>()
.SetStartValue( 60 )
.SetEndValue( 90 )
.SetDuration( 0.5f )
.OnExecute( ( value ) =>
{
Camera.main.fieldOfView = value;
} );
tween.Play();

请注意在本例中我们须要显式定义的方式来分配目标属性的当前值。OnExecute 方法同意我们定义一个回调方法。用于执行这项任务(匿名方法定义在此演示样例中使用lambda 语法。

tween补间动画引擎每帧都会调用OnExecute回调。在这样的情况下它是须要。由于尽管我们已经创建了一个tween补间动画从 60 到 90 的浮点值超过半秒。对每一个帧我们仍然须要指定怎样处理得到的值。如上文所述的helper方法同意您省略这一步。由于他们提供正确的默认回调为公用属性。比如 Transform.position、 Material.color 等。

此体系结构提供了最大的灵活性而不会牺牲性能或类型安全。

使用反射来命名属性的补间(反射的效率是问题啊)

上面的样例中能够编写更简单地使用TweenReflectionExtensions 的helper方法。TweenReflectionExtensions 类定义同意您轻松地tween补间命名不论什么对象的不论什么的属性扩展方法。

补间的camera 的fieldOfView属性,我们也能够编写下面:

var tween = Camera.main
.TweenProperty<float>( "fieldOfView" )
.SetStartValue( 60 )
.SetEndValue( 90 )
.SetDuration( 0.5f );
tween.Play();

终于的结果是相同的功能,但代码相比較短由于在补间能够内部使用反射来设置fieldOfView属性,而不是要求您提供所需的代码会向 OnExecute 回调中。

在这样的情况下,会向 OnExecute 回调内部分配。请注意您必须在TweenProperty<type>( propertyName )泛型方法调用中指定正确的数据类型的字段或属性。TweenProperty扩展方法适用于不论什么public字段或属性。

内置对象池

为了提供最佳的可能的内存配置,全部tween补间动画类支持object pooling对象池。为短命补间动画 (如“fire andforget”补间),此功能同意您请求一个补间从"对象池"而不是每次创建一个新的实例。当补间是完成时。它能够被释放回对象池中准备进一步又一次使用,例如以下面演示样例所看到的:

transform.TweenPosition()
.SetStartValue( Vector3.zero )
.SetEndValue( new Vector3( 100, 100, 0 ) )
.SetDuration( 0.25f )
.SetAutoCleanup( true )
.Play();

此代码使用TweenTransformExtensions.TweenPosition()扩展方法从对象池获取Tween<Vector3>实例,另外将它配置为使用AutoCleanup为“fire andforget”风格动画。当 AutoCleanup 设置为 true。补间动画在执行完成时将自己主动释放本身放回对象池。通过调用release ()方法,也可手动返回不论什么补间到对象池。

结合补间

DFTween 还提供了多种方法结合动画补间关于multi-step多步或多个属性。能够直接chain链接补间在一起,把他们结合起来在groups组中,或使用timeline时间线的最高控制权。Tween groups and timelines补间组和时间表作为其它补间动画的容器(包括其它Tween groups and timelines)。使您能够作为一个单一的动画,补间一整套对待的能力start, stop, pause, and resume单个方法调用对整个group起作用。

直接链接补间

有时你须要的一切就是能在还有一个补间后直接play下一个。Tween<T>.Chain()仅仅是这样的情况提供了方法:

transform
.TweenPosition()
.SetEndValue( new Vector3( 25, 25, 0 ) )
.SetDuration( 0.5f )
.Chain(
transform.TweenScale()
.SetEndValue( new Vector3( 2, 2, 2 ) )
.SetDuration( 0.33f )
)
.Play();

上面的演示样例中创建的补间移动的对象从其当前位置移动到(25,25,0)超过 0.5 秒。然后进行动画处理的对象从当前scale扩展到(2,2,2)。

Tween<T>.Chain()方法能够为您提供当第一个补间动画执行完成马上将调用第二个 TweenBase 对象的 play () 方法。你能够使用此方法链随意数量的补间在一起。

使用补间动画组

TweenGroup类提供随意数量的补间结合在一起的能力,并给你playing他们的选项,在同一时间或一个接一个。

并发模式补间组

能够方便向group补间结合在一起以便你能够将他们视作一个单一的补间,在 TweenGroup 上调用play ()将导致该组全部的补间。在同一时间play。当你须要同一时候对多个对象的属性进行动画处理这是特别实用的:

var tweenOpacity = this
.TweenAlpha()
.SetStartValue( 0f )
.SetEndValue( 1f )
.SetDuration( 0.5f ); var tweenScale = this
.TweenScale()
.SetStartValue( Vector3.zero )
.SetEndValue( Vector3.one )
.SetDuration( 0.5f ); var tweenGroup = new TweenGroup()
.SetMode( TweenGroupMode.Concurrent )
.AppendTween( tweenOpacity )
.AppendTween( tweenScale );
tweenGroup.Play();

上面的演示样例将创建两个补间,总是一起played。然后。它创建一个新的TweenGroup 对象并将Mode属性设置为TweenGroupMode.Concurrent。并使用 .AppendTween()方法将单个补间加入到的组。当调用 .Play()方法,该对象将在同一时间fade淡入和scale从 0。0)到 (1,1,1)。

顺序模式补间组

您还能够使用 TweenGroup 类使组补间一起播放,必须 “in order”("按顺序")played:

var tweenPosition = this
.TweenPosition()
.SetStartValue( Vector3.zero )
.SetEndValue( new Vector3( 25, 25, 0 ) )
.SetDuration( 0.5f ); var fadeIn = this
.TweenAlpha()
.SetStartValue( 0f )
.SetEndValue( 1f )
.SetDuration( 0.5f ); var fadeOut = this
.TweenAlpha()
.SetStartValue( 1f )
.SetEndValue( 0f )
.SetDuration( 0.5f ); var tweenGroup = new TweenGroup()
.SetMode( TweenGroupMode.Sequential )
.AppendTween( fadeIn )
.AppendTween( tweenPosition )
.AppendDelay( 3f )
.AppendTween( fadeOut ); tweenGroup.Play();

将一个 TweenGroup 实例的Mode属性设置为TweenGroupMode.Sequential指定补间应在order中的顺序,而不是全部在同一时间。当上面的演示样例中, tweenGroup.Play被该对象调用时fade in淡入。将移动到 (25,25,0)、暂停三秒。然后fade out淡出。请注意在使用 TweenGroupMode.Sequential 时。你能够使用.AppendDelay()方法,以在序列中的不论什么点加入延迟。

时间线

TweenTimeline类同意您精确地指定补间開始playing的时候。

提供了您能够同一时候拥有多个补间依照concurrent-mode tween groups启动的福利,以及提供在让它们在不同的时间相同顺序模式补间组启动的福利。。

这样的灵活性使时间线轻松地创建复杂的multi-step的强大工具。

var timeline = new TweenTimeline();

timeline.Add( 0f, this.TweenAlpha().SetEndValue( 1 ) );
timeline.Add( 0f, this.TweenScale().SetStartValue( Vector3.zero ).SetEndValue( Vector3.one ) );
timeline.Add( 1.5f, this.TweenPosition().SetStartValue( startPosition ).SetEndValue( endPosition ) );
timeline.Add( 3f, this.TweenAlpha().SetEndValue( 0 ) );
timeline.Add( 3f, this.TweenScale().SetEndValue( Vector3.zero ) );
timeline.Play();

在此演示样例中,该对象fades in淡入,同一时候scales从0 to 1时间线 (请注意,在同一时间開始的两个补间)。一个半秒钟后,对象的位置将动画从開始位置到结束位置。在三秒标记,该对象将fade out淡出。同一时候scale从1 to 0 (在同一时间再次,淡入淡出和规模补间開始)。

注:传递给TweenTimeline.Add() 方法的開始时间指定等待时间线開始后的秒数。比如,假设您调用的timeline.Add( 1.5f, tween ) 你说你想在补间開始 1.5 秒后时间轴。调用 play() 方法。

文章中提到了:流利语法fluent syntax、扩展方法Extension methods、匿名方法anonymous method、拉姆达表达式lambda syntax、对象池object pooling

上一篇:Unity中的动画系统和Timeline(3) 混合树和动画匹配


下一篇:骨骼动画的原理及在Unity中的使用