Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测触发器中的对象?_C#_Unity3d - Fatal编程技术网

C# 如何检测触发器中的对象?

C# 如何检测触发器中的对象?,c#,unity3d,C#,Unity3d,我在场景中放置了一个带有触发器的对象,我希望控制台在我单击按钮时向我发送一条消息,检测播放器是否在触发器中。当我玩的时候,它只会在玩家扣动扳机的时候给我发信息 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class MapDetect : MonoBehaviour { void OnTriggerStay(Collider other)

我在场景中放置了一个带有触发器的对象,我希望控制台在我单击按钮时向我发送一条消息,检测播放器是否在触发器中。当我玩的时候,它只会在玩家扣动扳机的时候给我发信息

代码:

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

public class MapDetect : MonoBehaviour {


     void OnTriggerStay(Collider other)
     {
         if (other.gameObject.tag == "Player") {
             Debug.Log ("Map ON");

         } 
         else {
             if (other.gameObject.tag == "Player") {
                  Debug.Log ("Map OFF");
             }
         }
     }
}

使用
OnTriggerEnter
OnTriggerExit
而不是
OnTriggerStay
保持当前状态:

public class MapDetect : MonoBehaviour {

    private bool isTriggered;

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
            isTriggered = true;
    }

    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
            isTriggered = false;
    }

    void Update(){
        if(Input.GetKey(KeyCode.Space)){
            Debug.Log(isTriggered);
        }
    }
}

你的逻辑完全错了。您只检查触发器是否停留在您的边界内,但仍试图记录“映射关闭”消息,这是永远不会发生的

使用
OnTriggerCenter
OnTriggerExit
代替
OnTriggerStar
方法。然后仅在需要时(或在调试模式下)打印消息:

尝试:

这将在您进入时打开它,在您退出时关闭它(尽管它现在所做的只是打印结果)


希望有帮助。

您的情况相同。如果第二个为true,那么第一个也将为true,这意味着由于If/else语句的性质,第二个将永远不会运行。虽然使用了
gameObject.tag==
,但isntead还是值得注意的:因为你只对玩家感兴趣,所以你可以将触发器放在一个只与玩家发生碰撞的层上(假设玩家也在这样的层上)。这样,你就不需要进行标签检查,物理计算也变得更便宜。非常感谢@Ludovic。但是,如果按钮是画布的UI按钮而不是键空间,我该怎么办?我想在画布上显示一条带有“地图打开”/“地图关闭”的消息。@Angelsm这是另一个问题,在评论中回答太长了。问另一个问题,把链接贴在这里,这样我就可以试着回答:)好的,我要问另一个问题。
void OnTriggerEnter(Collider other)
{
    if ( other.gameObject.CompareTag("Player") )
    {
        m_IsPlayerOnTheMap = true;
    } 
}

void OnTriggerExit(Collider other)
{
    if( other.gameObject.CompareTag("Player") )
    {
        m_IsPlayerOnTheMap = false;
    }
}

void Update()
{
#if DEBUG
    if ( m_IsPlayerOnTheMap )
    {
        Debug.Log("Map ON");
    }
    else
    {
        Debug.Log("Map OFF");
    }
#endif
}

private bool m_IsPlayerOnTheMap = false;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapDetect : MonoBehaviour {


 void OnTriggerEnter(Collider other)
 {
     if (other.gameObject.CompareTag("Player"))
     {
         Debug.Log ("Map ON");
     } 
 }

 void OnTriggerExit(Collider other)
 {
     if (other.gameObject.CompareTag("Player"))
     {
         Debug.Log ("Map OFF");
     }
 }
}