/// <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);
        }
Exemple #2
0
        /// <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();
        }