예제 #1
0
    private void OnGUI()
    {
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("AddTestMono" /*, GUILayout.Width(80)*/))
        {
            var go = new GameObject("TestMono");
            go.AddComponent <TestMonoScript>();
            go.AddComponent <TestMonoScript2>();
            Debug.Log("After AddTestMono");
            _last_test_mono_obj = go;
        }
        if (GUILayout.Button("InstanceMono" /*, GUILayout.Width(80)*/))
        {
            if (_last_test_mono_obj != null)
            {
                var go = GameObject.Instantiate <GameObject>(_last_test_mono_obj);
                Debug.Log("After InstanceMono");
                _last_test_mono_obj = go;
            }
        }
        if (GUILayout.Button("destry object"))
        {
            //Object.DestroyImmediate(_ab_obj);
            var img = _GetTestImage();
            Object.DestroyImmediate(img);
        }
        if (GUILayout.Button("loadfromab2 1"))
        {
            if (_ab2)
            {
                var img = _GetTestImage();
                var sp  = _ab2.LoadAsset <Sprite>("Assets/ABMgr/Res/Img/bg2.jpg");
                print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
                if (img)
                {
                    AddRef(img.sprite);
                    img.sprite = sp;
                }
            }
            else
            {
                print("_ab2 is null");
            }
        }
        if (GUILayout.Button("loadfromab2 3"))
        {
            if (_ab2)
            {
                var img = _GetTestImage();
                var sp  = _ab2.LoadAsset <Sprite>("Assets/ABMgr/Res/Img/bg3.jpg");
                print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
                if (img)
                {
                    AddRef(img.sprite);
                    img.sprite = sp;
                }
            }
            else
            {
                print("_ab2 is null");
            }
        }
        if (GUILayout.Button("loadfromab2 3 1"))
        {
            if (_ab2)
            {
                var img = _GetTestImage();
                var sp  = _ab2.LoadAsset <Sprite>("Assets/ABMgr/Res/Img/bg3.jpg");
                print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
                if (img)
                {
                    AddRef(img.sprite);
                    img.sprite = null;//
                    img.sprite = sp;
                }
            }
            else
            {
                print("_ab2 is null");
            }
        }
        if (GUILayout.Button("loadfromab2 prefab"))
        {
            if (_ab2)
            {
                var img = _GetTestImage();
                if (img)
                {
                    var go     = _ab2.LoadAsset <GameObject>("Assets/ABMgr/Res/Prefab/ImgContain34.prefab");
                    var ab_img = go.transform.Find("Image3").GetComponent <Image>();
                    var sp     = ab_img.sprite;
                    print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
                    AddRef(img.sprite);
                    img.sprite = null;//
                    img.sprite = sp;
                    //ab_img.sprite = null;// 修改就不对了
                }
            }
            else
            {
                print("_ab2 is null");
            }
        }
        GUILayout.EndHorizontal();
        GUILayout.Space(10);
        GUILayout.BeginHorizontal();

        /**
         * 卸载逻辑的一些尝试总结:
         * 1. Resources.UnloadAsset 卸载AssetBundle加载的资源
         *    1. 在profiler的内存统计里是正确的。
         *    2. AB重新Load资源后,内存显示也确实有,然而UGUI不能及时刷新,图片还是黑的。
         *      - 先执行下`sprite = null` 就可以解决问题,UGUI赋值时需要这样才能感知到自己的内部资源发生了变化。
         *    3. https://issuetracker.unity3d.com/issues/serialized-asset-is-null-when-loaded-from-bundle-after-using-resources-dot-unloadasset
         *      - 这个官方回复说有问题,但是按那种说法,第二次加载应该内存里显示直接没有猜对。不懂了。
         *      - 版本 2018.2.3,大概已经没用了。
         *    4. 总结(Image.sprite.texture 为例,版本 2018.4.28)
         * 2. Resources.UnloadUnusedAssets 可以卸载AB里加载后没有引用的资源。
         * 3. 一些总结
         *    1. Resources.UnloadAsset 资源后,Sprite和Texture的bool判断状态还是true.
         *    2. Resources.UnloadAsset(img.sprite) 不会立即生效。(图片不变黑)
         *       - 后续执行 Resources.UnloadUnusedAssets() 后,卸载生效
         *       - Resources.UnloadAsset(img.sprite.texture) 会立即生效
         *    3. Resources.UnloadAsset 可以卸载AB里加载的资源,这个通过profiler可以看内存引用变化
         *       - demo 不生效的问题是spite 没有先`= null`,AB重新加载时,InstanceID没有变化,UGUI感知不到修改,UI没刷新。
         */
        if (GUILayout.Button("unload asset 1"))
        {
            // 有些坑,不能用于AB,
            UnityEngine.UI.Image img = _GetTestImage();
            var sp = img.sprite;
            print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
            // 对于UGUI来说,不会立即生效,随后,调用UnloadUnusedAssets,图片就没了,显示变黑。
            Resources.UnloadAsset(img.sprite);
            print($"unload asset img.sprite={img.sprite == true} img.sprite.texture={img.sprite.texture == true} ");
        }
        if (GUILayout.Button("unload asset 2"))
        {
            // 有些坑,不能用于AB,
            UnityEngine.UI.Image img = _GetTestImage();
            var sp = img.sprite;
            print($"sp instanceid {sp.GetInstanceID()} {sp.texture.GetInstanceID()}");
            print($"before unload asset img.sprite={img.sprite == true} img.sprite.texture={img.sprite.texture == true}");
            //Resources.UnloadAsset(img.sprite);
            Resources.UnloadAsset(img.sprite.texture);// 立即生效。
            // 下面这个日志,会导致内存里还有tex,但是图片已经黑了
            // print($"after unload asset img.sprite={img.sprite==true} img.sprite.texture={img.sprite.texture == true} ");
        }
        if (GUILayout.Button("UnloadUnusedAssets"))
        {
            Resources.UnloadUnusedAssets();
        }
        if (GUILayout.Button("s_obj = null"))
        {
            MyClass.s_obj = null;
        }
        GUILayout.EndHorizontal();
        GUILayout.Space(10);
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("load all ab"))
        {
            _ab  = ABMgr.singleton.LoadAB("imgcontain12.prefab");
            _ab2 = ABMgr.singleton.LoadAB("all_2.ab");
            _ab3 = ABMgr.singleton.LoadAB("all_3.ab");
            ABMgr.singleton.LoadAB("sub/prefab.ab");
            ABMgr.singleton.LoadAB("sub/img.ab");
        }
        if (GUILayout.Button("unload all ab"))
        {
            ABMgr.singleton.UnloadAllAB();
            Debug.Log($"_ab == null is {_ab == null}");
        }
        if (GUILayout.Button("bundle print name"))
        {
            ABMgr.singleton.LogSomeInfo();
        }
        GUILayout.EndHorizontal();
        GUILayout.Space(10);
        GUILayout.BeginHorizontal();

        if (GUILayout.Button("editor loadfromfile"))
        {
#if UNITY_EDITOR
            if (_editor_load_go == null)
            {
                _editor_load_go = UnityEditor.AssetDatabase.LoadAssetAtPath <GameObject>("Assets/ABMgr/Res/Prefab/ImgContain12.prefab");
            }
            GameObject.Instantiate(_editor_load_go, GameObject.Find("Canvas").transform);
#endif
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Editor Image Material"))
        {
            Image img = _GetTestImage();
            img.material.SetVector("_Color", new Vector4(1, 0.5f, 0.5f, 1));
            //img.material.color = new Vector4(1, 0.5f, 0.5f, 1);
        }
        if (GUILayout.Button("Editor Image Material clone"))
        {
            Image img = _GetTestImage();
            img.material = GameObject.Instantiate <Material>(img.material);
            img.material.SetVector("_Color", new Vector4(1, 0.5f, 0.5f, 1));
            //img.material.color = new Vector4(1, 0.5f, 0.5f, 1);
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("TestStatic"))
        {
            XTest.TestStatic.Hello();
        }
        if (GUILayout.Button("TestStatic2"))
        {
            XTest.TestStatic2.Hello();
        }
        GUILayout.EndHorizontal();
        ShowResolution();
    }
예제 #2
0
 // Start is called before the first frame update
 void Start()
 {
     frameCount = frames.Length;
     imageComp  = GetComponent <Image>();
 }