public static void CreatePefabParts(GameObject go, ref int indenitity, List <PrefabPartInfo> prefabParts, int parentId = -1, int depth = 0) { Component[] components = go.GetComponents <Component>(); foreach (Component component in components) { PrefabPartInfo componentPart = new PrefabPartInfo(); componentPart.ParentPersistentID = parentId; componentPart.PersistentID = indenitity; componentPart.Object = component; componentPart.Depth = depth; indenitity++; prefabParts.Add(componentPart); } if (go.transform.childCount > 0) { foreach (Transform child in go.transform) { PrefabPartInfo childPart = new PrefabPartInfo(); childPart.ParentPersistentID = parentId; childPart.PersistentID = indenitity; childPart.Object = child.gameObject; childPart.Depth = depth; indenitity++; prefabParts.Add(childPart); CreatePefabParts(child.gameObject, ref indenitity, prefabParts, childPart.PersistentID, depth + 1); } } }
private void CreatePefabParts(AssetInfo assetInfo, GameObject go, int parentId = -1, int depth = 0) { Component[] components = go.GetComponents <Component>(); foreach (Component component in components) { PrefabPartInfo componentPart = new PrefabPartInfo(); componentPart.ParentPersistentID = parentId; componentPart.PersistentID = m_asset.AssetLibrary.Identity; componentPart.Object = component; componentPart.Depth = depth; m_asset.AssetLibrary.Identity++; assetInfo.PrefabParts.Add(componentPart); } if (go.transform.childCount > 0) { foreach (Transform child in go.transform) { PrefabPartInfo childPart = new PrefabPartInfo(); childPart.ParentPersistentID = parentId; childPart.PersistentID = m_asset.AssetLibrary.Identity; childPart.Object = child.gameObject; childPart.Depth = depth; m_asset.AssetLibrary.Identity++; assetInfo.PrefabParts.Add(childPart); CreatePefabParts(assetInfo, child.gameObject, childPart.PersistentID, depth + 1); } } }
private void MergeAssets(AssetFolderInfo from, ProjectItem to, int ordinal) { List <AssetInfo> fromAssets = from.Assets; if (fromAssets == null) { return; } if (to.Children == null) { to.Children = new List <ProjectItem>(); } for (int i = 0; i < fromAssets.Count; ++i) { AssetInfo assetFrom = fromAssets[i]; if (assetFrom.Object == null) { continue; } AssetItem assetTo = to.Children.OfType <AssetItem>().Where(item => item.Name == assetFrom.name).FirstOrDefault(); if (assetTo == null) { assetTo = new AssetItem(); to.Children.Add(assetTo); } assetTo.Name = assetFrom.name; assetTo.ItemID = m_assetDB.ToExposedResourceID(ordinal, assetFrom.PersistentID); assetTo.Parent = to; assetTo.TypeGuid = m_typeMap.ToGuid(assetFrom.Object.GetType()); assetTo.Preview = null; //must rebuild preview if (assetFrom.PrefabParts != null) { assetTo.Parts = new PrefabPart[assetFrom.PrefabParts.Count]; for (int j = 0; j < assetFrom.PrefabParts.Count; ++j) { PrefabPartInfo prefabPart = assetFrom.PrefabParts[j]; Guid typeGuid = m_typeMap.ToGuid(prefabPart.Object.GetType()); if (prefabPart != null && prefabPart.Object != null && typeGuid != Guid.Empty) { assetTo.Parts[j] = new PrefabPart { Name = prefabPart.Object.name, ParentID = prefabPart.ParentPersistentID, PartID = prefabPart.PersistentID, TypeGuid = typeGuid }; } else { assetTo.Parts[j] = null; } } } } }
private void Sync( AssetLibraryInfo assetLibraryInfo, int parentPersistentID, int depth, GameObject go, Dictionary <UnityObject, PrefabPartInfo> objToParts, List <PrefabPartInfo> newPrefabs) { Component[] components = go.GetComponents <Component>(); for (int i = 0; i < components.Length; ++i) { Component component = components[i]; PrefabPartInfo part; if (objToParts.TryGetValue(component, out part)) { newPrefabs.Add(part); } else { part = new PrefabPartInfo { Depth = depth, Object = component, PersistentID = assetLibraryInfo.Identity, ParentPersistentID = parentPersistentID }; assetLibraryInfo.Identity++; newPrefabs.Add(part); } } foreach (Transform child in go.transform) { GameObject childGo = child.gameObject; PrefabPartInfo part; if (objToParts.TryGetValue(childGo, out part)) { newPrefabs.Add(part); } else { part = new PrefabPartInfo { Depth = depth, Object = childGo, PersistentID = assetLibraryInfo.Identity, ParentPersistentID = parentPersistentID }; assetLibraryInfo.Identity++; newPrefabs.Add(part); } Sync(assetLibraryInfo, part.PersistentID, depth + 1, childGo, objToParts, newPrefabs); } }
private void LoadIDMappingTo(AssetInfo asset, MappingInfo mapping, List <int> instanceIDs, List <int> persistentIDs, bool IIDtoPID, bool PIDtoObj) { if (IIDtoPID) { int instanceID = asset.Object.GetInstanceID(); //Following if statement required because object can be added to multiple libraries and //have multiple persistetnt identifiers. Only first persistent identifier is added to dictionary. //Any persistent id can be converted to "first" persistent id using following approach: //(PersistenID -> Obj) -> (InstanceID -> First PersistentID) if (!mapping.InstanceIDtoPID.ContainsKey(instanceID)) { mapping.Add(instanceID, m_offset + asset.PersistentID); instanceIDs.Add(instanceID); } } if (PIDtoObj) { int persistentID = m_offset + asset.PersistentID; mapping.Add(persistentID, asset.Object); persistentIDs.Add(persistentID); } if (asset.PrefabParts != null) { for (int i = 0; i < asset.PrefabParts.Count; ++i) { PrefabPartInfo prefabPart = asset.PrefabParts[i]; if (prefabPart != null && prefabPart.Object != null) { if (IIDtoPID) { int instanceID = prefabPart.Object.GetInstanceID(); if (!mapping.InstanceIDtoPID.ContainsKey(instanceID)) { mapping.Add(instanceID, m_offset + prefabPart.PersistentID); instanceIDs.Add(instanceID); } } if (PIDtoObj) { int persistentID = m_offset + prefabPart.PersistentID; mapping.Add(persistentID, prefabPart.Object); persistentIDs.Add(persistentID); } } } } }
private void CreateAsset(UnityObject obj, AssetInfo parentAssetInfo, int insertIndex = -1, AssetFolderInfo folder = null) { AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder); assetInfo.Object = obj; AddAssetToFolder(assetInfo, folder); if (obj is GameObject) { GameObject go = (GameObject)obj; assetInfo.PrefabParts = new List <PrefabPartInfo>(); CreatePefabParts(assetInfo, go); if (folder != null) { if (IsFolderSelected(folder)) { if (assetInfo.PrefabParts != null) { Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>(); assets.Add(-1, assetInfo); for (int i = 0; i < assetInfo.PrefabParts.Count; ++i) { PrefabPartInfo prefabPart = assetInfo.PrefabParts[i]; string name; if (prefabPart.Object == null) { name = "<Null>"; } else { if (prefabPart.Object is Component) { name = prefabPart.Object.GetType().Name; } else { name = prefabPart.Object.name; } } AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth, prefabPart.PersistentID); prefabPartAssetInfo.Object = prefabPart.Object; assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo); TreeElement parent = assets[prefabPart.ParentPersistentID]; TreeView.treeModel.AddElement(prefabPartAssetInfo, parent, parent.children != null ? parent.children.Count : 0); } } } } } }
public static void CreatePefabParts(GameObject go, ref int identity, Dictionary <UnityObject, int> objToId, List <PrefabPartInfo> prefabParts, int parentId = -1, int depth = 0) { Component[] components = go.GetComponents <Component>(); foreach (Component component in components) { PrefabPartInfo componentPart = new PrefabPartInfo(); componentPart.ParentPersistentID = parentId; if (objToId.ContainsKey(component)) { componentPart.PersistentID = objToId[component]; } else { componentPart.PersistentID = identity; identity++; } componentPart.Object = component; componentPart.Depth = depth; prefabParts.Add(componentPart); } if (go.transform.childCount > 0) { foreach (Transform child in go.transform) { PrefabPartInfo childPart = new PrefabPartInfo(); childPart.ParentPersistentID = parentId; if (objToId.ContainsKey(child.gameObject)) { childPart.PersistentID = objToId[child.gameObject]; } else { childPart.PersistentID = identity; identity++; } childPart.Object = child.gameObject; childPart.Depth = depth; prefabParts.Add(childPart); CreatePefabParts(child.gameObject, ref identity, objToId, prefabParts, childPart.PersistentID, depth + 1); } } }
private void CopyFolder(AssetFolderInfo sourceFolder, AssetFolderInfo targetFolder) { targetFolder.id = sourceFolder.id; targetFolder.name = sourceFolder.name; targetFolder.depth = sourceFolder.depth; if (sourceFolder.Assets != null) { targetFolder.Assets = new List <AssetInfo>(); for (int i = 0; i < sourceFolder.Assets.Count; ++i) { AssetInfo sourceAsset = sourceFolder.Assets[i]; if (sourceAsset.IsEnabled) { AssetInfo targetAsset = new AssetInfo(); targetAsset.depth = sourceAsset.depth; targetAsset.id = sourceAsset.id; targetAsset.name = sourceAsset.name; targetAsset.IsEnabled = sourceAsset.IsEnabled; targetAsset.Object = sourceAsset.Object; if (sourceAsset.PrefabParts != null) { targetAsset.PrefabParts = new List <PrefabPartInfo>(); for (int j = 0; j < sourceAsset.PrefabParts.Count; ++j) { PrefabPartInfo sourcePart = sourceAsset.PrefabParts[j]; PrefabPartInfo targetPart = new PrefabPartInfo(); targetPart.Depth = sourcePart.Depth; targetPart.Object = sourcePart.Object; targetPart.ParentPersistentID = sourcePart.ParentPersistentID; targetPart.PersistentID = sourcePart.PersistentID; targetAsset.PrefabParts.Add(targetPart); } } targetFolder.Assets.Add(targetAsset); } } } }
public bool IsSyncRequired() { if (Object == null) { return(false); } GameObject go = Object as GameObject; if (go == null) { return(false); } PrefabPartInfo rootPart = new PrefabPartInfo { Object = go, Depth = -1, ParentPersistentID = -1, PersistentID = -1, }; Dictionary <UnityObject, PrefabPartInfo> objToParts = PrefabParts != null? PrefabParts.Where(part => part.Object != null).ToDictionary(part => part.Object) : new Dictionary <UnityObject, PrefabPartInfo>(); objToParts.Add(go, rootPart); Dictionary <int, PrefabPartInfo> idToParts = PrefabParts != null? PrefabParts.Where(part => part.Object != null).ToDictionary(part => part.PersistentID) : new Dictionary <int, PrefabPartInfo>(); idToParts.Add(rootPart.PersistentID, rootPart); return(IsSyncRequired(go, objToParts, idToParts)); }
private IList <AssetInfo> GetData() { if (m_folders != null) { List <AssetInfo> result = new List <AssetInfo>(); AssetInfo root = new AssetInfo { id = 0, name = "Root", IsEnabled = false, depth = -1, }; result.Add(root); foreach (AssetInfo assetInfo in m_folders.Where(folder => folder.Assets != null).SelectMany(folder => folder.Assets)) { assetInfo.parent = root; result.Add(assetInfo); if (assetInfo.PrefabParts != null) { Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>(); assets.Add(-1, assetInfo); for (int i = 0; i < assetInfo.PrefabParts.Count; ++i) { PrefabPartInfo prefabPart = assetInfo.PrefabParts[i]; string name; if (prefabPart.Object == null) { name = "<Null>"; } else { if (prefabPart.Object is Component) { name = prefabPart.Object.GetType().Name; } else { name = prefabPart.Object.name; } } AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth + 1, prefabPart.PersistentID); prefabPartAssetInfo.Object = prefabPart.Object; assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo); TreeElement parent = assets[prefabPart.ParentPersistentID]; prefabPartAssetInfo.parent = parent; result.Add(prefabPartAssetInfo); } } } return(result); } return(new List <AssetInfo> { new AssetInfo { id = 0, name = "Root", IsEnabled = false, depth = -1, } }); }
private bool CreateAsset(UnityObject obj, AssetInfo parentAssetInfo, int insertIndex = -1, AssetFolderInfo folder = null) { if (obj is GameObject) { GameObject go = (GameObject)obj; int identity = m_asset.AssetLibrary.Identity + 1; List <PrefabPartInfo> prefabParts = new List <PrefabPartInfo>(); CreatePefabParts(go, ref identity, prefabParts); if (identity >= AssetLibraryInfo.MAX_ASSETS) { return(false); } AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder); assetInfo.Object = obj; AddAssetToFolder(assetInfo, folder); assetInfo.PrefabParts = prefabParts; m_asset.AssetLibrary.Identity = identity; if (folder != null) { if (IsFolderSelected(folder)) { if (assetInfo.PrefabParts != null) { Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>(); assets.Add(-1, assetInfo); for (int i = 0; i < assetInfo.PrefabParts.Count; ++i) { PrefabPartInfo prefabPart = assetInfo.PrefabParts[i]; string name; if (prefabPart.Object == null) { name = "<Null>"; } else { if (prefabPart.Object is Component) { name = prefabPart.Object.GetType().Name; } else { name = prefabPart.Object.name; } } AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth, prefabPart.PersistentID); prefabPartAssetInfo.Object = prefabPart.Object; assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo); TreeElement parent = assets[prefabPart.ParentPersistentID]; TreeView.treeModel.AddElement(prefabPartAssetInfo, parent, parent.children != null ? parent.children.Count : 0); } } } } } else { AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder); assetInfo.Object = obj; AddAssetToFolder(assetInfo, folder); } return(true); }
private void BuildTree(ProjectItem projectItem, AssetFolderInfo folder, int ordinal) { projectItem.Name = folder.name; if (folder.hasChildren) { projectItem.Children = new List <ProjectItem>(); for (int i = 0; i < folder.children.Count; ++i) { ProjectItem child = new ProjectItem(); projectItem.AddChild(child); BuildTree(child, (AssetFolderInfo)folder.children[i], ordinal); } } if (folder.Assets != null && folder.Assets.Count > 0) { if (projectItem.Children == null) { projectItem.Children = new List <ProjectItem>(); } List <string> existingNames = new List <string>(); for (int i = 0; i < folder.Assets.Count; ++i) { AssetInfo assetInfo = folder.Assets[i]; if (assetInfo.Object != null) { string ext = GetExt(assetInfo.Object); ImportItem importItem = new ImportItem { Name = PathHelper.GetUniqueName(assetInfo.name, ext, existingNames), Ext = ext, Object = assetInfo.Object, TypeGuid = m_typeMap.ToGuid(assetInfo.Object.GetType()), ItemID = m_assetDB.ToStaticResourceID(ordinal, assetInfo.PersistentID) }; if (assetInfo.PrefabParts != null) { List <PrefabPart> parts = new List <PrefabPart>(); for (int j = 0; j < assetInfo.PrefabParts.Count; ++j) { PrefabPartInfo partInfo = assetInfo.PrefabParts[j]; if (partInfo.Object != null) { PrefabPart part = new PrefabPart { Name = partInfo.Object.name, PartID = m_assetDB.ToStaticResourceID(ordinal, partInfo.PersistentID), ParentID = m_assetDB.ToStaticResourceID(ordinal, partInfo.PersistentID), TypeGuid = m_typeMap.ToGuid(partInfo.Object.GetType()), }; parts.Add(part); } } importItem.Parts = parts.ToArray(); } projectItem.AddChild(importItem); existingNames.Add(importItem.NameExt); } } } }