Ejemplo n.º 1
0
        private static void UpgradeAllTextObjects()
        {
            if (
                !EditorUtility.DisplayDialog(
                    "Upgrade All UI Text?",
                    string.Format(
                        "This option will scan your project for all {0} instances and replace them with {1} objects. " +
                        "All references to objects and serialized values will remain intact.",
                        typeof(UnityEngine.UI.Text).FullName, typeof(HyperText).FullName
                        ), "Yes", "No"
                    )
                )
            {
                return;
            }
            HyperText  ht     = new GameObject("DELETE THIS", typeof(HyperText)).GetComponent <HyperText>();
            MonoScript script = MonoScript.FromMonoBehaviour(ht);

            AssetDatabaseX.ModifyAllComponentsInProject <UnityEngine.UI.Text>(
                delegate(UnityEngine.UI.Text text, string assetPath)
            {
                if (text is HyperText)
                {
                    return;
                }
                SerializedObject so = new SerializedObject(text);
                so.FindProperty("m_Script").objectReferenceValue = script;
                so.ApplyModifiedProperties();
            }
                );
            if (ht != null)
            {
                Object.DestroyImmediate(ht.gameObject);
            }
        }
Ejemplo n.º 2
0
    private void Rebuild()
    {
        VisualElement root = rootVisualElement;

        root.Clear();

        var styleSheet       = AssetDatabaseX.LoadAssetWithGUID <StyleSheet>(UssGuid);
        var visualTree       = AssetDatabaseX.LoadAssetWithGUID <VisualTreeAsset>(UxmlGuid);
        var commonStyleSheet = AssetDatabaseX.LoadAssetWithGUID <StyleSheet>(ToolsConstants.Resources.COMMON_STYLES_USS_GUID);

        if (styleSheet != null)
        {
            root.styleSheets.Add(styleSheet);
        }
        root.styleSheets.Add(commonStyleSheet);
        visualTree.CloneTree(root);

        var refreshButton = root.Q <Button>(name: "refreshButton");

        if (refreshButton != null)
        {
            refreshButton.clickable.clicked -= Rebuild;
            refreshButton.clickable.clicked += Rebuild;
        }

        Rebuild(root);
    }
Ejemplo n.º 3
0
        private static void CleanUpQuads()
        {
#pragma warning disable 612
            AssetDatabaseX.ModifyAllComponentsInProject <HyperTextQuad>(
                (quad, assetPath) => Undo.DestroyObjectImmediate(quad), "Clean Up HyperText Quads in Prefabs"
                );
#pragma warning restore 612
        }
Ejemplo n.º 4
0
    public ToolsVisualElementBase()
    {
        var uss = AssetDatabaseX.LoadAssetWithGUID <StyleSheet>(UssGuid);

        if (uss != null)
        {
            styleSheets.Add(uss);
        }
        styleSheets.Add(AssetDatabaseX.LoadAssetWithGUID <StyleSheet>(ToolsConstants.Resources.COMMON_STYLES_USS_GUID));
        VisualTreeAsset visualTree = AssetDatabaseX.LoadAssetWithGUID <VisualTreeAsset>(UxmlGuid);

        visualTree.CloneTree(this);
    }
    public static void UpdateSimAssetIds()
    {
        SimAssetBank bank = AssetDatabaseX.LoadOrCreateScriptableObjectAsset <SimAssetBank>(ASSET_PATH);

        bank.EditorSimAssets.Clear();

        AssetDatabaseX.LoadPrefabAssetsWithComponentOnRoot <SimAsset>(out List <KeyValuePair <string, GameObject> > loadResult);
        foreach (KeyValuePair <string, GameObject> item in loadResult)
        {
            var prefab = item.Value.GetComponent <SimAsset>();

            ValidateSimAssetIdForPrefab(prefab);

            bank.EditorSimAssets.Add(prefab);
        }

        DebugEditor.LogAssetIntegrity($"[{nameof(SimAssetBankUpdater)}] Updated {typeof(SimAssetBank)}");

        EditorUtility.SetDirty(bank);
        AssetDatabase.SaveAssets();
    }
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        if (AssetPostprocessorUtility.ExitImportLoop(importedAssets, ASSET_PATH, ref s_importLoopCounter))
        {
            return;
        }

        SimAssetBank bank      = null;
        bool         saveAsset = false;

        importedAssets.Where((assetPath) => assetPath.EndsWith(".prefab"))
        .Select((assetPath) => AssetDatabase.LoadAssetAtPath <GameObject>(assetPath))
        .Where((gameObject) => gameObject.GetComponent <SimAsset>() != null)
        .Select((gameObject) => gameObject.GetComponent <SimAsset>())
        .ToList()
        .ForEach((SimAsset prefab) =>
        {
            if (bank == null)
            {
                bank = AssetDatabaseX.LoadOrCreateScriptableObjectAsset <SimAssetBank>(ASSET_PATH);
            }

            saveAsset |= ValidateSimAssetIdForPrefab(prefab);

            if (!bank.EditorSimAssets.Contains(prefab))
            {
                saveAsset = true;
                bank.EditorSimAssets.Add(prefab);

                DebugEditor.LogAssetIntegrity($"Added {prefab.gameObject.name} to {nameof(SimAssetBank)}.");
            }
        });

        if (saveAsset)
        {
            EditorUtility.SetDirty(bank);
            AssetDatabase.SaveAssets();
        }
    }
    public void UpdateBankComplete()
    {
        TBank bank = AssetDatabaseX.LoadOrCreateAsset(_bankAssetPath, () => ScriptableObject.CreateInstance <TBank>());

        var storedObjects = _getStoredObjectsFromBankDelegate(bank);

        storedObjects.Clear();

        LoadAll(out List <(string, TAsset)> loadResult);

        foreach ((string guid, TAsset asset) in loadResult)
        {
            if (_evaluateAssetDelegate(asset, out TStoredObject storedObject))
            {
                storedObjects.Add(storedObject);
            }
        }

        DebugEditor.LogAssetIntegrity($"{bank.name} bank updated.");
        EditorUtility.SetDirty(bank);
        AssetDatabase.SaveAssets();
    }
    void SetBlendMode(BlendMode blendMode)
    {
        Shader shader;
        string assetPath;

        switch (blendMode)
        {
        default:
        case BlendMode.Add:
            shader    = _shaderAdd;
            assetPath = ASSET_PATH_ADD;
            break;
        }

        Material material = AssetDatabaseX.LoadOrCreateAsset(assetPath, () =>
        {
            var newMat = new Material(shader);
            newMat.enableInstancing = true;
            return(newMat);
        });

        ((SpriteLight)target).GetComponent <SpriteRenderer>().sharedMaterial = material;
    }
    private void UpdateBank(List <TStoredObject> changedPrefabs)
    {
        TBank bank = AssetDatabaseX.LoadOrCreateAsset(_bankAssetPath, () => ScriptableObject.CreateInstance <TBank>());

        var storedObjects = _getStoredObjectsFromBankDelegate(bank);

        bool change = false;

        foreach (var item in changedPrefabs)
        {
            if (!storedObjects.Contains(item))
            {
                storedObjects.Add(item);
                change = true;
            }
        }

        if (change)
        {
            DebugEditor.LogAssetIntegrity($"{bank.name} updated.");
            EditorUtility.SetDirty(bank);
            AssetDatabase.SaveAssets();
        }
    }
    static void UpdateMetaData(LogMode logMode)
    {
        SceneMetaDataBank dataAsset = AssetDatabaseX.LoadOrCreateScriptableObjectAsset <SceneMetaDataBank>(ASSET_PATH);

        if (dataAsset == null)
        {
            Debug.LogWarning($"Could not update SceneMetaDataBank. None found at [{ASSET_PATH}]");
            return;
        }

        List <SceneMetaDataBank.SceneMetaData> oldData = dataAsset.SceneMetaDatasInternal;
        List <SceneMetaDataBank.SceneMetaData> newData = new List <SceneMetaDataBank.SceneMetaData>();

        int buildIndex = 0;

        foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
        {
            SceneMetaDataBank.SceneMetaData metaData = new SceneMetaDataBank.SceneMetaData();

            metaData.AssetGuid  = scene.guid.ToString();
            metaData.Path       = scene.path;
            metaData.Name       = Path.GetFileNameWithoutExtension(scene.path);
            metaData.BuildIndex = buildIndex;

            newData.Add(metaData);
            buildIndex++;
        }

        dataAsset.SceneMetaDatasInternal = newData;

        // fbessette this diff algo could be optimized
        if (logMode == LogMode.Full || logMode == LogMode.ChangesOnly)
        {
            if (oldData != null)
            {
                for (int i = 0; i < oldData.Count; i++)
                {
                    if (newData.FindIndex((x) => x.AssetGuid == oldData[i].AssetGuid) == -1)
                    {
                        DebugEditor.LogAssetIntegrity($"<color=red>Removed scene meta-data:</color> {oldData[i].Name}");
                    }
                }
                for (int i = 0; i < newData.Count; i++)
                {
                    int oldDataIndex = oldData.FindIndex((x) => x.AssetGuid == newData[i].AssetGuid);
                    if (oldDataIndex == -1)
                    {
                        DebugEditor.LogAssetIntegrity($"<color=green>Added scene meta-data:</color> {newData[i].Name}");
                    }
                    else if (oldData[oldDataIndex].ContentEquals(newData[i]) == false)
                    {
                        DebugEditor.LogAssetIntegrity($"<color=green>Updated scene meta-data:</color> {newData[i].Name}");
                    }
                }
            }
            else
            {
                for (int i = 0; i < newData.Count; i++)
                {
                    DebugEditor.LogAssetIntegrity($"<color=green>Added scene meta-data:</color> {newData[i].Name}");
                }
            }
        }

        if (logMode == LogMode.Full)
        {
            DebugEditor.LogAssetIntegrity("Scene meta-data bank updated");
        }

        EditorUtility.SetDirty(dataAsset);
        AssetDatabase.SaveAssets();
    }
Ejemplo n.º 11
0
    protected override void Rebuild(VisualElement root)
    {
        _localPlayerProfiles = PlayerProfileService.LoadProfilesOnDisk();

        _localPlayerProfileNames = new string[_localPlayerProfiles.Count + 1];
        for (int i = 0; i < _localPlayerProfiles.Count; i++)
        {
            _localPlayerProfileNames[i] = _localPlayerProfiles[i].playerName;
        }
        _localPlayerProfileNames[_localPlayerProfiles.Count] = "- none -";

        _profileElements.Clear();

        ////////////////////////////////////////////////////////////////////////////////////////
        //      Build
        ////////////////////////////////////////////////////////////////////////////////////////

        {
            var element = root.Q <Button>(name: "buildGame");
            element.clickable.clicked += OnClick_BuildGame;
        }

        {
            var element = root.Q <Button>(name: "buildGameAndRun");
            element.clickable.clicked += OnClick_BuildGameAndRun;
        }

        {
            var element = root.Q <Button>(name: "openBuildFolder");
            element.clickable.clicked += OnClick_OpenBuildFolder;
        }

        ////////////////////////////////////////////////////////////////////////////////////////
        //      Launch
        ////////////////////////////////////////////////////////////////////////////////////////
        {
            var element           = root.Q <Toggle>(name: "fromScratch");
            var childrenContainer = root.Q <VisualElement>(name: "startingPointContainer");

            element.value = EditorLaunchData.playFromScratch;
            childrenContainer.EnableInClassList("hidden", element.value);

            element.RegisterValueChangedCallback(
                (ChangeEvent <bool> changeEvent) =>
            {
                EditorLaunchData.playFromScratch = changeEvent.newValue;
                childrenContainer.EnableInClassList("hidden", changeEvent.newValue);
            });
        }

        {
            var container = root.Q <VisualElement>(name: "startingPointContainer");
            var levelBank = AssetDatabaseX.LoadAssetsOfType <LevelBank>().FirstOrDefault();

            List <string> levels = new List <string>();
            levels.Add(""); // the 'none' option

            if (levelBank != null)
            {
                foreach (var item in levelBank.Levels)
                {
                    levels.Add(item.name);
                }

                levels.Sort();
            }

            string levelToDisplayName(string level)
            {
                if (string.IsNullOrEmpty(level))
                {
                    return("- None -");
                }
                return(level);
            }

            _elementLevel = new PopupField <string>("Level", levels, 0,
                                                    formatSelectedValueCallback: levelToDisplayName,
                                                    formatListItemCallback: levelToDisplayName);

            container.Insert(0, _elementLevel);

            if (levels.Contains(EditorLaunchData.level))
            {
                _elementLevel.value = EditorLaunchData.level;
            }

            _elementLevel.RegisterValueChangedCallback(
                (ChangeEvent <string> changeEvent) =>
            {
                EditorLaunchData.level = changeEvent.newValue;
            });
        }

        {
            var elementPlayOnline = root.Q <Toggle>(name: "online");
            var elementServerName = root.Q <TextField>(name: "serverName");

            elementServerName.value = EditorLaunchData.serverName;
            elementServerName.RegisterValueChangedCallback(
                (ChangeEvent <string> changeEvent) =>
            {
                EditorLaunchData.serverName = changeEvent.newValue;
            });

            elementPlayOnline.value = EditorLaunchData.playOnline;
            elementPlayOnline.RegisterValueChangedCallback(
                (ChangeEvent <bool> changeEvent) =>
            {
                EditorLaunchData.playOnline = changeEvent.newValue;

                for (int i = 0; i < _profileElements.Count; i++)
                {
                    _profileElements[i].UpdateContent();
                }

                elementServerName.EnableInClassList("hidden", !changeEvent.newValue);
            });

            elementServerName.EnableInClassList("hidden", !elementPlayOnline.value);
        }

        {
            var element = root.Q <Foldout>(name: "advFoldout");
            element.value = false;
            element.text  = "Advanced";
        }

        {
            var element = root.Q <Toggle>(name: "headless");
            element.value = EditorLaunchData.serverIsHeadless;
            element.RegisterValueChangedCallback(
                (ChangeEvent <bool> changeEvent) =>
            {
                EditorLaunchData.serverIsHeadless = changeEvent.newValue;
            });
        }

        {
            var element = root.Q <TextField>(name: "extraArgs");
            element.value = EditorLaunchData.extraArguments;
            element.RegisterValueChangedCallback(
                (ChangeEvent <string> changeEvent) =>
            {
                GameConsole.EditorPlayCommands  = CommandLine.SplitCommandLineInGroups(changeEvent.newValue).ToArray();
                EditorLaunchData.extraArguments = changeEvent.newValue;
            });
        }

        {
            var element           = root.Q <Toggle>(name: "overrideScreen");
            var childrenContainer = root.Q <VisualElement>(name: "overrideScreenContainer");

            element.value = EditorLaunchData.launchOverrideScreen;
            childrenContainer.EnableInClassList("hidden", !element.value);

            element.RegisterValueChangedCallback(
                (ChangeEvent <bool> changeEvent) =>
            {
                EditorLaunchData.launchOverrideScreen = changeEvent.newValue;
                childrenContainer.EnableInClassList("hidden", !changeEvent.newValue);
            });
        }

        {
            var element = root.Q <Toggle>(name: "fullscreen");
            element.value = EditorLaunchData.launchFullscreen;
            element.RegisterValueChangedCallback(
                (ChangeEvent <bool> changeEvent) =>
            {
                EditorLaunchData.launchFullscreen = changeEvent.newValue;
            });
        }

        {
            var element = root.Q <IntegerField>(name: "screenWidth");
            element.value = EditorLaunchData.launchScreenWidth;
            element.RegisterValueChangedCallback(
                (ChangeEvent <int> changeEvent) =>
            {
                EditorLaunchData.launchScreenWidth = changeEvent.newValue;
            });
        }

        {
            var element = root.Q <IntegerField>(name: "screenHeight");
            element.value = EditorLaunchData.launchScreenHeight;
            element.RegisterValueChangedCallback(
                (ChangeEvent <int> changeEvent) =>
            {
                EditorLaunchData.launchScreenHeight = changeEvent.newValue;
            });
        }

        {
            var element = root.Q <VisualElement>(name: "profilesContainer");

            int whoIsServer = EditorLaunchData.whoIsServerId;
            int whoIsEditor = EditorLaunchData.whoIsEditorId;
            for (int i = 0; i < _localPlayerProfiles.Count; i++)
            {
                PlayerProfile        profile    = _localPlayerProfiles[i];
                LaunchProfileElement newElement = new LaunchProfileElement(profile)
                {
                    IsMarkedAsServer = (whoIsServer == profile.localId),
                    IsMarkedAsEditor = (whoIsEditor == profile.localId),
                };

                newElement.focusable   = true;
                newElement.pickingMode = PickingMode.Position;
                newElement.AddManipulator(new ContextualMenuManipulator((ContextualMenuPopulateEvent evt) =>
                {
                    evt.menu.AppendAction("Set Server", (DropdownMenuAction action) =>
                    {
                        if (newElement.IsMarkedAsServer)
                        {
                            SetAsServer(null);
                        }
                        else
                        {
                            SetAsServer(newElement);
                        }
                    }, status: newElement.IsMarkedAsServer?DropdownMenuAction.Status.Checked: DropdownMenuAction.Status.Normal);
                    evt.menu.AppendAction("Set Editor", (DropdownMenuAction action) =>
                    {
                        if (newElement.IsMarkedAsEditor)
                        {
                            SetAsEditor(null);
                        }
                        else
                        {
                            SetAsEditor(newElement);
                        }
                    }, status: newElement.IsMarkedAsEditor?DropdownMenuAction.Status.Checked: DropdownMenuAction.Status.Normal);
                }));

                _profileElements.Add(newElement);
                element.Add(newElement);
            }
        }

        UpdateFromScenes();
    }
Ejemplo n.º 12
0
        private static void ValidateRaycastTargets()
        {
            if (
                !EditorUtility.DisplayDialog(
                    "Validate HyperText Raycast Targets?",
                    string.Format(
                        "This option will scan your project for all {0} instances that are children of {1} or {2} " +
                        "objects (such as e.g., Buttons) but also have the raycastTarget property enabled and have " +
                        "links defined. Links on these instances will block input events. Results will be logged to " +
                        "the console.\n\nDo you wish to proceed?",
                        typeof(HyperText).Name,
                        typeof(UnityEngine.EventSystems.IPointerClickHandler).Name,
                        typeof(UnityEngine.EventSystems.IPointerDownHandler).Name

                        ), "Yes", "No"
                    )
                )
            {
                return;
            }
            System.Type logEntries =
                ReflectionX.AllTypes.FirstOrDefault(t => t.FullName == "UnityEditorInternal.LogEntries");
            if (logEntries != null)
            {
                System.Reflection.MethodInfo clear = logEntries.GetStaticMethod("Clear");
                if (clear != null)
                {
                    clear.Invoke(null, null);
                }
            }
            bool isSilent = HyperText.IsSilent;

            HyperText.IsSilent = true;
            string undoName = "Validate HyperText Raycast Targets";

            System.Reflection.MethodInfo getWarningMessage =
                typeof(HyperText).GetInstanceMethod("GetInputBlockingWarningMessage");
            AssetDatabaseX.ModifyAssetCallback <HyperText> validateRaycastTarget =
                delegate(HyperText hyperText, string assetPath)
            {
                if (!hyperText.raycastTarget)
                {
                    return;
                }
#if UNITY_4_6 || UNITY_4_7
                s_ClickHandlers.Clear();
                s_DownHandlers.Clear();
                s_ClickHandlers.AddRange(
                    hyperText.GetComponentsInParent(
                        typeof(UnityEngine.EventSystems.IPointerClickHandler), true
                        ).Cast <UnityEngine.EventSystems.IPointerClickHandler>()
                    );
                s_DownHandlers.AddRange(
                    hyperText.GetComponentsInParent(
                        typeof(UnityEngine.EventSystems.IPointerDownHandler), true
                        ).Cast <UnityEngine.EventSystems.IPointerDownHandler>()
                    );
#else
                hyperText.GetComponentsInParent(true, s_ClickHandlers);
                hyperText.GetComponentsInParent(true, s_DownHandlers);
#endif
                s_ClickHandlers.Remove(hyperText);
                s_DownHandlers.Remove(hyperText);
                if (s_ClickHandlers.Count > 0 || s_DownHandlers.Count > 0)
                {
                    using (ListPool <HyperText.LinkInfo> .Scope links = new ListPool <HyperText.LinkInfo> .Scope())
                    {
                        if (hyperText.GetLinks(links.List) > 0)
                        {
                            string warningMessage = getWarningMessage.Invoke(hyperText, null) as string;
                            if (!string.IsNullOrEmpty(warningMessage))
                            {
                                Debug.LogWarning(
                                    string.Format(
                                        "{0}\n<b>{1}</b> at {2}\n", warningMessage, hyperText.name, assetPath
                                        ), hyperText
                                    );
                            }
                        }
                    }
                }
            };
            AssetDatabaseX.ModifyAllComponentsInProject(validateRaycastTarget, undoName);
            HyperText.IsSilent = isSilent;
        }
Ejemplo n.º 13
0
 public static void CreateNewAssetInProject()
 {
     AssetDatabaseX.CreateNewAssetInCurrentProjectFolder <HyperTextStyles>();
 }
Ejemplo n.º 14
0
 public static void CreateNewAssetInProject()
 {
     AssetDatabaseX.CreateNewAssetInCurrentProjectFolder <LocalizableText>();
 }