原地址:http://www.cnblogs.com/ybgame/archive/2013/02/21/2920009.htmlhtml
如何导入一个模型,导入的模型在unity3d的project面板中是怎样显示的?包含什么内容?如何加载到场景中?怎样去控制它?模型和动画之间的关系?web
http://usa.autodesk.com/fbx/算法
若是你有一个从高精度多边形版本生成的带法线贴图的角色,你应该以180度的平滑角度(Smoothing angel)导入此角色的游戏质量版本。这将防止因为切线切割在光照中产生的奇怪的接缝。若是在应用了这些设置后仍然存在接缝,启用在UV接缝处分割切线选项(Split tangents across UV seams)。编辑器
【动画导入】ide
若是想播放一个简单的动画,可使用Animation.Play;
若是想在动画之间交叉淡入,可使用Animation.CrossFade;
若是想改变更画模式(循环,一次,乒乓),能够改变更画导入设置里面的动画帧的WrapMode,或者在运行时改变AnimationState.wrapMode的值;
AnimationState能够用于改变更画的层,修改播放速度,而且直接控制融合与混合。工具
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。
如在这种状况下,动画在这种状况下,动画将保持无限取样最后一帧,直到你中止动画。