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

时间:2017-03-06 14:02:25

标签: c# unity3d

我已经在场景中放置了一个带触发器的对象,我希望控制台向我发送一条消息,当我点击一个按钮时,该消息会检测玩家是否在触发器中。当我玩时,它只会在玩家进入触发器时向我发送消息。

代码:

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");
             }
         }
     }
}

3 个答案:

答案 0 :(得分:4)

使用OnTriggerEnterOnTriggerExit代替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);
        }
    }
}

答案 1 :(得分:0)

你的逻辑是完全错误的。您只是检查 TRIGGER是否在您的绑定中,但仍尝试记录“Map OFF”消息,这将永远不会发生。

而不是OnTriggerStar方法使用OnTriggerEnterOnTriggerExit。然后仅在需要时(或在调试模式下)打印消息:

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;

答案 2 :(得分:0)

尝试:

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");
     }
 }
}

当你退出时进入和关闭时会打开它(现在它只是打印结果)。

希望它有所帮助。