[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

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML