首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之使用Animation编辑器编辑动画(五十四)
2013
04-16

Unity3D研究院之使用Animation编辑器编辑动画(五十四)

         Unity提供了Animation编辑器,它可以为我们编辑物理动画。举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互。如果这个秋千也用代码来写控制它来回摇动,会感觉小题大做。此时完全可以使用Animation编辑器来完成。但是它目前还不能编辑 FK 和 IK动画,所以编辑器中编辑动画的种类还是有限的,如果有一天FK 和 IK动画都可以在Unity中编辑了 那就给力了嚯嚯。。。如下图所示,首先在Hierarchy视图中创建一个游戏对象,这里我就创建一个立方体Cube对象。鼠标保持选中状态,然后在Unity导航菜单栏中选择Window->Animation将呼出动画编辑窗口。

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 1

 

如下图所示,Animation窗口弹出后,点击左上角那个“小红点”按钮。因为默认新建的Cube对象是没有动画的,所以这里将弹出创建动画窗口。在窗口中点击Save,此时一个名叫New Animation的动画文件将被保存在Project视图中。

 

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 2

如下图所示,此时动画将处于编辑中模式, 在右上方空白处点击鼠标右键,即可添加一个Frame , 点击Frame就会出现一道竖向的红线,上面对应着Frame的时间,这时候在左侧Transform中可以修改每一帧模型的位置,或者在编辑器中也可以修改,数值同样会被保存在每一帧的Transform中。

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 3

 

当你的帧编辑完成后,点击上图左上角那个运行的按钮。你可以在游戏视图中看到这个立方体对象已经按照我们设定的每帧的位置在播放动画了。图中左下角Show:all右侧可以设置动画的播放类型。为了看的清楚,这里我选择PING PONG让动画来回一直播放。动画编辑完成后,点击图中左上角“小红点”按钮 退出动画编辑模式。 

退出动画编辑模式后,如下图所示,将刚刚编辑完的动画剪辑拖拽至立方体对象的Animation中,勾选Play Automatically自动播放。此时运行游戏你会发现立方体对象已经按照之前编辑的方式播放动画。

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 4

上面介绍的方式我没有写任何一行代码,如果你想动态的监听一些播放事件, 比如当播放几秒的时候执行几行代码。此时你可以使用动画的事件来完成。先创建一条普通的脚本。把它绑定在Cube对象身上。在脚本中我写了两个方法 Event0()和Event1()。

 我们继续呼出Animation编辑窗口,如下图所示,在时间轴的空白处单机鼠标右键可以添加一个动画事件。 然后会弹出Edit Animation Event窗口,中间有一个Function的选项,Event0()就会对应到上面代码中 Event0的方法。你还可以在脚本中继续添加方法,在Function:的下拉菜单中都会看到。图中我在0:10处添加了一个动画事件,对应在Event0方法中,那么当动画播放0.10s的时候程序将会进入Event0方法中。

 

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 5

 

怎么样?动画事件还是比较好理解吧。讲到这里你是不是想问我?能不能让美术把动画都在Unity中来完成。答案是否定的,因为它不支持FK 和IK动画,骨骼连带动画还是得在3DMAX 或maya中来完成。如下图所示你也可以打开一个美术在3DMAX 或者 maya中做的动画,这里会显示Read-only表示只读,你不能继续修改它。

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 6

 

 

Animation编辑器只能修改当前节点的动画,如果你想编辑它的子节点动画的话。只需现在父节点中找到某个子节点对象,然后在window->Animation中呼出编辑器窗口即可开始编辑。

Unity3D研究院之使用Animation编辑器编辑动画(五十四) - 雨松MOMO程序研究院 - 7

 

 

一口气写了这么多,最后祝大家学习愉快。哇咔咔。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之使用Animation编辑器编辑动画(五十四)》有 34 条评论

  1. 寒冰 说:

    MOMO大佬,我这里遇到一个问题,是可能是Unity5和4的迭代产生的一个问题。
    我在GameObject上挂上了Animation脚本并绑上了一系列动画之后,在Animation编辑面板里,每次选中这个GameObject它都会把当前编辑的对象默认选成排序的第一个动画。即使我手动改选了要编辑的动画为另一个,一旦角色失去焦点,再被重新选中时,这个界面又会默认选中编辑第一个动画。
    在Unity4中我没有遇到这个问题,我想请问一下是否有代码接口可以直接设置Animation面板要编辑的动画?

  2. Nick 说:

    你好,雨松大大,anmiation的position能只录Y轴吗?

  3. 受教了,十分感谢大大

  4. 十二H 说:

    求教雨松大大,我给一个对象做了一段变大和缩放的Animation并添加到了组件的Animation控件里(没有添加Animator),运行的时候这个动画没有播放。但如果添加一个Animator并且在这个Animator里加上这个动画就可以在运行时播放了,所以Animation是不是都需要一个Animator才能正常播放呢?

  5. 十二H 说:

    求教雨松大大,我给一个对象做了一段变大和缩放的Animation并添加到了组件的Animation控件里,但是运行的时候这个动画没有播放,但是如果添加一个Animator并且在这个Animator里加上这个动画就可以播放了,所以是不是在Unity里K的Animation都需要一个Animator才能正常播放呢?

  6. 苏小鹏 说:

    我用编辑器编辑了一段动画,我想通过Button来控制动画的播放暂停退出功能,脚本写好了,可是怎么都找不到这段动画,该怎么办?

  7. Valor 说:

    Anitmator 还有那些不完善的功能哇

  8. xz 说:

    Momo:AnimationCurve curve=AnimationCurve.Linear(0,315,5f,370); curve.AddKey(10,355); AnimationClip clip=new AnimationClip(); clip.SetCurve(“”,typeof(Transform),”localPosition.x”,curve);animation.AddClip(clip,”wo”); animation.Play(“wo”); animation.wrapMode=WrapMode.Loop; 我打上这段代码后,虽然postion.x发生了变化,但是postion.z 和postion.y都变为0了,我不想让其它的属性发生改变应该如何弄呢?

  9. 炎睇寒 说:

    复制两个角色共用Animator文件,我怎么样分别控制他们,我改变一个另一个跟着动了,感谢楼主大人,能帮我这个问题吗

  10. Arkks 说:

    想在FBX的格式里加动画事件是不是奢望?(目前还没学习Animator,感觉强大但是门槛高了

  11. 花巷传奇 说:

    你好,我想请教一个问题,给一个像“铜钱”那样的东西添加网格碰撞,中间部分是空的,有东西穿过,而且还要在运动中做碰撞检测,怎么添加网格碰撞

  12. 仗剑走天涯 说:

    MoMo,请教个问题,我用系统自带的Camera控制脚本,想做第三人称,但是人物要固定在摄像机左边,就是屏幕偏左的地方。现在我旋转视角,人物就会到屏幕中间的位置上。void LateUpdate(){finalDist = desDist;// Horizontal smooth rotationxAngl = Mathf.LerpAngle(cam.eulerAngles.y, hero.eulerAngles.y, 0);// Vertical angle limitationyAngl = ClampAngle(yAngl, minAngleY, maxAngleY);// Camera rotationQuaternion camRot = Quaternion.Euler(yAngl, xAngl, 0);// Camera heightVector3 headPos = new Vector3(0, -heroHeight /1.2f, 0);// Camera positionVector3 camPos = hero.position – (camRot * Vector3.forward * desDist headPos);// Recalculate hero positionVector3 trueHeroPos = new Vector3(hero.position.x, hero.position.y heroHeight, hero.position.z);// Check for collision with LinecastRaycastHit hit;bool isOk = false;if ( Physics.Linecast(trueHeroPos, camPos – Vector3.up Vector3.forward, out hit, collisionLayers.value)) // slightly behind and below the camera{// Final distancefinalDist = Vector3.Distance (trueHeroPos, hit.point) – offsetFromWall;isOk = true;}// Lerp current distance if not correctedif ( !isOk || ( finalDist > curDist ) )curDist = Mathf.Lerp (curDist, finalDist, Time.deltaTime * zoomDampening);elsecurDist = finalDist;// Recalculate camera positioncamPos = hero.position – (camRot * Vector3.forward * curDist headPos);// Apply XY-axisif(Mathf.Abs(joystickR.outputXY.x) < Mathf.Abs(joystickR.outputXY.y)){yAngl -= joystickR.outputXY.y * ySpeed;bPlayerRotate = false;// Apply position and rotationcam.rotation = camRot;cam.position = camPos;}else if(Mathf.Abs(joystickR.outputXY.x) > Mathf.Abs(joystickR.outputXY.y)){float rotateStep = joystickR.outputXY.x * xSpeed;controller.transform.RotateAround(transform.position, Vector3.up, rotateStep);if(joystick.outputXY.x == 0 && joystick.outputXY.y == 0){if(joystickR.outputXY.x < 0){playerAnimation.AnimationLeftMove();}else if(joystickR.outputXY.x > 0){playerAnimation.AnimationRightMove();}}bPlayerRotate = true;}else{bPlayerRotate = false;}}//这段代码基本都是U3D自带的,我自己的代码在// Apply XY-axis这里if(Mathf.Abs(joystickR.outputXY.x) < Mathf.Abs(joystickR.outputXY.y))//这里是视角上下移动else if(Mathf.Abs(joystickR.outputXY.x) > Mathf.Abs(joystickR.outputXY.y))//这里是控制角色左右旋转的,我没有控制camera,因为角色动,然后绑定的camera也会左右旋转问题是,不管是上下左右移动joystickR,主角都会回到屏幕中间,而我想要的效果是,主角一直在屏幕偏左的位置,不要回到中间。谢谢啦,大神momo。。。

  13. 仗剑走天涯 说:

    MoMo,请教个问题,我用系统自带的Camera控制脚本,想做第三人称,但是人物要固定在摄像机左边,就是屏幕偏左的地方。现在我旋转视角,人物就会到屏幕中间的位置上。 void LateUpdate() { finalDist = desDist; // Horizontal smooth rotation xAngl = Mathf.LerpAngle(cam.eulerAngles.y, hero.eulerAngles.y, 0); // Vertical angle limitation yAngl = ClampAngle(yAngl, minAngleY, maxAngleY); // Camera rotation Quaternion camRot = Quaternion.Euler(yAngl, xAngl, 0); // Camera height Vector3 headPos = new Vector3(0, -heroHeight /1.2f, 0); // Camera position Vector3 camPos = hero.position – (camRot * Vector3.forward * desDist + headPos); // Recalculate hero position Vector3 trueHeroPos = new Vector3(hero.position.x, hero.position.y + heroHeight, hero.position.z); // Check for collision with Linecast RaycastHit hit; bool isOk = false; if ( Physics.Linecast(trueHeroPos, camPos – Vector3.up + Vector3.forward, out hit, collisionLayers.value)) // slightly behind and below the camera { // Final distance finalDist = Vector3.Distance (trueHeroPos, hit.point) – offsetFromWall; isOk = true; } // Lerp current distance if not corrected if ( !isOk || ( finalDist > curDist ) ) curDist = Mathf.Lerp (curDist, finalDist, Time.deltaTime * zoomDampening); else curDist = finalDist; // Recalculate camera position camPos = hero.position – (camRot * Vector3.forward * curDist + headPos); // Apply XY-axis if(Mathf.Abs(joystickR.outputXY.x) < Mathf.Abs(joystickR.outputXY.y)) { yAngl -= joystickR.outputXY.y * ySpeed; bPlayerRotate = false; // Apply position and rotation cam.rotation = camRot; cam.position = camPos; } else if(Mathf.Abs(joystickR.outputXY.x) > Mathf.Abs(joystickR.outputXY.y)) { float rotateStep = joystickR.outputXY.x * xSpeed; controller.transform.RotateAround(transform.position, Vector3.up, rotateStep); if(joystick.outputXY.x == 0 && joystick.outputXY.y == 0) { if(joystickR.outputXY.x < 0) { playerAnimation.AnimationLeftMove(); } else if(joystickR.outputXY.x > 0) { playerAnimation.AnimationRightMove(); } } bPlayerRotate = true; } else { bPlayerRotate = false; } }//这段代码基本都是U3D自带的,我自己的代码在// Apply XY-axis这里if(Mathf.Abs(joystickR.outputXY.x) < Mathf.Abs(joystickR.outputXY.y))//这里是视角上下移动else if(Mathf.Abs(joystickR.outputXY.x) > Mathf.Abs(joystickR.outputXY.y))//这里是控制角色左右旋转的,我没有控制camera,因为角色动,然后绑定的camera也会左右旋转问题是,不管是上下左右移动joystickR,主角都会回到屏幕中间,而我想要的效果是,主角一直在屏幕偏左的位置,不要回到中间。谢谢啦,大神momo。。。

  14. 黄杰 说:

    正在想要弄动画呢。。。

  15. 顶一下MOMO大神。。你每一次出东西都是那么精彩。。

  16. sevenloo 说:

    MOMO 我在做项目丶时候遇到一个关于3dmax导入到unity3d中图片丢失的问题,因为现在项目图片量太大,不能在一个一个的给相应的材质附加贴图,请问你有什么好的方法和建议?指点迷津啊!哈哈哈

    • 雨松MOMO 说:

      我有一个办法,我最近也想试试这个办法看看可行不,如果最后验证可行我会分享在博客中。在editor目录下放这样的脚本。using UnityEngine;using System.Collections;using UnityEditor;public class MyEditor : AssetPostprocessor{ void OnPostprocessModel (GameObject o) { Renderer[] renderers = (Renderer[])o.GetComponentsInChildren (); //当你将模型拖入的project视图中,程序将进入这里。 //我想用代码在这里动态的给材质球添加贴图。。 }}

    • 雨松MOMO 说:

      我有一个办法,我最近也想试试这个办法看看可行不,如果最后验证可行我会分享在博客中。在editor目录下放这样的脚本。using UnityEngine;using System.Collections;using UnityEditor;public class MyEditor : AssetPostprocessor{void OnPostprocessModel (GameObject o){ Renderer[] renderers = (Renderer[])o.GetComponentsInChildren ();//当你将模型拖入的project视图中,程序将进入这里。 //我想用代码在这里动态的给材质球添加贴图。。}}

  17. 多讲讲动画,不会代码我就欣赏动画!!! O_O

留下一个回复

你的email不会被公开。