【Unity】游戏体销毁重新实例化GameObject后相同结构动画的衔接

游戏体销毁重新实例化GameObject后相同结构动画的衔接

今天在做现在的小项目时,遇到一个动画上的问题:当动画正在播放的时候游戏体被销毁,产生新的游戏体(这个游戏体和上一个游戏体有相同结构的Animator控制体,但其中的Clip可能不同)替换上一个被销毁的游戏体时,如果不对动画做特定处理,就会出现动画出错的问题(新产生的游戏体会默认播放default的动画)。

需要解决的问题:

  • 我们需要知道当前的Animator正在播放哪一个Animation
  • 我们需要知道当前的Animation播放到什么地方了

问题的解决:

  • 查看文档可以发现,Animator中有GetCurrentAnimatorClipInfoGetCurrentStateInfo两个看起来能返回有用信息的公共方法,经试验,发现GetCurrentStateInfo有用,我们可以使用其返回的AnimatorStateInfo来获取当前正在播放的动画片段,以及播放到底规范化时间,通过AnimatorStateInfo.IsName可以比对得出当前播放动画片段的名称,eg.

AnimatorStateInfo animatorState = this.getComponentInChildren().GetCurrentAnimatorStateInfo(0);
animatorState.IsName("Base Layer.HandBite");
float normalizedTime = animatorState.normalizedTime;

于是我们得到了当前播放动画的片段名和播放的规范化时间,然后销毁旧对象,实例化新对象,由于Animator结构和相应clip的关键帧时间相同,直接调用public void Play(string stateName, int layer = -1, float normalizedTime = float.NegativeInfinity);赋值相关片段名和时间的参数即可在相同位置继续动画了。

Unity,可以使用PrefabUtility类来获取未实例化GameObject预制上的组件。 下面是一个简单的示例,演示如何获取未实例化GameObject预制上的组件: 1. 首先,打开Unity编辑器并创建一个新场景。 2. 在项目视图创建一个新的预制件。 3. 选择预制件并在Inspector视图添加一个新组件。例如,您可以添加一个名为“TestComponent”的C#脚本。 4. 在TestComponent脚本添加以下代码: ``` using UnityEngine; public class TestComponent : MonoBehaviour { public int testValue = 0; } ``` 5. 然后,将预制件拖动到场景。 6. 选择预制件并在Inspector视图更改TestComponent的testValue属性。例如,您可以将其设置为5。 7. 打开脚本编辑器并创建一个新的C#脚本。将以下代码添加到脚本: ``` using UnityEngine; using UnityEditor; public class GetPrefabComponent : MonoBehaviour { public GameObject prefab; void Start() { TestComponent testComponent = PrefabUtility.GetPrefabAssetType(prefab) == PrefabAssetType.Regular ? PrefabUtility.GetPrefabInstanceHandle(prefab).GetComponent<TestComponent>() : null; if (testComponent != null) { Debug.Log("TestComponent testValue: " + testComponent.testValue); } else { Debug.Log("TestComponent not found on prefab"); } } } ``` 8. 在场景创建一个新的空对象,并将GetPrefabComponent脚本添加到该对象上。 9. 在GetPrefabComponent脚本组件,将prefab属性设置为您创建的预制件。 10. 您现在可以运行场景,并查看控制台的输出。如果一切正常,您应该会看到以下消息: ``` TestComponent testValue: 5 ``` 这表明您成功获取了未实例化GameObject预制上的TestComponent组件,并检索了其testValue属性。 希望这个示例能够帮助您了解如何在Unity获取未实例化GameObject预制上的组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值