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

news2025/2/24 12:07:13

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.coloradmin.cn/o/1285927.html

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

相关文章

抖音本地生活服务商申请入口在哪里?具体流程是怎样的?

不论是抖音的本地生活业务&#xff0c;还是后来的支付宝、视频号的本地生活业务&#xff0c;因为市场体量足够庞大&#xff0c;市场前景广阔&#xff0c;一直很受各大创业者的追捧。那么&#xff0c;如此火热的本地生活项目&#xff0c;想要申请成为服务商&#xff0c;具体的申…

五个轻量级免费 PDF 阅读器

便携式文档格式 (PDF) 是商业中最常用的文档类型之一。它们不仅是创建精心设计的文档的更通用的解决方案&#xff0c;而且还具有交互性和安全性。因此&#xff0c;对于寻求具有专业外观的文档的企业来说&#xff0c;PDF 是理所当然的选择。 当谈到查看这些文档时&#xff0c;大…

高等职业学校新媒体营销实训室解决方案

背景 随着数字化时代的来临&#xff0c;新媒体营销成为企业推广和品牌建设的关键手段。为了培养高职学生在新媒体领域的实际操作能力&#xff0c;建立一套全面、系统的实训室方案至关重要。 目标 搭建高职新媒体营销实训室&#xff0c;旨在培养学生的实际操作能力&#xff0…

微机原理11

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) CPU 的数据总线提供&#xff08;&#xff09; A.数据信号流 B. 地址信号流 C.来自1O设备和存储器的响应信号 D.所有存储器和1/O设…

VirtualBox+Vagrant安装虚拟机

文章目录 一、下载Virtualbox和Vagrant1、下载2、安装 二、安装虚拟机1、新建目录D:\VirtualMachine2、执行vagrant init centos/7命令&#xff0c;就会在该目录下创建Vagrantfile文件3、执行vagrant up命令4、查看当前主机分给虚拟机的网关网段5、找到D:\VirtualMachine下的Va…

自定义一个简单的JDBC连接池实现方法(附代码演示)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍自定义一个简单的JDBC连接池实现方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在…

github首次将文件合到远端分支,发现名字不是master,而是main

暂存区和本地仓库的信息都存储在.git目录中其中 其中&#xff0c;暂存区和本地仓库的信息都存储在.git目录中 在自己的github上实践 1、刚开始&#xff0c;git clone gitgithub.com:lingze8678/my_github.git到本地 2、在克隆后的代码中加入一个pdf文件 3、在git bash中操作…

查询绑定了所有id的name

1、如图&#xff0c;绑定了所有id的有A,B两个name 2、第一种Sql及效率 explain SELECT name,count(id) as count from test GROUP BY name HAVING count(id)(SELECT count(DISTINCT id) from test); 3、第二种sql及效率 explain select * from (SELECT name,count(id) as co…

VS2022异常解决Could not get emulator name after starting AVD

1、问题描述 在启动安卓仿真器时&#xff0c;弹出这个框 2、设置信息 冲着NET 8升级的VS2022&#xff0c;将其升级为 17.8.2&#xff0c;结果Xamarin开发时&#xff0c;安卓模拟器死活起不来&#xff0c;起来就黑屏。然后网上各种搜解决方案&#xff08;包括不限于&#xf…

Fiddler抓包详细实用保姆级教程,小白一看就会

一、Fiddler4工作原理 Fiddler 是一款以代理web服务器的形式工作的&#xff0c;它使用代理地址:127.0.0.1&#xff0c;端口:8888,这是fiddler的默认端口。 我们发送的每一个请求和收到的每一个响应都会先经过fiddler&#xff0c;这样就实现了抓取数据包的工作 当Fiddler退出时…

C++基础 -41- 迭代器

每个stl 模板接口都有一个专用的迭代器 迭代器就是 stl 库中的 一个特殊指针&#xff0c;功能与指针类似(类似但不是) 迭代器定义格式 迭代器的使用,使用迭代器遍历向量容器的参数 代码运行结果 无论使用普通方式还是迭代器方式去都可以遍历vector容器

软著项目推荐 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

线程池原理初探

1.引言 合理利用线程池能够带来三个好处。第一&#xff1a;降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二&#xff1a;提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行。第三&#xff1a;提高线程的可管理性。…

windows下DSS界面本地集成linkis管理台

说明&#xff1a;当前开发环境为windows&#xff0c;node版本使用16.15.1。启动web时&#xff0c;确保后端服务已准备就绪。 1.linkis web编译 #进入项目WEB根目录 $ cd linkis/linkis-web #安装项目所需依赖 $ npm install参考官方编译说明&#xff0c;windows下编译一直异常…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…

利用 EC2 和 S3 免费搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。 &#x1f4bb;创建实例 控制台搜索EC2 点击启动EC2 选择AMI 选择可免费试用的 g代表采用了Graviton2芯片。 配置存储 配…

AIGC创作ChatGPT源码+AI绘画(Midjourney绘画)+支持GPT-4-Turbo模型+DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

插入排序和希尔排序

目录 1.插入排序 &#xff08;1&#xff09;基本思想&#xff1a; &#xff08;2&#xff09;直接插入排序 2.希尔排序&#xff08;进阶插排&#xff09; 1.插入排序 &#xff08;1&#xff09;基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本…

客户关系管理系统的功能内容

客户管理是企业经营中至关重要的一环&#xff0c;它涉及到与客户建立、维护和加强关系的全过程。一个成功的客户管理系统能够帮助企业更好地了解客户需求、提供个性化服务&#xff0c;从而提高客户满意度和忠诚度&#xff0c;推动企业的可持续发展。本文将探讨客户管理的各个方…

协议栈的内部结构

上层会向下层逐层委派工作。 最上面的部分是网络应用程序&#xff0c;它们会将收发数据等工作委派给下层的部分来完成。尽管不同的应用程序收发的数据内容不同&#xff0c;但收发数据的操作是共通的。 应用程序的下面是Socket库&#xff0c;其中包括解析器&#xff0c;解析器…