[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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装