首页 > 解决方案 > 如何防止销毁 Unity 中对象的所有实例?

问题描述

我有一个名为 Beam 的预制对象,它包含几个东西,但一个是一个对象,当它的一个实例被碰撞并触发时,它应该自行销毁。

目前,我有一个脚本,它在一个名为 Beams 的变量上生成所有实例。此处显示:

在此处输入图像描述

当它运行时,它会在其中创建克隆。在这里看到:

在此处输入图像描述

您还将在最后一张图片中看到包含 Cookie 的 Beam 预制件。那个cookie是我有一个脚本的地方,如果我击中它,就销毁。该代码如下所示:

...

public class Collectibles : MonoBehaviour
{
    GameManager game;

    // Start is called before the first frame update
    void Start()
    {
        game = FindObjectOfType<GameManager> ();
    }

    ...

    void OnTriggerEnter2D(Collider2D other) {
        if(other.tag == "Player"){
            string coinType = "Cookie";
            game.AddCollectible(coinType);
            Destroy(gameObject);
        }


    }
}

目前,当我遇到一个 cookie 时,它​​会运行 Destroy(gameObject) 并销毁 cookie 的所有实例(每个克隆一个)。

此代码存在于 Cookie 上,而不是 Beams 上。那是对的吗?我应该在其他地方有代码吗?我也尝试过 Destroy(this) 但这并没有做我认为它会做的事情(只是实例)。

是否有可能从我调用 Destroy 的地方,脚本无法访问实例,或者我错过了什么?先感谢您!

标签: c#unity3dphysicsinstance-variables

解决方案


如果我理解你的问题,你希望当“玩家”与“光束”的实例发生碰撞时,只破坏 Cookie 的实例(或包含脚本的游戏对象),在这种情况下,它会使用标签:

public GameObject[] arrayofcookie;

public int destroyedinstances=1; 
//this int will tell how many instances you want to be destroyed (from the last instantiated to the first)

//for this example the last instance will be deleted


public void destroyCookie()
{
    arrayofcookie= GameObject.FindGameObjectsWithTag("Cookie");
    for (int i = 0; i < destroyedinstances; i++)
    {
        Destroy(arrayofcookie[i].gameObject);
    }
}

您可以在 cookie 脚本、碰撞器中调用此方法,或者如果您更喜欢在 N 秒后使用调用方法。

我认为我没有很好地理解您的问题,但是在这些问题中我更喜欢使用标签,这也取决于您的游戏性质


推荐阅读