unity为人物模型添加动效animator(代码片段)

长江很多号 长江很多号     2023-03-09     674

关键词:

码字不易,转载请注明出处^ o ^


1 前言

Unity导入一个人物模型后,一般还需要让它动起来。并且,还需要有一定的状态管理,比如按A键就做跑的动作,按B键就做打人的动作,等等。
本文就从无到有,讲一下如何快速导入一个人物模型,然后动起来。

本文着重讨论的是人物模型,因为这种模型的动效,可以从网站下载,不需要自己设计!
这个网站就是https://www.mixamo.com/#/
这是Adobe旗下的一款产品,可以免费上传静态模型文件,绑定动画调试,并下载,很良心。不过我们不需要这个功能,我们只想从它那下载动画文件,自己使用。

2 设计流程

2.1 基础环境搭建

首先,创建一个新的Unity工程。打开后,是一个干净的场景:
然后呢,搞一个平板,作为地面。
然后呢,搞个模型进来。
有很多网站。我这里推荐2个。

  1. https://free3d.com/zh/3d-models/ 这个模型丰富,带纹理。
  2. https://www.mixamo.com/#/ 这个主要目的是下载动画文件,下载的同时,模型也给你了,不过模型没有纹理,俗称【白模】

咱们简单操作,就从第二个网站下载一个。

得到的是一个fbx文件。

模型拖到【Project】面板中,相当于导入了。接着,拖到Hierarchy面板中,相当于应用到场景了。

为了让人物可以跟下面下载的动画匹配,有一步非常重要的工作,如下:

Project面板,选中该模型,Inspector面板,Animation Type修改为Humanoid。这会让模型保证是人体标准的5个大骨骼。
改好以后,查看该模型详细信息,即点击小三角形,可以看到一个小人物图标。

2.2 动画搭建

先说一下动画系统的核心概念。新版本的Unity,搞动画需要2个东西,AnimatorAnimator Controller

  1. Animator,动画。如跑,跳,举手,各自是一个动画。文件后缀.anim。可以从网站下载,当然,你也可以自己设计。
  2. Animator Controller,动画控制器。文件后缀,.controller。打开是一个图形化的状态机,可以控制多个动画。一般自己创建。

2.2.1 获得一组anim动画文件

动画自己编辑,太费事了,我们可以从网上下载来,直接应用到模型上!
下载地址:
https://www.mixamo.com

你可以搜索不同的状态,如run, attack, dead,jump,idle,等等。然后下载下来。

下载的不是纯粹的动画文件,而是一个fbx文件,包含了模型本身,每个模型包含一种动作。所以我们还需要提取一下。

下载后,先把fbx导入到Unity中,然后,需要像2.1节说的,把Animation Type改为Humanoid。这样,动画类型也能保证是以人体的标准形式展现。

然后选中模型,点击这个文件的小三角形,出来后,看到一个蓝绿色的文件没?它就是动画文件。

选中它,然后Ctrl + D,或者菜单栏的Edit -> Duplicate,就可以把动画提取出来。提取出来后,同级文件夹下,就多了一个后缀为anim的文件,可以改一下名字,比如叫idle.anim

好了,接下来继续,一顿操作猛如虎,下载N个模型,提取N种动画,
把这些都放到一个文件夹下。这些就是你想要的所有动作了。


接下来,需要搞个动画状态机(Animator Controller),根据不同的状态来切换不同的动画了。

2.2.2 动画状态机(Animator Controller)

在Project面板,Animiation目录下(目录随便你,建议和2.2.1的动画文件放在一起)。右键,Create -> Animation Controller


建好后,长这样。

双击它,进入了动画编辑面板:

默认3种。
Any State:表示任意状态的特殊状态。
Entry:表示状态机的入口状态。组件被激活后无条件跳转到该状态,一般需要把它连到我们自定义的默认态,如Idle
Exit:表示状态机的出口状态。如果动画控制器只有一层,那么这个状态没有用。如果有多层,需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。本文是不需要用到。

好了,接下来,我们开始自定义:
在操作区,右键,Create State -> Empty。新增状态。比如idle

选择idle,在Inspector面板,Motion绑定好一个动画。例如就是我们前面得到的idle.anim

同理创建好run,attack, dead3种状态。
接下来,我们开始定义状态之间如何切换。
目标:

  1. 任何状态下,可以触发attackattack一次后,自动进入idle
  2. 任何状态下可以触发dead,之后,无法进入其他状态
  3. idle状态下,可以触发runrun可以触发idle

首先,先创建触发一下条件。在Anomator->Paramaters添加。

触发条件有多种。
前三种是设置值,float, Int, bool。在脚本,可以配置值来触发动画。
例如bool可以这样触发:

gameObj.GetComponent<Animator>().SetBool("Is_move", true);

还有一种Trigger,类似于单选框,代码中这样触发:

gameObj.GetComponent<Animator>().SetTrigger("Attack");

接下来,按前面的3个目标,分别讨论。

(1) 任何状态下,可以触发attack,attack一次后,自动进入idle。

选中AnyState,右键,Make Transition。出来一条线,连接到attack
这个线代表状态切换,可以有条件。如何设置条件?
点击选中这根线:

Inspector面板,最下面,Conditions,添加条件。
咱们就前面配置的一个触发条件Attack
这样,只要代码中执行:

gameObj.GetComponent<Animator>().SetTrigger("Attack");

该游戏对象,都会从任意状态,进入攻击状态。

还有一件事,attack一次后,自动进入idle。这个简单,直接连一根线,到Idle不加任何触发条件,就可以实现。Attack执行一次,就会进入Idle

(2) 任何状态下可以触发dead,之后,无法进入其他状态

首先,像(1)一样,从AnyState连一根线到Dead。然后加一个Trigger类型的触发条件,如Dead
因为Dead后啥也干不了了,所以Dead不需要连到其他地方。

(3) idle状态下,可以触发run,run可以触发idle

先搞一个Bool类型的触发条件,名字叫Running
然后,Idle连一根线到run。加触发条件Running=true

再从run连一根线到idle,加触发条件:Running=false

最后,把Entry连接到Idle,因为Idle为默认状态。另外,还需要让idle的动画,为循环播放,否则播放完就不动了。

至此,整体状态机的图就好了。

2.3 模型绑定动画

把模型对象,添加一个Animotor组件。
把Controller,设置为前面写的.controller状态机。


另外,如果你有按2.1节说的,Animation Type修改为Humanoid,则Avatar会有个默认值,如果为空,则说明你没改好,会有问题的。

至此,运行起游戏,不带任何代码,动画就会执行了,默认一直显示idle的那个动画。

如果要动态切换,就需要加一点脚本了。

2.4 脚本切换动画

这个就比较简单了。先写个脚本如下。

public class AvatarController : MonoBehaviour


public void DoRun() 
    this.gameObject.GetComponent<Animator>().SetBool("Running", true);
    //TODO 也可以同时修改transform.position来实际调整距离


public void DoAttack() 
    this.gameObject.GetComponent<Animator>().SetBool("Running", false);
    this.gameObject.GetComponent<Animator>().SetTrigger("Attack");


public void Stop() 
    this.gameObject.GetComponent<Animator>().SetBool("Running", false);

然后UI上加3个按钮,绑定这3个函数。

效果如下:

unity创建动画的步骤

创建动画的步骤:1.导入模型和动画进行设置2.创建Animator组件3.创建并设置AnimatorController 进行设置上面的设置见下面AnimatorController设置4.设置脚本进行动画的控制添加脚本代码的时候,其中首先要做的是获取本身物体上的Animato... 查看详情

unity游戏教程初步:animator的使用(代码片段)

...动画系统以及管理动画剪辑(AnimationClip)的组件Animator。2Unity中的动画系统 Unity的动画系统又称为Mecanim,是一个基于动画剪辑(AnimationClip)的系统。在此系统中,我们可以通过对游戏对象的一系列属性进... 查看详情

unity-animator组件(代码片段)

Animator组件Animator 是 Unity 中动画控制器的组件,相当于一个动画片段管理器。我们知道在 Unity 中素材可以拖拽到游戏对象上,制作成称为 Clip 的动画片段,如果该对象上没有 Animator 组件,那么... 查看详情

unity动画系统(animation,animator,timeline)(代码片段)

文章目录1.Animation1.1创建Animation1.2Animation属性2.Animator2.1Animator组件2.2Animation状态2.3状态控制参数2.4代码中控制状态3.代码控制动画的播放/暂停/继续播放1.Animation1.1创建Animation选中需要添加动画的物体,打开Animation面板点击Creat... 查看详情

php将数据库/变量名称转换为人物标题(代码片段)

查看详情

unity中获取animator中动画片段的时长(代码片段)

开发环境:Unity5.6.2privateAnimatoranimator;publicvoidGetLengthByName(stringname)floatlength=0;AnimationClip[]clips=animator.runtimeAnimatorController.animationClips;foreach(AnimationClipclipinclips)if(c 查看详情

unity3d动画系统(代码片段)

...。新版动画系统当你导入FBX文件后,会发现模型具有一个Animator(状态机)组件。我们一般将它成为(新)动画系统,新动画系统和旧版的动画系统(unity3d4.3之前版本)的区别就在于使用了Animator组件代替了原来的Animation。旧版动... 查看详情

unity-动画状态机animator

...0c;直接Play(“Idle”)或者CorssFade(“Idle”)就可以播放动画2.Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑1、导入模型及动作,做成预制件(perfab࿰ 查看详情

unity-动画中加入触发事件

...个事件回调,常用于碰撞框开启和关闭、播放特效等animator动画状态机模式(传送门)和animation模式下加入事件1、animator模式首先在模型上挂个脚本代码如下publicclasscharEvents:MonoBehaviourpublicvoidActionEvent1(string_arg1)Debug. 查看详情

unity——animator如何获取所有动画以及如何动态分帧播放(代码片段)

 静态Editor方法,可参考真Unity3d_分享一个Animator帮助类_大话程序员-CSDN博客今天分享一个动态(Runtime)获取Animator所有动画代码:publicAnimator_animator;AnimationClipnowPlay;publicDictionary<string,AnimationClip>animationClips;voidAwake()/... 查看详情

在 Unity2D Sprite 中使用 Animator 将动画添加到游戏对象时无法翻译游戏对象

】在Unity2DSprite中使用Animator将动画添加到游戏对象时无法翻译游戏对象【英文标题】:NotabletotranslategameObjectwhenAnimationisalreadyaddedtoitusingAnimatorinUnity2DSprite【发布时间】:2014-06-2511:28:16【问题描述】:我可以通过OnMouseDrag()事件将... 查看详情

unity_animator_stop_replay(重新播放)(代码片段)

...发现再次显示的时候有些属性不会自动复原。解决办法在AnimatorController中添加一个空的AnimatorState为NewState,并拷贝动作相同的animationclip设置NewState的Speed为0,让动画不会播放且停在第1帧设置NewState为DefaultState(默认播放)重复播放m... 查看详情

unity动画系统animation和animator的小实例

...个很简单的动画demo,分别采用2种方法,来对比Animation和Animator的使用方式:  方法1:单独使用Animation  方法2:Animation结合Animator动画Demo两个动画。一个是移动,一个是缩放。  实现方式的对比一、单独Animation来实现... 查看详情

怎么把3dmax里面做的动画在unity中实现

...时候直接复制一份动画文件,然后挂到物品上修改。但是Animator的功能更强大。方法:在工程中点击FBX文件,在导入信息中将Rig修改为Generic,这时系统会自动为FBX生成一个avatar。创建一个AnimatorController,在场景中为模型添加Animat... 查看详情

unity—particlesystem(粒子系统)与animator(动画状态机)批量管理器(代码片段)

Unity——ParticleSystem(粒子系统)与Animator(动画状态机)批量管理器该脚本可以在Unity运行时同时播放多个粒子与动画,方便美工、特效师反复查看特效和动画细节。(注:该脚本只做了简单的循环播... 查看详情

unity中的ai算法和实现2-有限状态机fsm(上)(代码片段)

...和转换的"管理器(Manager)",就组成了一个FSM.Unity中的Animator就是一个典型的FSM,想必大家已经不陌生了.为了避免太过抽象,我们下面借助Animator来介绍FSM的概念,并添加我们要用到的两个状态.借助Animator设计状态机首先我们要知... 查看详情

unity为啥将赋值的模型作为预制物,然后赋值丢失

参考技术A任何只存在于scene里的物体都不能赋值给Prefab,毕竟你可能有很多Scene。把那个物体拖进ProjectView里面,让它成为Prefab后就能赋值给Prefab了。本回答被提问者采纳 查看详情

unity模型

...为Z轴正方向,Y轴正方向为头顶方向,X轴正方向为人物右侧2、导入模型的基本流程美术同学用3D建模软件制作好模型导出FBX格式模型资源程序将这些模型资源导入到Unity的资源文件夹中在Unity内部对这些模型进行基础设置... 查看详情