Unity3D脚印6——模型动画
如何导入一个模型,导入的模型在unity3d的project面板中是怎样显示的?包含什么内容?如何加载到场景中?怎样去控制它?模型和动画之间的关系?
如果你有一个从高精度多边形版本生成的带法线贴图的角色,你应该以180度的平滑角度(Smoothing angel)导入此角色的游戏质量版本。这将防止由于切线切割在光照中产生的奇怪的接缝。如果在应用了这些设置后仍然存在接缝,启用在UV接缝处分割切线选项(Split tangents across UV seams)。
【动画导入】
如果想播放一个简单的动画,可以使用Animation.Play;
如果想在动画之间交叉淡入,可以使用Animation.CrossFade;
如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的WrapMode,或者在运行时改变AnimationState.wrapMode的值;
AnimationState可以用于改变动画的层,修改播放速度,并且直接控制融合与混合。
-
Animation
- AddClip添加剪辑
- animateOnlyIfVisible可见时动画
- animatePhysics是否物理动画
- Blend混合
- clip剪辑
- CrossFadeQueued淡入淡出队列
- CrossFade淡入淡出
- cullingType消隐类型
- GetClipCount获取剪辑数
- IsPlaying是否在播放?
- isPlaying是否在播放?
- localBounds本地边界框
- playAutomatically自动播放
- PlayQueued播放队列
- Play播放
- RemoveClip移除剪辑
- Rewind倒回
- Sample采样
- Stop停止
- SyncLayer同步层
- this [string name]操作名字
- wrapMode循环模式
1 function Start () { 2 // Set all animations to loop 3 animation.wrapMode = WrapMode.Loop; 4 // except shooting 5 animation["shoot"].wrapMode = WrapMode.Once; 6 7 // Put idle and walk into lower layers (The default layer is always 0) 8 // This will do two things 9 // - Since shoot and idle/walk are in different layers they will not affect 10 // each other\'s playback when calling CrossFade. 11 // - Since shoot is in a higher layer, the animation will replace idle/walk 12 // animations when faded in. 13 animation["shoot"].layer = 1; 14 15 // Stop animations that are already playing 16 //(In case user forgot to disable play automatically) 17 animation.Stop(); 18 } 19 20 function Update () { 21 // Based on the key that is pressed, 22 // play the walk animation or the idle animation 23 if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1) 24 animation.CrossFade("walk"); 25 else 26 animation.CrossFade("idle"); 27 28 // Shoot 29 if (Input.GetButtonDown ("Fire1")) 30 animation.CrossFade("shoot"); 31 }
Animation Playback and Sampling 动画播放和取样:
取样这个词可能不大好理解,取样在Unity里面是涉及到渲染的一个术语,就是对像素取样来进行综合运算,我们的动画是在不断运动的,将动画当前的运动状态提取出来,并渲染到屏幕上,这是我理解的取样。
我们在3ds Max或者Maya等模型编辑工具中编辑一个动画,我们按照某个帧速率(FPS)来创建这个动画,在动画被导入到U3D的时候,这个帧速率也会被导入,所以会跟编辑器的速率保持一致。
但我们游戏的运行帧速率并不稳定,可能有硬件的原因或者要渲染的对象,处理的逻辑复杂度不一样,而导致的帧速率不稳定,如果我们按照它设定的帧率来播放,动画就会一卡一卡的。Unity是在变化的帧频中对动画进行取样,而不在制作时的帧频。3D电脑图形动画不是由分散的动画组成,而是连续的曲线。这些曲线可以让我们在任何时间点取样,而不只是对应某一个原始帧的时间点。这样当我们的电脑比较快的时候,动画将会更加地平滑和流畅。
对于大多数的实际应用,事实上Unity对变化帧速的采样不是我们需要关切的,然而,如果你的某个游戏逻辑依赖于动画变换或属性的动画在一个非常特殊的配置,那必须知道这一点。例如,如果有一个动画是把一个物体30帧内从0旋转到180度,想从代码中知道当它已达到了一半,你不能写一段条件语句来检查现在旋转值是不是90度。因为 Unity 依照游戏的变化速率来对动画取样,它可能在旋转快到90度时进行取样,或刚好过90度的时候取样。当在一个动画指定一个点到达时,需要通知, 应该使用AnimationEvent来代替。
还要注意的变化帧速率采样的结果,一个使用WrapMode.Once模式播放的动画的采样不一定是精确的最后一帧。在游戏中很有可能是刚好结束前的某一帧,在下一帧时间可能超过动画的长度,所以它被禁用,而不再采样。如果需要动画的最后一帧取样精确,你可以使用WrapMode.ClampForever。
如在这种情况下,动画在这种情况下,动画将保持无限取样最后一帧,直到你停止动画。