【问题标题】:Unity - Change character only when animation stoppedUnity - 仅在动画停止时更改角色
【发布时间】:2018-09-17 23:10:37
【问题描述】:

我有两个对象(相同的角色,但在不同的功能中),我想在动画停止和通过点击触发运行时更改角色。例如,我有Kick_Player,其中有点击触发的动画,当Kick_Player结束动画时,我希望它自动更改为Player_Stopped。姿势彼此不同,因为我需要做这些改变。

我用this.MyAnimator.GetCurrentAnimatorStateInfo(0).IsName("My_Animation") 尝试了一些东西,但是我没有成功。有没有办法做到这一点?

public class TapController : MonoBehaviour {

    Animator Anim;

    public GameObject CharacterToController; //Kick_Player
    public GameObject CharacterToBeStopped; //Player_Stopped

     void Start(){
      Anim = CharacterToController.GetComponent<Animator>();
      CharacterToBeStopped.SetActive(false);
     }

     void Update(){
      if(input.GetMouseButtonDown(0)){
       if(!CharacterToController.activeSelf){
        CharacterToController.SetActive(true);
       }

       Anim.Play("Kick_Ball");


     if(!this.Anim.GetCurrentAnimatorStateInfo(0).IsName("Kick_Ball") {
        CharacterToController.SetActive(false);
        CharacterToBeStopped.SetActive(true);
      }
     }

}

我做了这段代码来测试,但它不起作用

【问题讨论】:

  • My_Animation 的值是多少?你能展示一下你是如何播放动画的吗?
  • 价值是什么意思?我运行了一个实例,之后,每个更新触发器,它运行动画。我将用我的代码更新问题
  • 你说你试过this.MyAnimator.GetCurrentAnimatorStateInfo(0).IsName("My_Animation")?我问你My_Animation 的值。我的意思是你在那里使用的实际字符串。这很重要。我需要知道你在比较什么值。此外,您应该展示您正在播放或触发(在代码中)动画的方式
  • @Programmer 我更新了我的问题

标签: c# unity3d


【解决方案1】:

使用IsName 函数需要在实际动画状态之前添加动画状态的基础层名称前缀。

默认的基础名称通常是“基础层”

if(!this.Anim.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Kick_Ball") 

请注意,您必须在 if(input.GetMouseButtonDown(0)){ 之外执行此操作,否则将永远不会有机会被检查。


我看到过关于IsName 不适用于某些人的报告,因此如果您这样做但仍有问题,请考虑以其他方式进行。

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if (!CharacterToController.activeSelf)
        {
            CharacterToController.SetActive(true);
        }

        Anim.Play("Kick_Ball");

        StartCoroutine(PlayAndWaitForAnim(Anim, "Kick_Ball"));
    }
}


const string animBaseLayer = "Base Layer";
int animHash = Animator.StringToHash(animBaseLayer + ".Kick_Ball");

public IEnumerator PlayAndWaitForAnim(Animator targetAnim, string stateName)
{
    targetAnim.Play(stateName);


    //Wait until we enter the current state
    while (targetAnim.GetCurrentAnimatorStateInfo(0).fullPathHash != animHash)
    {
        yield return null;
    }

    float counter = 0;
    float waitTime = targetAnim.GetCurrentAnimatorStateInfo(0).length;

    //Now, Wait until the current state is done playing
    while (counter < (waitTime))
    {
        counter += Time.deltaTime;
        yield return null;
    }

    //Done playing. Do something below!
    Debug.Log("Done Playing");

    CharacterToController.SetActive(false);
    CharacterToBeStopped.SetActive(true);
}

【讨论】:

  • 我会在这里尝试,稍后我会带来答案
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多