【Unity3D游戏开发学习笔记】(四)一切都动起来—Animator组件的应用

2023-10-31

一、Animation简介

动画原本是指由许多连续的图片在人眼前面快速播放,肉眼因视觉残像产生错觉,而误以为画面活动的作品。 但在 Unity3D 中的“ Animation”【动画】 系统应该这样理解——用于为游戏者自动播放人物动作或自动演示物体运动路径、色泽、尺寸变化,以及事件触发的集成组件。
我们可以先看一个实例感受一下:

上一节我们知道怎么建造一个地形,添加系统的playercontroller资源,现在我们先简单的建一个地形出来,导入StandardAsset的the third player controller,如下图:

这里写图片描述

刚导入的第三人称控制器的时候,有些同学可能会遇到动画丢失的问题,如图找到
这里写图片描述
将资源文件夹中对应的Animation文件拖进脚本即可,然后运行游戏,可以看到小人会随之运动起来。

二、Mecanim动画系统

Mecanim动画系统是Unity3D推出的全新的动画系统,具有重定向、可融合等诸多新特性,新增了状态机等概念。首先我们要了解Mecanim系统,必须先要对以下的概念有所了解:

1、Animation文件

在 Unity3D 中的 Animation 文件是用来记录物体运动信息的文件,你可以用鼠标右键点击“Project”【 项目文件栏】 ——>“Create” ——>“Animation” 来创建一个 Animation文件,创建好之后的文件为一个时钟的小图标 。 除此而外,你导入的模型文件如果带有动画信息, Unity3D 也会将这些动画信息自动的分离为 Animation 文件。
最简单的使用Animation的方法就是,将这个Animation拖至你需要动画的Gameobject当中,然后选择该GameObject,按下ctrl + 6,弹出Animation窗口,在时间轴中右键插入关键帧,然后再在关键帧中对GameObject的一些属性变化进行自己的编辑即可。

2、Avatar

Avatar,即阿凡达,这是Mecanim动画系统中实现动画绑定的一个接口,该接口可以实现骨骼和肌肉系统的匹配,从而保证角色在执行动画的时候,角色能够按照预先设定的动画来运动。首先我们先导入一个模型资源,笔者在这里用的是Asset Store里面的Robot Kyle的资源包,具体导入方式:登陆Asset Store下载,选择在Unity中打开即可自动导入,下载完的Package一般存放于C:/Users/XXX/AppData/Roaming/Unity/Asset Store/Unity Technologies/目录中。
好了,不说这么多,我们先来看看我们导入的模型吧
这里写图片描述
箭头1指向的是我们在Project面板中的模型资源,我们选中它,在Inspector面板中可以看到有三个选项卡:Model , Rig, Animations(箭头2所示),点击Rig选项卡,将Animation Type设为Humanoid,即双足类型的动画。这种类型可以支持大多数的类人形的模型。此外,Lagacy类型用来兼容Unity3D低版本中的模型动画,Generic类型是一种介于人形和非人形的模型之间的通用类型。我们选择Humanoid类型后,在下方选择生成Avater的类型诶Create Form This Model,即通过当前的模型来生成一个Avater(箭头3指向)

在生成了Avatar之后,我们可以通过点击Configure进行编辑和查看骨骼绑定是否正确,也可以切换到Muscles选项卡中,这是我们可以通过拖动滑块来检查模型匹配是否正确。在这个案例中,我们导入的模型骨架没有任何的问题,所以直接按下Done完成确认即可。
这里写图片描述

3、AnimatorController

在了解和绑定好了Avatar之后,我们就进入了Mecanim的核心组件的学习:AnimatorController。
如果说Avater是将模型的身体和骨骼实现匹配的接口,那么AnimatorController就是将动画和模型实现绑定的接口。我们这里创建一个RobotAnimatorController。双击该文件,会打开Animator窗口,如下图
这里写图片描述

这里会涉及到一个概念:States(动画状态),其实这也就是一个有限状态机,在进入每一个State之前,会有一个判断条件是否进入,当判断条件达到,则满足该状态,进行该状态的动画播放。关于有限状态机的内容,笔者不打算在这细说,大家只需简单的理解以下的情况就好:
Entry(Animator入口)—>DefaultState(默认状态)—>Next State(满足条件的下一个状态)—>Exit(离开状态)

下面我们就来学习一下该怎么使用这个Animator。

我们看到上图,上面标志有三个State(事实上有四个,还有一个Exit没有截出来),其中,Idle是我们自己新建的一个State,设置成DefaultState,代表在正常状态下是执行这个State的动画,在Entry状态上右键,选择make Transition,并连接到Idle状态。然后我们点击Idle状态,在Inspector面板中的motion中进行动画的绑定(下面会说明简单的Animation如何制作,现在我们用的是Asset Store里面的资源,笔者用的是Mixamo,一个免费的动作资源包,里面的动作还是挺好的)选中其中的一个Idle动画进行绑定,在绑定完了动画之后,我们回到Scene面板,选中需要添加动作的Object,在Inspector面板中,点击AddComponent—>Animator,然后把我们的RobotAnimatorController赋值给相应的属性即可,如下图:

这里写图片描述

现在,我们来运行游戏看看吧!!我们可以看到,Robot君已经在悠闲的晃悠起来了!

这里写图片描述

这里写图片描述

好不容易终于把这个懒惰的Robot给动起来了,那么我们就不能让他这么轻松,我们得想办法让这个懒鬼跑起来,甩起来!(Robot君:我…^%&…&*,能不能让我安静的当一个美男子→_→)
我们接下来,跟上面的步骤一样,在Animator的界面,新建两个State并绑定上动画,然后将他们跟Idle连接起来,如下面所示:

这里写图片描述

接下来,我们给这个Animator添加一个状态字,如上图箭头所示,新增一个Int类型的状态字,并命名为ActionID,默认值为0。然后,我们选中其中一个Transition,就拿Idle->Walk_Front 这个Transition为例吧,我们选中它,然后再在Inspector里面看到,在Condition中,我们往上面添加一个判断条件,参数为ActionID,行为是Equals ,值为1,意思是,当当前Animator的ActionID这个值为1的时候,Animator就会执行Idle->Walk_Front这个状态,停止Idle的播放,改为播放Walk_Front。(这里有个主意的地方,如果你勾选了Has Exit Time ,那么你在转换动画的时候就会有一定的延迟播放,这个就看各人需要了)
Animator的设定我们已经设定好了,那么我们又怎样在游戏当中改变它的动作呢?请看下面的代码(具体的代码这一节不会多说,之后讲到相关api编程的时候再进行提及)

我们新建一个C#Script ,然后将下面代码复制上,赋给 Robot对象,按下相应的按键即可看见效果,代码都比较简单,就是获取按下的键,然后改变Animator里面ActionId的值,相信大家都应该没什么大的理解问题。

using UnityEngine;
using System.Collections;

public class Animation : MonoBehaviour {

    private Animator m_Animator = null;

    // Use this for initialization
    void Start () 
    {
        m_Animator = GetComponent<Animator>();//获取当前对象的Animator
    }

    // Update is called once per frame
    void Update () 
    {
        if (Input.GetKeyDown(KeyCode.W))
            m_Animator.SetInteger("ActionID", 1);
        if (Input.GetKeyDown(KeyCode.K))
            m_Animator.SetInteger("ActionID", 2);

        if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.K))
            m_Animator.SetInteger("ActionID", 0);
    }
}

下面我们来看看效果:
这里写图片描述 这里写图片描述

唔,还不错,虽然看着有点丑(Robot君:→_→怪我咯?)
关于更多Animator的接口,大家可以参看:http://wiki.ceeger.com/script:unityengine:classes:animator:animator

唉,Unity的动画系统还是很强大的,笔者这里提及的都是很基础的,更多的东西还是需要各位去探索和运用,哪位小伙伴用的好的来教教我_(:з」∠)

楼主所用资源包下载渠道:
动作资源包:http://download.csdn.net/detail/nizihabi/9169503
robot 模型:http://download.csdn.net/detail/nizihabi/9169557

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity3D游戏开发学习笔记】(四)一切都动起来—Animator组件的应用 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 使用 C# 读取 Soap 消息

  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 【Spring】Feign客户端发送HTTPS请求绕过认证

    1 概述 转载 https www jianshu com p ea627708ab52 一个Spring Boot项目 为了使用Harbor仓库 起初通过Spring RestTemplate完成了对Harbor仓库的HTTPS请求 后想
  • 编程调节Win7/Win8系统音量的一种方法

    include
  • Cheat Engine使用教程

    系列文章目录 文章目录 系列文章目录 前言 一 解决办法 二 使用步骤 1 下载Cheat Engine 2 设置 前言 计算机硬盘不够用 但里面很多文件也舍不得删除 只有靠百度网盘来撑撑大小了 所以省吃俭用购买了百度会员 心疼每个月好几十
  • MPI_Bcast函数的用法

    程序功能 MPI Bcast函数用法 作成日期 2016 12 14 详细说明 include
  • AltiumDesigner如何绘制PCB封装

    AltiumDesigner如何绘制PCB封装 一 为什么要自己画PCB封装 当我们需要用的一些元器件PCB封装库中找不到的时候 我们就需要自己手动绘制一些元器件的PCB封装 当然也可以选择用相似的代替 但是在一些长场合中并不允许我们这样做
  • openwrt编译问题记录

    目录 1 git clone 速度太慢甚至断开连接 2 编译openwrt镜像make时发生错误 3 scripts feeds install a 时出现警告 1 git clone 速度太慢甚至断开连接 解决办法 在clone时将git
  • 如何显示文件后缀

    一 如何显示文件后缀 1 首先打开电脑上的本地磁盘D 2 然后点击组织 3 在弹出的窗口中点击文件夹和搜索 4 在弹出的窗口在点击查看 5 下拉滚动条 6 最后取消勾选隐藏已知文件类型的扩展名
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 使用Python语言实现凯撒密码的加密和解密

    使用Python语言实现凯撒密码的加密和解密 介绍 在密码学中 恺撒密码 英语 Caesar cipher 或称恺撒加密 恺撒变换 变换加密 是一种最简单且最广为人知的加密技术 它是一种替换加密的技术 明文中的所有字母都在字母表上向后 或向
  • Nginx配置https访问

    1 准备好证书和秘钥 如果是云服务器 可以到对应的云服务器上购买ssl证书 我这里是百度云 我以百度云为例子 直达链接 https console bce baidu com cas cas apply create 这个是免费1年的 可以
  • sql server数据库常见语句——增删查改

    一表数据增删查改 1 查询 select from 表名 select from test 2 新增 insert 表名 字段1 字段2 values 值1 值2 insert test a b values 1 2 3 修改 update
  • Meetup回顾|星策社区FeatureStore Meetup V2

    继2021年12月11日举办第一次Feature Store Meetup之后 星策开源社区于2022年4月10日举办了第二期 FeatureStore Meetup V2 本次活动邀请星策社区发起人 中国开源推进联盟副秘书长 开放原子基金
  • ADC外部RC电路电阻和电容选取计算方法

    ADC采样过程中遇到的问题 ADC是从模拟到数字世界的桥梁 当前ADC模块基本是MCU的标配 而且在转换速度和精度都有很好的表现 如NXP Kinetis KE15内部有2个16bit SAR型ADC模块 以精度制胜 可以配合EDMA完美实
  • vue实现音频audio列表循环,实现暂停播放切换

    功能界面如下 功能使用如下 首先根据后端返回的音频地址进行渲染 其中playAudioSrc字段用来控制暂停样式还是播放样式 audio进行隐藏 ul class virtualAvararFooterRightContentAudio l
  • vue局部注册指令和全局注册指令

    全局注册 1 目录下创建directive文件夹 然后下面就是各指令文件 还有一个总包括指令directive js 标识所有的指令都会引入到这里 import testA from testA import testB from test
  • STM32 CubeMx教程 -- 基础知识及配置使用教程

    文章目录 前言 一 STM32CubeMx 界面介绍 File 界面 Windows 界面 Help 界面 Updater Settings 界面 二 STM32CubeMx 使用教程 新建工程 配置RCC时钟参数 配置SYS参数 配置时钟
  • FPGA project : VGA

    module vga ctrl input wire vga clk input wire vga rst n input wire 15 00 pix data output wire hsync output wire vsync ou
  • 虚拟机使用前的一些小配置

    最近在学mongodb 为了能深入理解 所以我一边学一边整理一些乱七八糟的笔记 下载安装VMware Workstation Pro和Xshell7 以及获取镜像 创建虚拟机 安装CentOS7系统的过程就不多说了 反正现在的情况就是 我们
  • 【ARIMA-WOA-CNN-LSTM】合差分自回归移动平均方法-鲸鱼优化-卷积神经网络-长短期记忆神经网络研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 ARIMA模型 1 2 鲸鱼优化算法 1 3 卷积神经网络 1 4 LSTM 模型 2 运行结果
  • 【Unity3D游戏开发学习笔记】(四)一切都动起来—Animator组件的应用

    一 Animation简介 动画原本是指由许多连续的图片在人眼前面快速播放 肉眼因视觉残像产生错觉 而误以为画面活动的作品 但在 Unity3D 中的 Animation 动画 系统应该这样理解 用于为游戏者自动播放人物动作或自动演示物体运