C# 当游戏对象被销毁时,如何激活触发器?
当该区域的敌人被杀死时,我想激活/启用触发碰撞器。敌人不是按特定顺序出现的,因此不能向单个敌人添加脚本。 我创建了一个空的游戏对象并附加了下面的(错误的)脚本。我想做C# 当游戏对象被销毁时,如何激活触发器?,c#,unity3d,C#,Unity3d,当该区域的敌人被杀死时,我想激活/启用触发碰撞器。敌人不是按特定顺序出现的,因此不能向单个敌人添加脚本。 我创建了一个空的游戏对象并附加了下面的(错误的)脚本。我想做如果(公共游戏对象被销毁)激活触发器 你知道这个的正确答案吗 public class ActivateDialogueTrigger : MonoBehaviour { public GameObject DialogueTrigger; public GameObject Enemy01; publi
如果(公共游戏对象被销毁)激活触发器
你知道这个的正确答案吗
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);
}
}
}
我看到了两种选择:一种是“挑剔”但干净的选择,另一种是快速“肮脏”但效率较低的选择
使用事件
您可以将一个脚本附加到每个对象,该脚本负责在对象被销毁时调度事件
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 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() ;
}
}
公共类OnDestroyDispatcher:MonoBehavior
{
公共事件系统。对目标的行动被摧毁;
私有void OnDestroy()
{
如果(onObjectDistromed!=null)onObjectDistromed(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() ;
}
}
公共类ActivateDialogue触发器:单一行为
{
//拖放检查器中的对象(&D)
公共OnDestroyDispatcher[]OnDestroyDispatchers;
//一旦所有对象都被销毁,您将能够添加一个函数
公共UnityEngine.Events.UnityEvent OnLobjectsStroted;
无效开始()
{
对于(int i=0;i
通过汇集每个帧 销毁对象后,带有null的相等性检查将返回true。该对象实际上不是空的,但“==”运算符重载,以便您可以检查该对象是否已被销毁
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 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() ;
}
}
公共类ActivateDialogue触发器:单一行为
{
//拖放检查器中的对象(&D)
公共GammeObject[]您的游戏对象;
//一旦所有对象都被销毁,您将能够添加一个函数
公共UnityEngine.Events.UnityEvent OnLobjectsStroted;
无效更新()
{
CheckAllObjectsRedestroyed();
}
私有void checkAllObjectsRedestroyed()
{
对于(int i=0;i
您做了哪些研究?你试过使用OnDestroy
方法吗?如果你知道将要来的敌人的数量,你可以添加一个计数器,在敌人死亡时减少它,并检查If(如Eddge所说的剩余敌人,所有操作需要的是OnDestroy
,如果她在谷歌上搜索“如何检测物体何时被摧毁”,就可以找到它或者只是一个非常简单的研究抱歉,这是一个非常新的问题,谷歌搜索了如何在对象被破坏时触发事件。我的错,但我从这篇文章中学到了很多。