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