我与Unity的begginer,我开始了一个小项目,我使用架构for inventtrory。Unity Collider - OnTriggerEnter
我试图在我的游戏中建立一个安全区域。我的安全区有一个触发器“on”的对撞机。
如果我的玩家进入安全区域,我只想发送消息。 我的问题是当玩家进入时,我不能得到玩家的名字,它给我“_TriggerHandler”作为价值而不是我的玩家。
代码永远不会进入“如果”,我得到控制台中的第一个调试日志,但没有别的。 (p为空)(other = _TriggerHandler)
不能理解为什么其他= _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:打印(对象) 安全区域:OnTriggerEnter(撞机)(在资产/我的资产/脚本/ SafeZone.cs:44)
我想知道是否有人知道会发生什么情况?
感谢您的帮助。
这意味着触发该函数的碰撞器与玩家不在同一个变换中。例如。如果你的角色在他的腿上有碰撞者并触发了这个,那么'other'对象将是腿,而不是角色本身。您必须在父变换的某处找到播放器组件。附:如果播放器组件和Rigidbody连接到相同的变换,那么'other.attachedrigidbody'可能有点帮助 –
感谢您的信息。我会看看这个。我使用UFPS,我的对手很分散。我现在尝试使用other.attachedrigidbody,但结果相同:(使用触发器对象_TriggerHandler检测到冲突p =因此P为null。任何想法我该怎么做? –
找到层次结构中相对于_TriggerHandler的播放器的位置如果它连接到_TriggerHandler的父类然后在你的代码中你必须像这样得到它:'other.transform.parent.GetComponent();'或者使用'.parent.parent'在层次结构中爬升2或者使用'GetComponentInChildren ()'如果它附加到'_TriggerHandler'下的某个地方的子变换 –