Unity3d销毁实例化之前存在的任何对象

本文关键字:存在 任何 对象 实例化 Unity3d | 更新日期: 2023-09-27 18:18:26

这可能看起来很幼稚,但我就是不明白。这个程序有不同的按钮,可以显示或隐藏带有相关信息的画布,在本例中是Oil Change。

当按钮被按下时,它打开换油画布,从数据库中获取信息,并从实例化的预制件中显示该信息。这很好。当您单击相同的按钮或另一个按钮并返回到相同的画布时,问题就出现了。信息是两倍,三倍,四倍,你懂的。每次你回到它,它都会加倍。

显然,游戏对象必须在实例化之前被销毁,但是:

  1. 我不知道该检查什么;它是用于实例化的临时变量还是预制件?我试过在脚本的顶部定义它,任何其他时间,我得到一个未分配使用的错误。

  2. 我不确定调用函数的最佳时间。我猜只要你按下按钮。

    public void ShowAllOilChanges()
    {
        for(int i = 0; i< OilChangeList.Count; i++)
            {
                ocObj = Instantiate(OilChangePrefab);
                OilChange tmpOilChange = OilChangeList[i];
                ocObj.GetComponent<OilChangeScript>().DisplayOilChanges("Date of Service: " +tmpOilChange.ServiceDate, "Place of Service: " +tmpOilChange.Location, "Mileage: " +tmpOilChange.Mileage, "Labor: " +tmpOilChange.Labor, "Oil Brand: " +tmpOilChange.OilBrand, "Oil Price: " +tmpOilChange.OilPrice, "Filter Brand: " +tmpOilChange.FilterBrand, "Filter Price: " +tmpOilChange.FilterPrice, "Purchase Place: " +tmpOilChange.OilFilterPurchaseLocation);
                ocObj.transform.SetParent(OilDisplayparent); 
            }
    }
    public void DestroyOilChange()
    {
        Debug.Log("Before" +ocObj);
        Destroy(ocObj);
        Debug.Log("After" +ocObj);
    }
    public void OpenOilWindow()
    {
            if(windowOpen==false)
            {
                windowOpen=true;
                OilCanvas.enabled=true;
                BatteryCanvas.enabled=false;
                BrakeCanvas.enabled=false;
                TireCanvas.enabled=false;
                PlugCanvas.enabled=false;
                MufflerCanvas.enabled=false;
                CustomCanvas.enabled=false;
                DestroyOilChange();
            }
            else if(windowOpen==true)
            {
                windowOpen=false;
                OilCanvas.enabled=false;
            }
    }
    

如果有人能给我介绍一下,我会很感激的。

Unity3d销毁实例化之前存在的任何对象

我是反过来看的。我做的第一件事是为需要删除的各种类型的对象创建标记。然后我将它们添加到各自的预制件中。这个函数在打开画布(窗口)和关闭画布(窗口)时调用。

public void DestroyObjects(string tag)
{
    GameObject[] Obj = GameObject.FindGameObjectsWithTag(tag);
    if(Obj==null)
        return;
    else
    {
        Debug.Log(Obj.Length);
        for(int i=0; i< Obj.Length; i++)
        {
            Destroy(Obj[i]);
        }
        Debug.Log(tag + "Objects Destroyed!");
    }
}

希望这能帮助到像我这样的人。