【问题标题】:How to activate trigger when gameObjects are destroyed?游戏对象被销毁时如何激活触发器?
【发布时间】:2018-04-18 15:21:03
【问题描述】:

我想在该区域的敌人被杀死时激活/启用 TriggerCollider。敌人不是按特定顺序出现的,因此无法将脚本添加到单个敌人。 我创建了一个空的游戏对象并附在下面(错误的)脚本。我想做if( the public game objects are destroyed) activate trigger

你知道正确的吗?

public class ActivateDialogueTrigger : MonoBehaviour {

    public GameObject DialogueTrigger;

    public GameObject Enemy01;
    public GameObject Enemy02;
    public GameObject Enemy03;
    public GameObject Enemy04;
    public GameObject Enemy05;
    public GameObject Enemy06;

    void Start () {

        DialogueTrigger.SetActive(false);       
    }


    void Update () {
        if(gameobjects.destroyed){

            DialogueTrigger.SetActive(true);
        }
    }
}

【问题讨论】:

  • 你做了哪些研究?您是否尝试过使用OnDestroy 方法?
  • 如果你知道将要来的敌人的数量,你可以添加一个计数器,当一个敌人死亡时减少它并检查if(remainingEnemies <= 0)

标签: c# unity3d


【解决方案1】:

我看到了两种选择:一种是“挑剔”但干净,另一种是快速、“肮脏”且效率较低。

使用事件

您可以为每个对象附加一个脚本,该脚本负责在对象被销毁时调度事件。

public class OnDestroyDispatcher : MonoBehaviour
{
    public event System.Action<GameObject> OnObjectDestroyed ;
    private void OnDestroy()
    {
        if( OnObjectDestroyed != null ) OnObjectDestroyed( gameObject ) ;
    }
}

然后,在您的脚本中:

public class ActivateDialogueTrigger : MonoBehaviour
{
    // Drag & drop the objects in the inspector
    public OnDestroyDispatcher[] OnDestroyDispatchers ;

    // You will be able to add a function once all the objects are destroyed
    public UnityEngine.Events.UnityEvent OnAllObjectsDestroyed;
    
    void Start ()
    {
    
        for( int i = 0 ; i < OnDestroyDispatchers.Length ; ++i )
            OnDestroyDispatchers[i].OnObjectDestroyed += OnObjectDestroyed ;
    }
    
    
    private void OnObjectDestroyed (GameObject destroyedObject)
    {

        CheckAllObjectsAreDestroyed();       
    }
    
    
    private void CheckAllObjectsAreDestroyed ()
    {    
        for( int i = 0 ; i < OnDestroyDispatchers.Length ; ++i )
        {
            if( OnDestroyDispatchers[i] != null || OnDestroyDispatchers[i].gameObject != null )
                return ;
        }

        if( OnAllObjectsDestroyed != null )
            OnAllObjectsDestroyed.Invoke() ;       
    }

}

通过池化每一帧

对象被销毁后,对 null 的相等性检查将返回 true。该对象实际上并不是真正的 null,而是“==”运算符被重载,以便您可以检查该对象是否已被销毁。

public class ActivateDialogueTrigger : MonoBehaviour
{
    // Drag & drop the objects in the inspector
    public GammeObject[] YourGameObjects ;

    // You will be able to add a function once all the objects are destroyed
    public UnityEngine.Events.UnityEvent OnAllObjectsDestroyed;
    
    void Update ()
    {
        CheckAllObjectsAreDestroyed();
    }
    
    private void CheckAllObjectsAreDestroyed ()
    {    
        for( int i = 0 ; i < YourGameObjects.Length ; ++i )
        {
            if( YourGameObjects[i] != null )
                return ;
        }

        if( OnAllObjectsDestroyed != null )
            OnAllObjectsDestroyed.Invoke() ;       
    }

}

【讨论】:

  • 就像 Eddge 说的,所有 OP 都需要OnDestroy,如果她在 Google 上搜索“如何检测对象何时被破坏”或仅通过非常简单的研究就可以找到
  • 抱歉,对此非常陌生,并且在 Google 上搜索了如何在对象被销毁时触发事件。我的错,但我从这篇文章中学到了很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
相关资源
最近更新 更多