/// <summary> /// 添加 /// </summary> public int AddPrefab(SceneTreeNodeObjectData obj) { // 预制 var prefab = PrefabUtility.GetPrefabParent(obj.go) as GameObject; if (null == prefab) { Debug.LogErrorFormat("Null prefab of {0}", obj.go.name); return(-1); } // 资源路径 var assetPath = AssetDatabase.GetAssetPath(prefab); if (string.IsNullOrEmpty(assetPath)) { return(-1); } // 查找 for (int i = 0, ci = _prefabs.Count; i < ci; ++i) { var p = _prefabs[i]; if (p.assetPath == assetPath) { ++p.refCount; return(i); } } // 新建 var newPrefab = new ScenePrefab { data = obj, assetPath = assetPath, refCount = 1 }; newPrefab.data.go.name = prefab.name; _prefabs.Add(newPrefab); return(_prefabs.Count - 1); }
/// <summary> /// 导出对象 /// </summary> public void ExportObjects(SceneTreeData treeData, SceneTreeNodeData nodeData, ScenePrefabCollection prefabCollection) { var objs = new List <SceneTreeNodeObjectData>(); var instances = new List <SceneObjectInstanceData>(); for (int i = 0; i < _items.Length; ++i) { var item = _items[i]; var obj = new SceneTreeNodeObjectData(); obj.go = item.go; obj.trans = item.go.transform; obj.bounds = item.bounds; obj.go.layer = LayerDefine.Invisible; obj.lods = new SceneTreeNodeObjectLodData[item.resDep.lods.Count]; for (int n = 0; n < obj.lods.Length; ++n) { var lod = item.resDep.lods[n]; var renderer = lod.go.GetComponent <Renderer>(); if (null == renderer) { Debug.LogErrorFormat("Null renderer of {0} lod {1}!", item.go.name, n); continue; } var lodData = new SceneTreeNodeObjectLodData(); lodData.resCollection = lod.resCollector.Export(); // Cfg if (null != item.cfg) { if (null != item.cfg.lods && n > 0 && n <= item.cfg.lods.Length) { var lodCfg = item.cfg.lods[n - 1]; lodData.viewDist = lodCfg.viewDist; lodData.isBillboard = lodCfg.isBillboard; } } lodData.mats = renderer.sharedMaterials; obj.lods[n] = lodData; if (0 == n) { obj.renderer = renderer; renderer.enabled = false; } } // 无效对象 if (null == obj.renderer) { continue; } // 显示配置 if (null != item.cfg) { if (item.cfg.usePrefab) { if ((item.objTypeFlag & (1 << (int)SceneTreeObjType.Collider)) != 0) { Debug.LogErrorFormat("Item {0} has collider, can not use prefab!", item.go.name); } else { var prefabId = prefabCollection.AddPrefab(obj); if (prefabId >= 0) { var instance = new SceneObjectInstanceData { prefabId = prefabId, }; instances.Add(instance); // 销毁对象 //if (prefabCollection.GetRefCount(prefabId) > 1) //{ // GameObject.DestroyImmediate(obj.go); // obj.go = null; //} } } } } objs.Add(obj); } nodeData.objects = objs.ToArray(); nodeData.instances = instances.ToArray(); }