2016-12-26 69 views
0

我与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)

我想知道是否有人知道会发生什么情况?

感谢您的帮助。

+1

这意味着触发该函数的碰撞器与玩家不在同一个变换中。例如。如果你的角色在他的腿上有碰撞者并触发了这个,那么'other'对象将是腿,而不是角色本身。您必须在父变换的某处找到播放器组件。附:如果播放器组件和Rigidbody连接到相同的变换,那么'other.attachedrigidbody'可能有点帮助 –

+0

感谢您的信息。我会看看这个。我使用UFPS,我的对手很分散。我现在尝试使用other.attachedrigidbody,但结果相同:(使用触发器对象_TriggerHandler检测到冲突p =因此P为null。任何想法我该怎么做? –

+1

找到层次结构中相对于_TriggerHandler的播放器的位置如果它连接到_TriggerHandler的父类然后在你的代码中你必须像这样得到它:'other.transform.parent.GetComponent ();'或者使用'.parent.parent'在层次结构中爬升2或者使用'GetComponentInChildren ()'如果它附加到'_TriggerHandler'下的某个地方的子变换 –

回答

0

好吧,我做到了:),不得不使用other.transform.parent.GetComponent();就像说Nika Kasradze,然后我必须在做任何事情之前测试玩家是否为空:)

感谢您的帮助!

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); 
     } 
    } 
} 
相关问题