【问题标题】:unity2D C# - player must press two switches to open doorunity2D C# - 玩家必须按两个开关才能开门
【发布时间】:2015-12-21 04:54:50
【问题描述】:

基本上我有一个门触发事件,如果玩家按下开关,门就会打开。但是,我希望这样做,以便如果相关的门需要两个开关才能很好地打开……那么它只有在按下两个开关时才会打开。这是我的 InteractSwitch 代码

public class InteractSwitch : MonoBehaviour
{

    Animator animator;
    public DoorEventTrigger[] doorTriggers;
    public bool pressed;
    private bool down;
    // Use this for initialization
    void Start ()
    {
        animator = GetComponent <Animator> ();
    }

    // Update is called once per frame
    void Update ()
    {

    }

    void OnCollisionEnter2D (Collision2D target)
    {
        if (target.gameObject.tag == "Player") {
            down = true;
            animator.SetInteger ("SwitchTrig", 1);

            foreach (DoorEventTrigger trigger in doorTriggers)

                if (trigger != null)
                    trigger.Toggle (true);
        }

    }

当触发此事件时,检查玩家,显示开关已被按下,然后发送一个布尔值到一个名为 Toggle 的函数,该函数处理门的操作。

接下来我有我的 DoorEventTrigger 事件,它检查 bool sent = true。如果是,那么门就会打开。这是我卡住的地方。从代码中可以看出,我创建了一个 InteractSwitch 数组,其中存储了我希望玩家在门打开之前按下的开关数量。然后我声明如果长度 > 1,那么这个 if 条件为真,并且会在此处添加一些代码,只有当玩家选择了 InteractSwitch[].length 开关时才会打开门。我的问题是如何检查此 DoorEventTrigger 的所有 InteractSwitch 实例是否等于 true?

这是我的 DoorEventTrigger 代码

public void Toggle (bool val)
{
        if (switchTriggers.Length > 1) {
        Debug.Log ("HAS THIS ACTUALLY DONE ANYTHING");
        door.Open ();
    } 
    else
    {

        if (val)

            door.Open ();
        else

            door.Close ();
    }


}

}

【问题讨论】:

    标签: c# unity3d triggers 2d


    【解决方案1】:

    我想出的解决方案远非我认为最有效的答案,因为每次添加新开关时都需要代码,但这就是我所拥有的

    首先在 InteractSwitch 脚本中,bool down 是公开的,因此它可以被 switchtriggers 访问

    public bool down;
    

    接下来是添加到 Toggle() 方法的代码

    public void Toggle (bool val)
    {
            if (switchTriggers.Length > 1) {
                if((switchTriggers[0].down == true) && (switchTriggers[1].down == true)){
            Debug.Log ("THIS ACTUALLY DONE SOMETHING!");
            door.Open ();
            }
        } 
        else
        {
    
            if (val)
    
                door.Open ();
            else
    
                door.Close ();
        }
    
    
    }
    

    现在来自公共 SwitchInteract[];我知道数组中元素的确切数量,但这可以通过 switchTriggers.length 进行检查;知道数组中有两个元素我的条件 switchTriggers.Length > 1 是正确的,所以接下来我取数组中的两个元素并检查它们是否关闭;如果两者都关闭,则条件继续,Debug.Log() 验证这一点。最后调用 Open() 打开门。

    【讨论】:

      【解决方案2】:

      您可以让开关增加或减少门对象中所需的开关变量。

      1. 给门对象一个 requiredSwitch 变量。
      2. 给每个开关一个门变量,并将其设置为它控制的门。
      3. 当一个开关被激活时,让它减少其门的 requiredSwitch 变量。
      4. 当门的 requiredSwitch 变量为 0 时,门打开。
      5. 您还可以让开关在停用时增加变量。

      此解决方案允许您通过设置开关的门变量并增加门的初始 requiredSwitch 变量来添加开关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 2022-01-22
        • 2017-08-10
        相关资源
        最近更新 更多