【Unity动画】状态机中层的融合原理与用法详解

1. 状态机概念介绍

在Unity中,动画状态机(Animator State Machine)是一种强大的工具,用于控制游戏对象的动画行为。动画状态机由多个动画状态Animation和过渡条件Transition、层组成!而层(Layers)是其中一个关键概念。

欢迎来到Unity的动画世界,这里简直比糖果屋还要甜美!🌈✨我们不仅仅是在操控一群静态的模型,我们要给它们穿上生动的戏服,让它们在你的游戏里如梦如幻地舞动!而这一切都离不开Unity的神奇工具——动画状态机。🎩✨

动画状态机就像是你的游戏中的导演,负责编排角色的一系列动作。想象一下,你有一个勇敢的骑士,他可以走路🚶‍♂️、挥舞剑⚔️、还能高喊口号🗣️。这些就是我们的动画状态,每个状态就是一个场景,一个角色在其中表演不同的戏码。

有趣的地方在于,这些状态之间并不是僵硬的切换,而是通过过渡来实现自然而流畅的转变。比如,当骑士从走路状态突然遇到敌人,动画状态机会像变魔术一样,通过设置的条件,让他迅速从走路转变成挥舞剑的战斗状态。这就是我们的过渡,一种无缝连接动画的魔法通道。✨✨

而层,则是我们动画的分层叠加。就像是一块画布,你可以在上面叠加各种元素。这就允许你的骑士同时进行多个动作,比如他可以一边走路,一边挥舞剑,一边高呼口号。这就是层的魔力,让你可以同时展示多个层次的动画。🎭✨

在代码中,你就是这场戏的编剧。通过简单的代码,你可以调控动画状态机的各个参数,让角色在游戏中舞动起来。按下W键,就是开启了骑士的走路状态,再按下空格键,他就会迅速切换到挥舞剑的状态。🎮✨

总之,动画状态机就是你在游戏中编织梦幻般动画的一张巨大画布,而你就是这场戏的导演和编剧。释放你的创造力,让你的角色在Unity的舞台上娓娓道来,成为游戏中最炫丽的一道风景。🚀🎉

2. 层作用

动画状态机中的层起到了动画混合和组织的作用。它使得开发者可以将不同的动画分别放置在不同的层中,通过调整权重和设置过渡条件,实现更复杂的动画效果。

当谈到Unity的Animator State Machine时,层(Layer)简直是那位不可或缺的魔法师。🎩✨层的作用就像是给你的动画剧场增添了一份神秘的魔法菜单,让你可以同时享受多个动画的盛宴。

2.1. 层是什么?

想象一下,你的游戏是一场精彩的演出,每个动画状态都是不同的节目,而层就是你的剧场布景。每个层都是一个独特的画布,上面可以绘制不同的角色和动画效果。比如,你可以在一个层上放上主角的走路状态,另一个层上放上招手的状态,这样它们可以同时展示而不互相干扰。

2.2 为何需要层?

层的妙处在于,它允许你在同一时刻展示多个动画,就像舞台上同时上演多个场景一样。这为你的游戏增加了更多的维度和深度,让动画变得更加生动有趣。但是这个同时展示需要设置权重分配!

2.3. 在游戏中的实际应用

假设你的游戏主人公是一只可爱的猫咪。你希望这只猫咪既能够走路,又能够挥动着它那肥嘟嘟的小爪子,甚至还能够在一旁摇头晃脑。这时候,层就派上用场了。

在一个层上,你可以设置猫咪走路的动画状态,另一个层上设置挥爪动画状态,再在第三个层上设置摇头动画状态。这样,你的猫咪就可以在游戏中同时展现出这些动画,不再被单一的状态所束缚。

3. 在游戏中的实际用途

层的实际用途非常广泛,特别是在需要处理多个动画状态混合的情况下。例如,在角色控制中,你可能有走路、跑步、攻击等多个动画,通过使用层,你可以更好地管理和控制这些动画的切换和过渡。

4. 以走路、招手、摇头三个为例,详细讲解设置步骤

让我们开始一场精彩的动画旅程,以走路、招手、摇头这三个动作为例,我们将一一揭秘它们在Animator State Machine中的设置步骤。

 步骤一:准备动画资源

首先,确保你已经有走路、招手和摇头的动画资源。这可以是导入的外部动画文件,也可以是在Unity中制作的动画片段。

设置mask

## 步骤二:创建动画控制器

在Unity的项目资源窗口中,右键点击空白处,选择`Create` > `Animator Controller`,然后为其命名。将Animator Controller与你的角色或对象的Animator组件相关联。

## 步骤三:打开Animator视图

双击创建的Animator Controller,打开Animator视图。在这里,你将看到Animator State Machine的舞台,准备开始布置你的动画。

## 步骤四:添加动画状态

在Animator视图中,你将看到一个空白的状态机。右键点击空白处,选择`Create State` > `Empty`,这将是我们的初始状态。重命名这个状态为“Idle”表示空闲状态,即初始状态。

接下来,为走路、招手和摇头分别创建动画状态。右键点击空白处,选择`Create State` > `From Motion...`,然后选择对应的动画资源文件。分别命名这三个状态为“Walk”、“Wave”和“Nod”。

## 步骤五:创建层

在Animator视图的左下角找到“Layers”选项,点击“Add Layer”按钮,创建三个层,分别命名为“WalkLayer”、“WaveLayer”和“NodLayer”。

## 步骤六:设置层中的动画状态

在每个层中,将对应的动画状态拖拽到相应的层上。例如,将“Walk”状态拖到“WalkLayer”上。这样,每个层就拥有了对应的动画状态。

步骤七:设置权重和过渡条件

点击每个层,你可以在Inspector面板中找到“Weight”属性,调整每个层的权重。设置权重决定了每个动画状态的影响程度,权重越高,该状态的动画越明显。

在Animator视图的左下角,你会看到“Layers”选项。点击这个选项,你会看到每个层的名称以及一个“Weight”滑块。在这里,你可以设置每个层的权重,数值范围在0到1之间。以下是步骤:

  • 点击“Layers”选项,确保每个层的权重都被设置为适当的值。比如,“WalkLayer”可以设置为0.8,表示对应的走路状态在整体动画中占有很大的比例。

  • 类似地,设置“WaveLayer”和“NodLayer”的权重,根据你希望的动画比例进行调整。

代码中的修改权重来调节动画融合情况:

在代码中,我们通过 SetLayerWeight 方法来调整每个层的权重。以下是完整的代码:

using UnityEngine;public class CharacterController : MonoBehaviour
{private Animator animator;void Start(){// 获取角色上的Animator组件animator = GetComponent<Animator>();}void Update(){// 触发走路动画if (Input.GetKeyDown(KeyCode.W)){// 设置走路触发器animator.SetTrigger("WalkTrigger");// 调整层的权重animator.SetLayerWeight(animator.GetLayerIndex("WalkLayer"), 0.8f);animator.SetLayerWeight(animator.GetLayerIndex("WaveLayer"), 0.0f);animator.SetLayerWeight(animator.GetLayerIndex("NodLayer"), 0.0f);// 关闭其他触发器animator.ResetTrigger("WaveTrigger");animator.ResetTrigger("NodTrigger");}// 触发招手动画if (Input.GetKeyDown(KeyCode.J)){// 设置招手触发器animator.SetTrigger("WaveTrigger");// 调整层的权重animator.SetLayerWeight(animator.GetLayerIndex("WalkLayer"), 0.0f);animator.SetLayerWeight(animator.GetLayerIndex("WaveLayer"), 0.5f);animator.SetLayerWeight(animator.GetLayerIndex("NodLayer"), 0.0f);// 关闭其他触发器animator.ResetTrigger("WalkTrigger");animator.ResetTrigger("NodTrigger");}// 触发摇头动画if (Input.GetKeyDown(KeyCode.N)){// 设置摇头触发器animator.SetTrigger("NodTrigger");// 调整层的权重animator.SetLayerWeight(animator.GetLayerIndex("WalkLayer"), 0.0f);animator.SetLayerWeight(animator.GetLayerIndex("WaveLayer"), 0.0f);animator.SetLayerWeight(animator.GetLayerIndex("NodLayer"), 0.3f);// 关闭其他触发器animator.ResetTrigger("WalkTrigger");animator.ResetTrigger("WaveTrigger");}}
}

为了实现平滑的过渡,点击状态之间的连线,进入过渡条件的设置。比如,你可以在从“Idle”到“Walk”的过渡上设置条件:“当按下W键时”触发。

这样,你就完成了走路、招手、摇头这三个动作的Animator State Machine设置。快来运行你的游戏,看看你的角色是不是开始在舞台上表演各种精彩动画了!🕺👋🤘

每次触发某个动画时,我们都调用 SetLayerWeight 方法,根据需要调整每个层的权重。这样,你就可以实现动画的平滑过渡和混合效果。希望这次能够满足你的需求!🚀🎮

5. 列表

以下是一个走路、招手、摇头三个层的可能的权重组合列表:

走路权重招手权重摇头权重动画混合效果
1.00.00.0只播放走路动画
0.01.00.0只播放招手动画
0.00.01.0只播放摇头动画
0.50.50.0走路和招手动画平均混合
0.00.50.5招手和摇头动画平均混合
0.40.30.3走路、招手和摇头动画平均混合
0.70.20.1走路更明显,招手和摇头动画轻微混合

6. 控制权重的代码示例

在代码中,你可以使用SetLayerWeight方法来设置每个层的权重,实现不同动画状态之间的混合和切换。

animator.SetLayerWeight(animator.GetLayerIndex("Walk"), 0.5f); 
animator.SetLayerWeight(animator.GetLayerIndex("Wave"), 0.5f); 
animator.SetLayerWeight(animator.GetLayerIndex("Nod"), 0.0f);

7. 总结

动画状态机中的层为游戏开发者提供了一种有效的组织和控制动画的手段。通过合理设置层的权重和过渡条件,你可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历 **思路&#xff1a;我们每一次一定可以根据递归确定根节点是哪个&#xff0c;就是前序第一个数&#xff0c;然后找中序遍历这个点&#xff0c;看左子树有几个节点&#xff0c;右子树有几个节点&#xff0c;然后就可以根据节点个数&#xff0c;递归左子树和右…

Swing程序设计(7)JPane面板,滑动面板

文章目录 前言一、JPane面板&#xff0c;滑动面板是什么&#xff1f;二、实操展示 1.JPane面板2.JScrollPane面板总结 前言 该篇博客介绍Java的Swing程序中JPane面板以及&#xff0c;滑动面板的使用。面板的使用&#xff0c;各个组件在不同的面板上被不同地摆放&#xff0c;让插…

Rust 语言:认识 Rust

本心、输入输出、结果 文章目录 Rust 语言&#xff1a;认识 Rust前言Rust的特点Rust LOGO Rust 在IT行业的应用前景Rust 是一门系统级编程语言相关链接花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 Rust 语言&#xff1a;认识 Rust 编辑&#xff1a;简简单单 Onl…

【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式

本文讲解在ArcGIS Pro中制作全球任意经纬网的两种方式。 文章目录 一、生成全球经纬网矢量1. 新建地图加载数据2. 创建经纬网矢量数据二、布局生成经纬网1. 新建布局2. 创建地图框2. 创建经纬网一、生成全球经纬网矢量 以1:100万比例尺地图分幅为例,创建经差6、维差4的经纬网…

51. N 皇后

题目介绍 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案…

Tektronix泰克示波器

一、what’s the oscilloscope&#xff1f; 【ref】https://www.tek.com.cn/blog/what-is-an-oscilloscope 二、基础知识 1、带宽&#xff1a;100Mhz&#xff1b;采样率&#xff1a;2.5GS/s 1GS/s指的是采样率&#xff0c;前面大写的S是sample采样的意思 后面的s是秒 也就是示波…

软考2016年上半年第六题(适配器模式)与手术训练系统项目适配器模式的应用

软考2016年上半年第六题 public class Address {public void street(){System.out.println("a");};public void zip(){};public void city(){}; }package org.example.适配器模式;/*** 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间…

Beta冲刺随笔-DAY4-橘色肥猫

这个作业属于哪个课程软件工程A这个作业要求在哪里团队作业–站立式会议Beta冲刺作业目标记录Beta冲刺Day4团队名称橘色肥猫团队置顶集合随笔链接Beta冲刺笔记-置顶-橘色肥猫-CSDN博客 文章目录 SCRUM部分站立式会议照片成员描述 PM报告项目程序&#xff0f;模块的最新运行图片…

设计模式-结构型模式之装饰者设计模式

文章目录 六、装饰者模式 六、装饰者模式 装饰者模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。它是作为现有的类的一个包装。 装饰类和被装饰类可以独立发展&#xff0c;不会相互耦合&#xff0c;装饰者模…

力扣题:字符串的反转-11.22

力扣题-11.22 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;541. 反转字符串 II 解题思想&#xff1a;进行遍历翻转即可 class Solution(object):def reverseStr(self, s, k):""":type s: str:type k: int:rtype: str"&quo…

【Python】tensorflow学习的个人纪录(2)

actor.learn(s, a, td_error)def learn(self, s, a, td):s s[np.newaxis, :]feed_dict {self.s: s, self.a: a, self.td_error: td}_, exp_v self.sess.run([self.train_op, self.exp_v], feed_dict)return exp_v输入变量的数值&#xff1a; 步进&#xff1a; []---->[…

JavaWeb(二)

一、SQL简介 结构化查询语言&#xff0c;一门操作关系型数据库的编程语言。英文&#xff1a;Structured Query Language&#xff0c;简称 SQL。 二、Mysql和Oracle关于区分大小写 MySQL在Windows下都不区分大小写。 oracle中分为两种情况&#xff0c;单纯的sql语句不区分大小…

漏洞扫描服务是什么

漏洞扫描服务是维护网络安全的重要一环。通过定期或实时的漏洞扫描&#xff0c;组织可以及时发现并修复可能存在的安全威胁&#xff0c;增强自身网络的安全性。在选择漏洞扫描服务时&#xff0c;需要明确自身的需求和目标&#xff0c;并选择合适的工具和服务提供商。只有这样&a…

使用VC++实现锐化处理(使用Sobel算子、Prewitt算子、Isotropic算子)

使用VC实现锐化处理&#xff08;使用Sobel算子、Prewitt算子、Isotropic算子&#xff09; 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章&#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像…

Vxworks6.9的在线gdb调试(仿真内核和板载内核)

创作目的&#xff1a;归纳总结常用的技巧和方法&#xff0c;方便自己后续查阅重点节省时间。 一、仿真内核的gdb调试 1、新建DKM工程&#xff0c;选择sim的BSP包 2、DKM工程中添加c文件并编辑入口函数 3、新建vxworks远端系统 4、显示系统起来之后进行加载.out 5、选择Debug模…

基于hadoop下的Kafka分布式安装

简介 Kafka是一种分布式流处理平台&#xff0c;它具有高吞吐量、可扩展性、可靠性、实时性和灵活性等优点。它能够支持每秒数百万条消息的传输&#xff0c;并且可以通过增加节点来增加吞吐量和存储容量。Kafka通过将数据复制到多个节点来实现数据冗余和高可用性&#xff0c;即使…

Linux脚本awk命令

目录 一. awk命令简介 1. awk版本 2. awk与vim的区别 3. awk与sed的区别 4. awk工作原理 5. awk格式 6. awk常用选项 二. awk基础用法 1. awk基础用法 2. BEGIN和END语句块 3. 指定分隔符 4. 首尾关键字 三. awk内置变量 1. FS变量 2. OFS变量 3. RS变量 4. NF…

30、LCD1602

LCD1602介绍 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符 显示容量&#xff1a;162个字符&#xff0c;每个字符为5*7点阵 …

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器 对象这个词在Spring范围内&#xff0c;称为bean Spring两大核心思想 1.IOC (IOC是控制反转&#xff0c;意思是控制权反转-控制权&#xff08;正常是谁用这个对象&#xff0c;谁去创建&#xff0c;&#xff09;-控制对象的控制权&#xf…

轻量封装WebGPU渲染系统示例<41>- 前向渲染的雾(Fog)效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/FogTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class FogTest {private mRscene new Rend…