4

当我不再需要预制件(是一个弹出窗口)时,我正在使用它来卸载纹理:

    UISprite[] widgets = gameObject.GetComponentsInChildren<UISprite>(true);

    for (int i = 0, imax = widgets.Length; i < imax; i++)
    {
        UISprite w = widgets[i];

        Debug.Log ("Removing: " + w.gameObject.name);
        if (w.mainTexture)
        {
            Debug.Log ("Removing: " + w.mainTexture.name);
            Resources.UnloadAsset(w.mainTexture);
        }
    }

正如我所看到的,这是有效的,因为在卸载后,Texture2Ds 不再显示在分析器中。但问题是,当我再次实例化弹出窗口时,精灵显示为白色框。因此,它们不会像文档中所说的那样在需要时重新加载:如果场景中的游戏对象对资产有任何引用并且正在使用它,那么 Unity 将在访问资产后立即从磁盘重新加载资产。

我做错了什么?

4

1 回答 1

1

看起来您正试图将其复杂化一点,并且您正在完全从内存中卸载资源。您应该简单地销毁要从场景中删除的父游戏对象。

Destroy(GameObject);

http://docs.unity3d.com/ScriptReference/Object.Destroy.html

Unity 垃圾收集器将自动删除对场景的所有引用并卸载未使用的资源。

于 2015-02-09T13:13:19.273 回答