【问题标题】:Destroy a deactivated object销毁已停用的对象
【发布时间】:2015-08-12 18:56:05
【问题描述】:

我只想销毁 Quad prefab (hp bar) 的已停用实例,可以使用以下命令销毁已激活的实例:

private GameObject correspondingHpBar; 
private string correspondingHpBarName;

void Start() 
{ 
    correspondingHpBarName = "hpBar1" 
}

void Update()
{
    correspondingHpBar = GameObject.Find (correspondingHpBarName); 
    if (shipHp <= 0)
    {
        Destroy (correspondingHpBar); 
        Destroy (gameObject); 
    }
}

这不适用于停用的对象,我用谷歌搜索但未能找到答案。

【问题讨论】:

  • 如果您使用 Unity 游戏引擎,请添加标签 unity3d(即使是 2d 游戏),如果您不使用 Unity,请找到您正在使用的任何引擎的标签。此外,“它不起作用”的信息还不够,edit your question 并解释它是如何不起作用的。你有例外吗?它没有按照预期的方式运行吗?

标签: c# unity3d destroy


【解决方案1】:

停用的对象没有调用它们的StartUpdate 方法(也没有调用任何协程)。事实上,当一个对象被停用时,它就像它自己的时间被冻结了一样。

您可以做的是创建一个执行销毁的方法并找到从另一个脚本调用它的方法(例如,一种保持对场景中所有 HP 条的引用的控制器)。

以下是一些伪代码(没有检查它是否编译,但无论如何你应该适应它):

// in script for HP bar
public Boolean TryDestroy()
{
    if (shipHp <= 0)
    {
        Destroy (correspondingHpBar); 
        Destroy (gameObject); 
        return true;
    }
    return false;
}

// in another script
private List<HPBar> _allHPBars;
void Awake()
{
    _allHPBars = new List<HPBar>(FindObjectsOfType(typeof(HPBar)));
}

void Update()
{
    var destroyedHPBars = new List<HPBar>();
    foreach (var hpBar in _allHPBars)
    {
        if (hpBar.TryDestroy())
        {
            destroyedHPBars .Add(hpBar);
        }
    }
    foreach (var destroyedBar in destroyedHPBars)
    {
        _allHPBars.Remove(destroyedBar);
    }
}

【讨论】:

  • 谢谢,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2017-01-11
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多