【问题标题】:How to make model jump to the first animation frame after enable it?启用后如何让模型跳转到第一个动画帧?
【发布时间】:2017-06-29 00:12:39
【问题描述】:

Unity C# 问题。

我有一个带有动画控制器的模型。在通过 SetActive(false) 禁用模型之前,我需要让它“跳转”到动画的第一帧。因此,如果我在动画期间禁用模型,然后再次启用它,模型应该重置其动画并显示为“默认”状态,因此我可以从头开始动画。

问题是,如果我在动画期间禁用和启用模型,它会在我禁用它时显示在同一帧中。

我尝试添加从“任何状态”到默认状态的转换,将转换持续时间设置为 0,并添加“reatart”布尔参数来触发转换。然后:

myObject.SetBool("restart", true);
myObject.SetActive(false);

但它不起作用,对象再次出现在动画中间冻结。

我认为它可能还需要一些时间来过渡,所以我尝试使用协程作为解决方法:
- 仅禁用网格渲染器
- 在 Animator 中开始过渡到动画的第一帧 (过渡持续时间为 0)
- 稍等
- 设置活动(假)

但是当我再次启用它时,它仍然在动画中间冻结。
为什么会这样?以及如何解决?
非常感谢您!

下面是代码示例:

public void disableObject(){
    StartCoroutine(disableObjectCoroutine());
}

public void enableObject(){
    myObject.GetComponent<Renderer>().enabled = true;
    myObject.SetActive(true);
}

IEnumerator disableObjectCoroutine(){
    myObject.GetComponent<Renderer>().enabled = false;
    myObject.GetComponent<Animator> ().SetBool ("restart", true);
    yield return new WaitForSeconds(.1f);
    myObject.GetComponent<Animator> ().SetBool ("mainAnimation", false);
    myObject.SetActive(false);
}

【问题讨论】:

  • "- 等一下" 为什么要等一下?只需将 Animator 开始过渡设置为动画的第一帧,然后快速将其设置为非活动状态。请用您的代码更新您的问题。
  • @Programmer 添加了!感谢您的回复!
  • 检查答案 nipercop left。如果这不起作用,则删除 WaitForSeconds 内容,然后将 myObject.GetComponent&lt;Renderer&gt;().enabled = false; 移动到 myObject.SetActive(false); 之前和 myObject.GetComponent&lt;Animator&gt; ().SetBool ("mainAnimation", false); 之后。

标签: c# animation unity3d unity5 coroutine


【解决方案1】:

你可以试试这样的想法:

int layer = 0;
int hashName = myAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash; //get current animation name
myAnimator.Play(hashName, layer, 0); // 0 means first frame
myObject.SetActive(false);

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多