[Unity] AnimatorStates中的write defaults详解

2023-10-06 22:38

本文主要是介绍[Unity] AnimatorStates中的write defaults详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AnimatorState中有一个参数writeDefaultValues,在Inspector中显示的则是Write Defaults

这里写图片描述

官方文档对这个参数的解释是

Whether or not the AnimatorStates writes back the default values for properties that are not animated by its Motion.

这个可有可无的官方解释对读者几乎没有任何价值可言。勾上了writeDefaults的State中不被该motion修改的值都会变为默认值。最关键的一点,这个默认值是什么这里没有给出答案。

在实际的游戏制作过程中,我们会使用对象池来缓存那些暂时用不到但会在之后使用到的游戏体。当我们缓存这些游戏体时,一般会将这些游戏体设置为非活跃状态(GameObject.SetActive(false)),当我们重对象池中取出带有动画的游戏体的时候我们希望这些游戏体拥有和新产生的游戏体一样的状态,但是,结果往往不如人意(如果在游戏体被缓存前SpriteRenderer的透明度改为了0重新取出的时候仍旧是0,而我们希望它是初始的1)。

解释一下什么是我希望发生的:

这里写图片描述

动画状态机里面的State的writeDefaults都被勾选上了,播放完FadeTo的动画之后会进入Default(没有motion的空状态)这个状态,正常来说进入这个状态之后游戏体会重置回默认值。嗯,this works well。但是当FadeTo0退出的时候游戏体被回收,回收的游戏体并不会重置到默认值。再次取出这个游戏体的时候就可能出错。

Unity论坛上看到Unity技术人员这么解释:

1- When the Animator is Initialized, we go through all the clips in the current AnimatorController, and we collect all the animated values of all the clips. It also collects the current value (from the scene) of all those, and saves this as the default value.2- When you play a state with WriteDefaults that doesn't animate a value, the default value is written.

这里的Initialized是有歧义的,经测试应该是解释为Enable。

所以我们问题的关键是回收之前没有重置状态,需要想办法让状态重置。这本来应该是Unity给我们做好的事情,所以并不想自己实现一套writedefaults的功能。该技术人员给出了一种挺好的解决方案

* animator.Crossfade("DefaultPose", 0f); //Force switch to Default Pose State, instant transition
* animator.Update(0f); //force transition completion, your object should now be in default pose
* go.SetActive(false); //disabled in default pose

解释一下,也就是创建好一个勾上了write defaults的空状态,在回收该游戏体之前先过渡到这个状态,然后调用Animator的Update方法,并传参数0,这样做的意义是让空状态播放一下,让Unity自动为我们做状态重置的工作。

经测试,这个方法很好使!
该讨论的论坛地址是:https://forum.unity3d.com/threads/write-defaults-confusion-bug.392058/

这篇关于[Unity] AnimatorStates中的write defaults详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R