100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Unity3D高级动画(Animator)-动画状态机

Unity3D高级动画(Animator)-动画状态机

时间:2022-07-15 23:25:08

相关推荐

Unity3D高级动画(Animator)-动画状态机

动态系统种类:

Animation动画状态机:是旧版的动画状态机

Animator动画状态机:是新版的动画状态机,其实就是由Animation组成的(这里我们常用这个)

Animator的使用:

(1)从网上找的3D模型FBX文件,包括了模型的动画文件,模型材质等,是一个完整的资源(自带Animator)。这里我们用的人形模型。新建unity工程,将模型文件导到Assets目录。选中模型,在Inspector窗体可见:

Rig里我们可以设置动画类型,默认设为Generic。如果是要使用Mecanim提供的动画retargeting等功能,那就需要将动画类型设为Humanoid。要设置循环播放该动画,勾选Animations里Loop Time即可。

这里要想动画在运行后动,那就要将动画预制物的属性修改为Humanoid 如下图:

(2)准备好模型后,创建一个动画控制器Animator Controller(如果是Legacy动画模式,不需要创建动画控制器。Legacy是4.0版本前的标准动画模式,功能较弱,使用也简单)。

(3)把模型拖到Scene里,给模型Animator组件的Controller指定动画控制器。如需使用脚本控制模型位置,取消Apply Root Motion选项。

(4)打开Animator窗口(双击动画控制器可以打开Animator窗口),将之前导入的模型相关动画拖入窗口(将对应动画片段拖入生成新节点,就可以编辑了)。

Entry(绿色节点):表示当进入当前状态机时的入口,该状态连接的状态会成为进入状态机后的第一个状态;

橙色节点:相当于旧动画系统的默认片段(新建的第一个节点默认为橙色,自动与 Entry 连接,成为进入状态机后的第一个状态);

Any State:表示任意的状态,其作用是其指向的状态是在任意时刻都可以切换过去的状态;

Exit:表示退出当前的状态机,如果有任意状态指向该出口,表示可以从指定状态退出当前的状态机;

灰色节点:

设置默认片段

建立基础连线

箭头代表两个动画的过渡

任何状态都可以连线到death,甚至包括自己到自己

取消death过渡到自己的选择

建立过渡条件,添加参数,有4种(用来方便通过代码激活参数,实现动画切换)

默认过渡条件:Has Exit Time,播放完当前动画才会进行到下一动画的过渡。当有条件时,取消勾选;无条件,默认勾选

最后给游戏物体添加脚本,控制参数的激活

案例:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class gangcancel : MonoBehaviour{private Animator anim;// Start is called before the first frame updatevoid Start(){anim = this.GetComponent<Animator>();}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.N)){anim.SetTrigger("New Trigger"); //由dance1转到dance2}if (Input.GetKeyUp(KeyCode.M)){anim.SetTrigger("2");//由dance2转到dance1}}}

using System.Collections;using System.Collections.Generic;using UnityEngine;public class catcancel : MonoBehaviour{private Animator anim;public int jumpPower = 200;public int speed = 2;private Rigidbody rig;private Transform t;// Start is called before the first frame updatevoid Start(){anim = this.GetComponent<Animator>();rig = this.GetComponent<Rigidbody>();t = this.GetComponent<Transform>(); //获取本身和所有子子物体}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space)){anim.SetTrigger("jump");rig.AddForce(transform.up * jumpPower);}if (Input.GetKey(KeyCode.W)) //当按下W键时,向前移动{t.Translate(t.forward * Time.deltaTime * speed);anim.SetFloat("speed", 2);}if (Input.GetKeyUp(KeyCode.W)) {anim.SetFloat("speed", 0);}if (Input.GetKey(KeyCode.S))//当按下S键时,向后移动{t.Translate(-t.forward * Time.deltaTime * speed);anim.SetFloat("speed", 2);}if (Input.GetKeyUp(KeyCode.S)){anim.SetFloat("speed", 0);}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。