Unity Collider - OnTriggerEnter
Unity Collider - OnTriggerEnter
我是 Unity 的初学者,我开始了一个小项目,我正在使用一个库存框架。
我想在我的游戏中创建一个安全区。我的安全区有一个带触发器的对撞机 "on"。
如果我的玩家进入安全区,我只想发送一条消息。
我的问题是当玩家进入时,我无法获得玩家的名字,它给我“_TriggerHandler”作为值而不是我的玩家。
代码从未进入 "if",我在控制台中得到了第一个调试日志,但没有别的。 (p 为空)(其他 = _TriggerHandler)
无法理解为什么 other = _TriggerHandler。
using Devdog.General;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SafeZone : MonoBehaviour {
protected vp_FPPlayerEventHandler m_Player = null;
protected bool safe;
// Use this for initialization
void Start()
{
m_Player = GameObject.Find("Gringan").GetComponent<vp_FPPlayerEventHandler>();
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// registers this component with the event handler (if any)
/// </summary>
protected virtual void OnEnable()
{
if (m_Player != null)
m_Player.Register(this);
}
/// <summary>
/// unregisters this component from the event handler (if any)
/// </summary>
protected virtual void OnDisable()
{
if (m_Player != null)
m_Player.Unregister(this);
}
void OnTriggerEnter(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
print("Collision detected with trigger object " + other.name + " p= " + p);
if (p != null)
{
print("Collision detected with trigger object PLAYER " + other.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
void OnTriggerStay(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
if (p != null)
{
print("Still colliding with trigger object PLAYER " + other.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
void OnTriggerExit(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
if (p != null)
{
print(gameObject.name + " and trigger object PLAYER " + other.name + " are no longer colliding");
safe = false;
m_Player.PlayerIsSafe.Send(safe);
}
}
}
控制台消息:
-->
检测到与触发器对象的碰撞_TriggerHandler p=
UnityEngine.MonoBehaviour:打印(对象)
SafeZone:OnTriggerEnter(对撞机)(在 Assets/My Assets/Scripts/SafeZone.cs:44)
我想知道是否有人知道什么可以使这种情况发生?
感谢您的帮助。
好的,我像 Nika Kasradze 所说的那样使用 other.transform.parent.GetComponent<Player>();
使它工作,然后我必须在做任何其他事情之前测试播放器是否为 null :)。
感谢您的帮助!
using Devdog.General;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SafeZone : MonoBehaviour {
protected vp_FPPlayerEventHandler m_Player = null;
protected bool safe;
protected Player player;
// Use this for initialization
void Start()
{
if (m_Player == null)
{
m_Player = GameObject.Find("Gringan").GetComponent<vp_FPPlayerEventHandler>();
}
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// registers this component with the event handler (if any)
/// </summary>
protected virtual void OnEnable()
{
if (m_Player != null)
m_Player.Register(this);
}
/// <summary>
/// unregisters this component from the event handler (if any)
/// </summary>
protected virtual void OnDisable()
{
if (m_Player != null)
m_Player.Unregister(this);
}
void OnTriggerEnter(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (player != null)
{
print("Collision detected with trigger object " + player.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
/*void OnTriggerStay(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (p != null)
{
print("Still colliding with trigger object PLAYER " + p.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}*/
void OnTriggerExit(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (player != null)
{
print(gameObject.name + " and trigger object PLAYER " + player.name + " are no longer colliding");
safe = false;
m_Player.PlayerIsSafe.Send(safe);
}
}
}
我是 Unity 的初学者,我开始了一个小项目,我正在使用一个库存框架。
我想在我的游戏中创建一个安全区。我的安全区有一个带触发器的对撞机 "on"。
如果我的玩家进入安全区,我只想发送一条消息。 我的问题是当玩家进入时,我无法获得玩家的名字,它给我“_TriggerHandler”作为值而不是我的玩家。
代码从未进入 "if",我在控制台中得到了第一个调试日志,但没有别的。 (p 为空)(其他 = _TriggerHandler)
无法理解为什么 other = _TriggerHandler。
using Devdog.General;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SafeZone : MonoBehaviour {
protected vp_FPPlayerEventHandler m_Player = null;
protected bool safe;
// Use this for initialization
void Start()
{
m_Player = GameObject.Find("Gringan").GetComponent<vp_FPPlayerEventHandler>();
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// registers this component with the event handler (if any)
/// </summary>
protected virtual void OnEnable()
{
if (m_Player != null)
m_Player.Register(this);
}
/// <summary>
/// unregisters this component from the event handler (if any)
/// </summary>
protected virtual void OnDisable()
{
if (m_Player != null)
m_Player.Unregister(this);
}
void OnTriggerEnter(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
print("Collision detected with trigger object " + other.name + " p= " + p);
if (p != null)
{
print("Collision detected with trigger object PLAYER " + other.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
void OnTriggerStay(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
if (p != null)
{
print("Still colliding with trigger object PLAYER " + other.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
void OnTriggerExit(Collider other)
{
var p = other.GetComponent<Player>(); // Player is in Devdog.General;
if (p != null)
{
print(gameObject.name + " and trigger object PLAYER " + other.name + " are no longer colliding");
safe = false;
m_Player.PlayerIsSafe.Send(safe);
}
}
}
控制台消息:
-->
检测到与触发器对象的碰撞_TriggerHandler p= UnityEngine.MonoBehaviour:打印(对象) SafeZone:OnTriggerEnter(对撞机)(在 Assets/My Assets/Scripts/SafeZone.cs:44)
我想知道是否有人知道什么可以使这种情况发生?
感谢您的帮助。
好的,我像 Nika Kasradze 所说的那样使用 other.transform.parent.GetComponent<Player>();
使它工作,然后我必须在做任何其他事情之前测试播放器是否为 null :)。
感谢您的帮助!
using Devdog.General;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SafeZone : MonoBehaviour {
protected vp_FPPlayerEventHandler m_Player = null;
protected bool safe;
protected Player player;
// Use this for initialization
void Start()
{
if (m_Player == null)
{
m_Player = GameObject.Find("Gringan").GetComponent<vp_FPPlayerEventHandler>();
}
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// registers this component with the event handler (if any)
/// </summary>
protected virtual void OnEnable()
{
if (m_Player != null)
m_Player.Register(this);
}
/// <summary>
/// unregisters this component from the event handler (if any)
/// </summary>
protected virtual void OnDisable()
{
if (m_Player != null)
m_Player.Unregister(this);
}
void OnTriggerEnter(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (player != null)
{
print("Collision detected with trigger object " + player.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
/*void OnTriggerStay(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (p != null)
{
print("Still colliding with trigger object PLAYER " + p.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}*/
void OnTriggerExit(Collider other)
{
if (player == null)
{
player = other.transform.parent.GetComponent<Player>(); // Player is in Devdog.General;
}
if (player != null)
{
print(gameObject.name + " and trigger object PLAYER " + player.name + " are no longer colliding");
safe = false;
m_Player.PlayerIsSafe.Send(safe);
}
}
}