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); } }
void UnloadSceneNode(SceneNodeAssets sna) { if (!sna.loaded) { return; } Destroy(sna.gameObject); DecreaseAssetsRefs(sna); sna.loaded = false; }
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); } } } }
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); }
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; } } }