2017-03-06 46 views
3

我已經在場景中放置了一個帶有觸發器的對象,並且我希望控制檯向我發送一條消息,以檢測當我單擊按鈕時播放器是處於觸發還是不在觸發狀態。當我玩的時候,只有當玩家進入觸發器時它纔會給我發送消息。如何檢測觸發器中的對象?

代碼:

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

您的條件完全相同。如果第二個是真的,那麼第一個也是真的,這意味着由於if/else語句的性質,第二個將永遠不會運行。 –

回答

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

這應該這樣做。儘管使用['gameObject.CompareTag'](https://docs.unity3d.com/ScriptReference/GameObject.CompareTag.html)不是'gameObject.tag =='。 – Programmer

+1

Thank @Programmer我編輯了我的答案 –

+1

另外值得注意的是:因爲你只對玩家感興趣,所以你可以將觸發器放在一個只與玩家發生碰撞的層上(假設玩家也在這個層上)。這樣,你不需要標籤檢查,物理計算變得更便宜。 –

0

你的邏輯是完全錯誤的。您只會檢查觸發器是否處於您的界限,但仍嘗試記錄「地圖關閉」郵件永遠不會發生。

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

當您退出這將打開它,當你進入和關閉(althout所有它現在確實打印結果)。

希望它有幫助。