在 Unity 中销毁实例化游戏对象的问题

Posted

技术标签:

【中文标题】在 Unity 中销毁实例化游戏对象的问题【英文标题】:Problems with Destroying Instantiated Gameobject in Unity 【发布时间】:2021-01-26 23:26:18 【问题描述】:

我实例化了Gameobject,现在我想销毁它,但由于一些未知的原因我找不到这样做的方法。当我检查对象的位置是否小于某个数字时,即使它更小它也不会在 if 语句中执行代码:下面是代码,如果有人知道如何销毁这些实例化对象:

[SerializeField]
GameObject Jabuka;
[SerializeField]
GameObject kruska;
[SerializeField]
GameObject brisacDonji;
[SerializeField]
GameObject brisacGornji;

public float MoveSpeed = 3f;

public GameObject spawnerOdozgo;
public GameObject spawnerOdozdo;

GameObject UIjabuka;
GameObject UIkruska;

Rigidbody2D jabukaRig;
Rigidbody2D kruskaRig;

float minx = -2f;
float maxx = 2f;

float vrijemeSpawna = 2f;
float nextSpawn = 0f;

int staSpawnati;
int SpawnGoreILidole;

float positionPos;
public float veclocityI;

private Vector2 screenBounds;

// Start is called before the first frame update
void Start()

    screenBounds = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, Camera.main.transform.position.z));


// Update is called once per frame
void Update()

    veclocityI = Random.Range(2, 6);
    positionPos = Random.Range(minx, maxx);

    SpawnGoreILidole = Random.Range(1, 3);
    switch (SpawnGoreILidole)
    
        case 1:
            spawnOdozgo();
            break;
        case 2:
            spawnOdozdo();
            break;
    


void FixedUpdate()



public void spawnOdozgo()

    if (Time.time > nextSpawn)
    
        staSpawnati = Random.Range(1, 3);
        Debug.Log("sta" + staSpawnati);

        switch (staSpawnati)
        
            case 1:
                UIjabuka = Instantiate(Jabuka, new Vector3(positionPos, spawnerOdozgo.transform.position.y, 1), transform.rotation);
                jabukaRig = UIjabuka.GetComponent<Rigidbody2D>();
                jabukaRig.velocity = new Vector2(0, -veclocityI);
                if (UIjabuka.transform.position.y < brisacDonji.transform.position.y)
                
                    Destroy(UIjabuka);
                    Debug.Log("unisteno je");
                

                break;
            case 2:
                UIkruska = Instantiate(kruska, new Vector3(positionPos, spawnerOdozgo.transform.position.y, 1), transform.rotation);
                kruskaRig = UIkruska.GetComponent<Rigidbody2D>();
                kruskaRig.velocity = new Vector2(0, -veclocityI);
                break;
        

        nextSpawn = Time.time + vrijemeSpawna;
    


public void spawnOdozdo()

    if (Time.time > nextSpawn)
    
        staSpawnati = Random.Range(1, 3);
        Debug.Log("sta" + staSpawnati);

        switch (staSpawnati)
        
            case 1:
                UIjabuka = Instantiate(Jabuka, new Vector3(Random.Range(minx, maxx), spawnerOdozdo.transform.position.y, 1), transform.rotation);
                jabukaRig = UIjabuka.GetComponent<Rigidbody2D>();
                jabukaRig.velocity = new Vector2(0, veclocityI);

                break;
            case 2:
                UIkruska = Instantiate(kruska, new Vector3(Random.Range(minx, maxx), spawnerOdozdo.transform.position.y, 1), transform.rotation);
                kruskaRig = UIkruska.GetComponent<Rigidbody2D>();
                kruskaRig.velocity = new Vector2(0, veclocityI);
                break;
        

        nextSpawn = Time.time + vrijemeSpawna;
    

【问题讨论】:

【参考方案1】:

我没有足够的时间查看您的整个代码。但是,如果您的 switch 语句 case 不是 1,那么您的 if 语句将永远不会执行。您需要确保您的变量:staSpawnati 设置为 1,如果您希望对象被销毁。

【讨论】:

UI jabuke 的位置是 f.e -20,brisacDonji 的位置是-10,即使位置较低,if 语句的代码也不会执行。 如果你的 staSpawnati 不是 1 你的 switch 语句不会执行你的 if 语句【参考方案2】:

从上面发布的代码中,您需要满足 3 个条件才能达到 Destroy 功能。

    SpawnGoreILidole 必须为 1 才能满足第一个 switch case 并进入 spawnOdozgo() staSpawnati 必须为 1 以满足第二个 switch case 并进入 Destroy 所在的代码部分。 UIjabuka.transform.position.y 必须小于 brisacDonji.transform.position.y,然后 Destroy 将在 UIjabuka 游戏对象上执行。

在我看来,这段代码毫无意义,因为您将破坏上面 4 行创建的 GameObject。但这些是执行 Destroy 所需的条件。

【讨论】:

以上是关于在 Unity 中销毁实例化游戏对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity C# 中实例化游戏对象列表

unity对象池

如何在 Unity 游戏引擎平台上的单元测试中实例化 MonoBehaviour 对象

在 Unity 中创建后引用实例化对象

获取其他玩家实例化的游戏对象 Unity Photon

在 Unity 中沿光线投射实例化预定义数量的对象