private static IEnumerator CoLoadLayer(Action <LayersInfo> callback)
        {
            IProject project = IOC.Resolve <IProject>();

            if (m_loadedLayers == null || project.ProjectInfo.Name != m_currentProject)
            {
                m_currentProject = project.ProjectInfo.Name;

                ProjectAsyncOperation <RuntimeTextAsset> getLayersInfoAo = project.GetValue <RuntimeTextAsset>("Battlehub.RTEditor.LayersInfo");
                yield return(getLayersInfoAo);

                if (getLayersInfoAo.HasError)
                {
                    if (getLayersInfoAo.Error.ErrorCode != Error.E_NotFound)
                    {
                        Debug.LogErrorFormat("Unable to load LayersInfo {0}", getLayersInfoAo.Error);
                        yield break;
                    }

                    m_loadedLayers        = ScriptableObject.CreateInstance <LayersInfo>();
                    m_loadedLayers.Layers = new List <LayersInfo.Layer>
                    {
                        new LayersInfo.Layer("Default", 0),
                        new LayersInfo.Layer("Transparent FX", 1),
                        new LayersInfo.Layer("Ignore Raycast", 2),
                        new LayersInfo.Layer("Water", 4),
                        new LayersInfo.Layer("UI", 5)
                    };

                    for (int i = 10; i <= 15; ++i)
                    {
                        m_loadedLayers.Layers.Add(new LayersInfo.Layer(LayerMask.LayerToName(i), i));
                    }

                    for (int i = 25; i <= 30; ++i)
                    {
                        m_loadedLayers.Layers.Add(new LayersInfo.Layer(LayerMask.LayerToName(i), i));
                    }

                    RuntimeTextAsset layersTextAsset = ScriptableObject.CreateInstance <RuntimeTextAsset>();
                    layersTextAsset.Text = JsonUtility.ToJson(m_loadedLayers);

                    ProjectAsyncOperation setLayersInfoAo = project.SetValue("Battlehub.RTEditor.LayersInfo", layersTextAsset);
                    yield return(setLayersInfoAo);

                    if (setLayersInfoAo.HasError)
                    {
                        Debug.LogErrorFormat("Unable to set LayersInfo {0}", setLayersInfoAo.Error);
                        yield break;
                    }
                }
                else
                {
                    m_loadedLayers = ScriptableObject.CreateInstance <LayersInfo>();
                    JsonUtility.FromJsonOverwrite(getLayersInfoAo.Result.Text, m_loadedLayers);

                    foreach (LayersInfo.Layer layer in m_loadedLayers.Layers)
                    {
                        if (string.IsNullOrEmpty(layer.Name))
                        {
                            layer.Name = LayerMask.LayerToName(layer.Index);
                        }
                    }
                }
            }

            callback(m_loadedLayers);
        }
Exemple #2
0
        public ProjectAsyncOperation <ProjectItem[]> DeleteAssets(ProjectItem[] projectItems, Action <ProjectItem[]> done)
        {
            ProjectAsyncOperation <ProjectItem[]> ao = new ProjectAsyncOperation <ProjectItem[]> ();

            IProject project = IOC.Resolve <IProject>();

            AssetItem[] assetItems = projectItems.OfType <AssetItem>().ToArray();
            for (int i = 0; i < assetItems.Length; ++i)
            {
                AssetItem   assetItem = assetItems[i];
                UnityObject obj       = m_project.FromID <UnityObject>(assetItem.ItemID);

                if (obj != null)
                {
                    if (obj is GameObject)
                    {
                        GameObject  go         = (GameObject)obj;
                        Component[] components = go.GetComponentsInChildren <Component>(true);
                        for (int j = 0; j < components.Length; ++j)
                        {
                            Component component = components[j];
                            Undo.Erase(component, null);
                            if (component is Transform)
                            {
                                Undo.Erase(component.gameObject, null);
                            }
                        }
                    }
                    else
                    {
                        Undo.Erase(obj, null);
                    }
                }
            }

            ProjectItem[] folders = projectItems.Where(pi => pi.IsFolder).ToArray();
            m_project.Delete(assetItems.Union(folders).ToArray(), (deleteError, deletedItems) =>
            {
                IsBusy = false;
                if (deleteError.HasError)
                {
                    m_wm.MessageBox("Unable to delete folders", deleteError.ErrorText);

                    if (done != null)
                    {
                        done(null);
                    }

                    ao.Error       = deleteError;
                    ao.IsCompleted = true;
                    return;
                }

                StartCoroutine(CoUpdateDependantAssetPreview(assetItems, () =>
                {
                    if (done != null)
                    {
                        done(projectItems);
                    }

                    ao.Error       = new Error();
                    ao.Result      = projectItems;
                    ao.IsCompleted = true;
                }));
            });

            return(ao);
        }
Exemple #3
0
        private IEnumerator Start()
        {
            yield return(new WaitUntil(() => m_project.IsOpened));

            yield return(new WaitWhile(() => m_editor.IsBusy));

            if (Loading != null)
            {
                Loading();
            }

            ProjectAsyncOperation <RuntimeBinaryAsset> getAssemblyAo = m_project.GetValue <RuntimeBinaryAsset>(RuntimeAssemblyKey);

            yield return(getAssemblyAo);

            if (getAssemblyAo.HasError)
            {
                if (getAssemblyAo.Error.ErrorCode != Error.E_NotFound)
                {
                    Debug.LogError(getAssemblyAo.Error);
                }
                else
                {
                    m_typeNameToGuid        = new Dictionary <string, Guid>();
                    m_runtimeTypeGuidsAsset = ScriptableObject.CreateInstance <RuntimeTextAsset>();
                }
            }
            else
            {
                ProjectAsyncOperation <RuntimeTextAsset> getGuidsAo = m_project.GetValue <RuntimeTextAsset>(RuntimeTypeGuids);
                yield return(getGuidsAo);

                if (getGuidsAo.HasError)
                {
                    Debug.LogError(getGuidsAo.Error);
                }
                else
                {
                    m_typeNameToGuid        = new Dictionary <string, Guid>();
                    m_runtimeTypeGuidsAsset = getGuidsAo.Result;

                    string xml = m_runtimeTypeGuidsAsset.Text;
                    if (!string.IsNullOrEmpty(xml))
                    {
                        RuntimeTypeGuids typeGuids = XmlUtility.FromXml <RuntimeTypeGuids>(xml);
                        foreach (RuntimeTypeGuid typeGuid in typeGuids.Guids)
                        {
                            Guid guid;
                            if (!m_typeNameToGuid.ContainsKey(typeGuid.FullName) && Guid.TryParse(typeGuid.Guid, out guid))
                            {
                                m_typeNameToGuid.Add(typeGuid.FullName, guid);
                            }
                        }
                    }

                    LoadAssembly(getAssemblyAo.Result.Data);
                }
            }

            if (Loaded != null)
            {
                Loaded();
            }
        }
        private IEnumerator CoCreatePrefab(ProjectItem dropTarget, byte[][] previewData, object[] objects, Action <AssetItem[]> done)
        {
            if (objects.Any(o => !(o is GameObject)))
            {
                IsBusy = true;

                if (dropTarget.Children == null || dropTarget.Get("DropTarget/Data") == null)
                {
                    ProjectAsyncOperation createFoldersAo = m_project.CreateFolder(dropTarget.Get("DropTarget/Data", true));
                    yield return(createFoldersAo);

                    if (createFoldersAo.HasError)
                    {
                        m_wm.MessageBox("Unable to create data folder", createFoldersAo.Error.ToString());
                        IsBusy = false;
                        if (done != null)
                        {
                            done(null);
                        }
                        yield break;
                    }
                }

                IProjectTree projectTree = IOC.Resolve <IProjectTree>();
                if (projectTree != null)
                {
                    projectTree.SelectedItem = dropTarget;
                }
            }

            IsBusy = true;

            ProjectItem        dataFolder = dropTarget.Get("DropTarget/Data");
            List <ProjectItem> parents    = new List <ProjectItem>();

            for (int i = 0; i < objects.Length; ++i)
            {
                object obj = objects[i];
                if (obj is GameObject)
                {
                    parents.Add(dropTarget);
                }
                else
                {
                    parents.Add(dataFolder);
                }
            }

            ProjectAsyncOperation <AssetItem[]> saveAo = m_project.Save(parents.ToArray(), previewData, objects, null);

            yield return(saveAo);

            if (saveAo.HasError)
            {
                m_wm.MessageBox(m_localization.GetString("ID_RTEditor_UnableToCreatePrefab", "Unable to create prefab"), saveAo.Error.ErrorText);
                IsBusy = false;
                if (done != null)
                {
                    done(null);
                }
                yield break;
            }

            IsBusy = false;
            if (done != null)
            {
                done(saveAo.Result.ToArray());
            }
        }
Exemple #5
0
        public ProjectAsyncOperation <AssetItem[]> SaveAssets(UnityObject[] assets, Action <AssetItem[]> done)
        {
            ProjectAsyncOperation <AssetItem[]> ao = new ProjectAsyncOperation <AssetItem[]>();

            IProject project = IOC.Resolve <IProject>();

            List <UnityObject> assetsToSave = new List <UnityObject>();
            List <AssetItem>   assetItems   = new List <AssetItem>();

            for (int i = 0; i < assets.Length; ++i)
            {
                UnityObject asset     = assets[i];
                AssetItem   assetItem = project.ToAssetItem(asset);
                if (assetItem == null)
                {
                    continue;
                }

                assetsToSave.Add(asset);
                assetItems.Add(assetItem);
            }

            if (assetsToSave.Count == 0)
            {
                if (done != null)
                {
                    done(assetItems.ToArray());
                }
                ao.Error       = Error.NoError;
                ao.IsCompleted = true;
                return(ao);
            }

            IsBusy = true;
            m_project.Save(assetItems.ToArray(), assets.ToArray(), (saveError, saveResult) =>
            {
                if (saveError.HasError)
                {
                    IsBusy = false;
                    m_wm.MessageBox(m_localization.GetString("ID_RTEditor_UnableToSaveAsset", "Unable to save asset"), saveError.ErrorText);

                    if (done != null)
                    {
                        done(null);
                    }

                    ao.Error       = saveError;
                    ao.IsCompleted = true;
                    return;
                }

                UpdateDependentAssetPreviews(saveResult, () =>
                {
                    IsBusy = false;
                    if (done != null)
                    {
                        done(saveResult);
                    }
                    ao.Error       = Error.NoError;
                    ao.Result      = saveResult;
                    ao.IsCompleted = true;
                });
            });

            return(ao);
        }