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