首页 > 解决方案 > 动画冲突

问题描述

编辑 - 经过测试,我发现只有一部电梯会动画。所以如果我走进电梯,动画可能不会在上面播放,但会在另一个电梯上播放。我偶然注意到了这一点。我认为动画师会根据我接近的 OnTriggerEnter2D 来控制动画。显然,这导致了我遇到的错误。

如何正确标记电梯,以便只有我所在的电梯才能运行动画?

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;

  public class Elevator : MonoBehaviour
 {
private GameObject door;

[SerializeField]
private Text uiTxt; // Elevator UI text element
[SerializeField]
private Image uiBg; // Elevator Background image
[SerializeField]
private Image uiFg; // Elevator Foreground image

private void Start()
{
    door = GameObject.FindWithTag("Elevator");
    door.GetComponent<Animator>().SetBool("doorOpen", false);// Starts closed has to be TRUE to open
    door.GetComponent<Animator>().SetBool("doorClose", false); // Starts closed has to be TRUE to re-close

    uiBg.enabled = false;
    uiFg.enabled = false;
    uiTxt.enabled = false;

}

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "Player")
    {

        door.GetComponent<Animator>().SetBool("doorOpen", true);
        door.GetComponent<Animator>().SetBool("doorClose", false);

        uiBg.enabled = true;
        uiFg.enabled = true;
        uiTxt.enabled = true;

    }
}



private void OnTriggerExit2D(Collider2D collision)
{
    if (collision.gameObject.tag == "Player")
    {
        door.GetComponent<Animator>().SetBool("doorOpen", false);
        door.GetComponent<Animator>().SetBool("doorClose", true);

        uiBg.enabled = false;
        uiFg.enabled = false;
        uiTxt.enabled = false;

    }
    else {
        door.GetComponent<Animator>().SetBool("doorOpen", false);
        door.GetComponent<Animator>().SetBool("doorClose", false);
    }
}
}

如果有帮助,请看一下我设置的动画师: 在此处输入图像描述

我将其设置为参数为布尔值的位置。当doorOpen 为真且doorClose 为假时,门打开。当 doorOpen 为 false 且 doorClose 为 true 时,它​​将关闭。但是,如果两个值都为假,它将什么也不做。

注意 - 我正在使用 Unity 2019.1 Beta

标签: c#unity3d

解决方案


首先,问题是door = GameObject.FindWithTag("Elevator"); 这将返回它找到的第一个带有该标签的游戏​​对象,这就是为什么当您点击 2 个不同的触发器时,同一门会同时为两者设置动画。

在发现这个脚本已经在你的电梯上之后,就不需要 GameObject 门了,因为每个 MonoBehavior 都引用了它自己的 GameObject,你可以创建一个 Animator 变量,然后像这样调用 GetComponent():

public class Elevator : MonoBehavior 
{
    Animator myAnim;

    void Start()
    {
        myAnim = GetComponent<Animator>();
        myAnim.SetBool("doorOpen", true);
        myAnim.SetBool("doorClose", false);
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            myAnim.SetBool("doorOpen", true);
            myAnim.SetBool("doorClose", false);

            uiBg.enabled = true;
            uiFg.enabled = true;
            uiTxt.enabled = true;
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            myAnim.SetBool("doorOpen", false);
            myAnim.SetBool("doorClose", true);

            uiBg.enabled = false;
            uiFg.enabled = false;
            uiTxt.enabled = false;

        }
        else 
        {
            myAnim.SetBool("doorOpen", false);
            myAnim.SetBool("doorClose", false);
        }
    }
}

推荐阅读