【问题标题】:Unity Collider - OnTriggerEnterUnity Collider - OnTriggerEnter
【发布时间】:2016-12-26 12:28:38
【问题描述】:

我是 Unity 的初学者,我开始了一个小项目,我正在使用一个库存框架。

我正在尝试在我的游戏中创建一个安全区。我的安全区有一个触发器“开启”的对撞机。

如果我的玩家进入安全区,我只想发送一条消息。 我的问题是当玩家进入时,我无法获得玩家的名字,它给了我“_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(Collider)(在 Assets/My Assets/Scripts/SafeZone.cs:44)

我想知道是否有人知道是什么导致这种情况发生?

感谢您的帮助。

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    好的,我像 Nika Kasradze 所说的那样使用 other.transform.parent.GetComponent&lt;Player&gt;(); 使它工作,然后我必须在执行其他任何操作之前测试播放器是否为 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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多