示例#1
0
    public void OnUpdate(List <SceneNode> visibleSceneNodes, string parentName, Transform parent, Vector3 center)
    {
        // load
        foreach (SceneNode sn in visibleSceneNodes)
        {
            if (!loadedSceneNodes.ContainsKey(sn))
            {
                SceneNodeAssets sna = LoadSceneNode(sn, parentName, parent);

                loadedSceneNodes[sn] = sna;
            }
        }

        // unload
        needRemoveSceneNodes.Clear();
        foreach (KeyValuePair <SceneNode, SceneNodeAssets> kv in loadedSceneNodes)
        {
            Vector2 v = new Vector2(center.x - kv.Key.position.x, center.z - kv.Key.position.z);
            if (v.sqrMagnitude > unloadDistance * unloadDistance)
            {
                needRemoveSceneNodes.Add(kv.Key, kv.Value);
            }
        }

        foreach (KeyValuePair <SceneNode, SceneNodeAssets> kv in needRemoveSceneNodes)
        {
            loadedSceneNodes.Remove(kv.Key);

            UnloadSceneNode(kv.Value);
        }
    }
示例#2
0
    void UnloadSceneNode(SceneNodeAssets sna)
    {
        if (!sna.loaded)
        {
            return;
        }

        Destroy(sna.gameObject);

        DecreaseAssetsRefs(sna);

        sna.loaded = false;
    }
示例#3
0
    void DecreaseAssetsRefs(SceneNodeAssets sna)
    {
        //check unload mesh
        foreach (Mesh mesh in sna.meshs)
        {
            if (meshRefs.ContainsKey(mesh))
            {
                meshRefs[mesh]--;

                if (meshRefs[mesh] <= 0)// need unload
                {
                    meshRefs.Remove(mesh);

                    Resources.UnloadAsset(mesh);
                }
            }
        }

        foreach (Material mat in sna.materials)
        {
            if (materialRefs.ContainsKey(mat))
            {
                materialRefs[mat]--;

                if (materialRefs[mat] <= 0)
                {
                    materialRefs.Remove(mat);

                    Resources.UnloadAsset(mat);
                }
            }
        }

        // check unload texture
        foreach (Texture tex in sna.textures)
        {
            if (textureRefs.ContainsKey(tex))
            {
                textureRefs[tex]--;

                if (textureRefs[tex] <= 0)// need unload
                {
                    textureRefs.Remove(tex);

                    Resources.UnloadAsset(tex);
                }
            }
        }
    }
示例#4
0
    SceneNodeAssets LoadSceneNode(SceneNode sn, string parentName, Transform parent)
    {
        UnityEngine.Object obj = Resources.Load("QuadTree/" + parentName + "/" + sn.prefabName);
        if (obj == null)
        {
            Debug.LogError(sn.prefabName + "isn't exist!");
            return(null);
        }

        GameObject go = GameObject.Instantiate(obj) as GameObject;

        go.transform.parent = parent;

        SceneNodeAssets sna = go.AddComponent <SceneNodeAssets>();

        IncreaseAssetsRefs(sna);

        sna.loaded = true;

        return(sna);
    }
示例#5
0
    void IncreaseAssetsRefs(SceneNodeAssets sna)
    {
        foreach (Mesh mesh in sna.meshs)
        {
            if (meshRefs.ContainsKey(mesh))
            {
                meshRefs[mesh]++;
            }
            else
            {
                meshRefs[mesh] = 1;
            }
        }

        foreach (Material mat in sna.materials)
        {
            if (materialRefs.ContainsKey(mat))
            {
                materialRefs[mat]++;
            }
            else
            {
                materialRefs[mat] = 1;
            }
        }

        foreach (Texture tex in sna.textures)
        {
            if (textureRefs.ContainsKey(tex))
            {
                textureRefs[tex]++;
            }
            else
            {
                textureRefs[tex] = 1;
            }
        }
    }