如何在需要时打开门

时间:2016-02-05 11:18:01

标签: c# animation unity3d

我有一扇门,门两侧都有按钮。每个按钮都应该打开门。

当我按下Button1时,门打开,再次按下,门关闭。但是如果我按下Button1然后按下Button2,门将再次打开,而不是关闭。

enter image description here

我使用动画打开/关闭。无法理解,出了什么问题

1 个答案:

答案 0 :(得分:4)

至关重要

不使用静态变量

在这种情况下。

您会很高兴知道解决方案很简单。有一个名为AttachToDoor

的脚本
public void AttachToDoor()
 {
 private bool isOpen;
 public float doorSpeed;
 etc etc
 public void OpenCloseDoor()
   {
   your code to open/close a door
   }
 }

AttachToDoor拖到门口。注意OpenCloseDoor()标记为public

接下来有另一个单独的脚本AttachToButton

public void AttachToButton()
{
public AttachToDoor amazaingDoorScript;
etc etc
void Update()
 {
  if (Input.GetButton("Fire1"))
   if (DoPlayerLookAtButton() && isAnimationReadyToPlay)
    amazaingDoorScript.OpenCloseDoor();
 }
}

AttachToButton拖到任何“按钮”上。

查看Inspector,注意插槽“amazaingDoorScript”。

直接将门拖到那个插槽,它会将AttachToDoor连接到“amazaingDoorScript”变量。

但请注意......您可以根据需要为 添加多个按钮。

只要您按下按钮,只需在按钮上添加AttachToButton

你甚至可以拥有另一个脚本,就像一个例子,随机打开和关闭门:

   public AttachToDoor amazaingDoorScript; ...
   Invoke("test",Random.Range(5f,10f)); ...
   private void test()
     {
     // have a ghost mess with the door occasionally
     amazaingDoorScript.OpenCloseDoor();
     Invoke("test",Random.Range(5f,10f));
     }

这是Unity中一个非常基本的概念,一旦你能做到这一点,你就可以做任何事情。享受!

借此机会,了解如何使用UnityEvent。

如果您正在学习Unity,这是了解UnityEvent的好机会。使用UnityEvent确实是日常Unity工程的核心。

这是一个很好的教程:https://stackoverflow.com/a/36249404/294884

在按钮上,执行此操作

public void AttachToButton()
{
public UnityEvent buttonClicked;
 void Update()
 {
  if (Input.GetButton("Fire1"))
   if (DoPlayerLookAtButton() && isAimationReadyToPlay)
    {
    Debug.Log("Button pressed!");
    if (buttonClicked!=null) buttonClicked.Invoke();
    }
 }
}

点击保存。运行游戏,注意在游戏中按下按钮时,您会看到Log“按下按钮!”。

现在, 在编辑器中查看按钮

请注意 实际上在编辑器中 ,您在AttachToButton底部添加了一个惊人的拖放区域

现在停止游戏,试试吧。看看你的一个按钮。查看事件buttonClicked的拖放区域。实际上, 将您的门拖到 ...并选择例程OpenCloseDoor

运行游戏并观察会发生什么。瞧!太棒了吧?