c# - 动画冲突
问题描述
编辑 - 经过测试,我发现只有一部电梯会动画。所以如果我走进电梯,动画可能不会在上面播放,但会在另一个电梯上播放。我偶然注意到了这一点。我认为动画师会根据我接近的 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
解决方案
首先,问题是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);
}
}
}
推荐阅读
- python - 如何在 OpenCV 中以椭圆形式捕获图像?
- python - 子字符串python列表中的唯一值
- dart - 飞镖中将消除未使用的覆盖?
- vuetify.js - Vuetify 选择在项目前面追加缩进
- ms-wopi - 使用 WOPI 协议的 web 方法是否必须在 office 中使用 office 在线帐户登录
- python-requests - 使用 Postman 挂断套接字
- google-sheets - 插入行时更新所有列公式
- mpi - ImportError:导入 MPI 时 DLL 加载失败
- tally - 是否有任何解决方案可以将数据同时插入到 Tally ERP 9 中的多个公司?
- vba - 在 Word 中切换日期选择器内容控件的区域设置