summaryrefslogtreecommitdiff
path: root/VRCSDK3Worlds/Assets/VRWorldToolkit/Scripts/Editor/DisableOnBuildManager.cs
blob: 0d89c073fd40025b26769d817c73027b49f0d467 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#if VRC_SDK_VRCSDK2 || VRC_SDK_VRCSDK3
using VRC.SDKBase.Editor.BuildPipeline;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace VRWorldToolkit
{
    public class DisableOnBuildCallback : IVRCSDKBuildRequestedCallback
    {
        public int callbackOrder => 1;

        public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType)
        {
            DisableOnBuildManager.ToggleObjectsUsingTag("DisableOnBuild", false, false);
            DisableOnBuildManager.ToggleObjectsUsingTag("EnableOnBuild", true, false);

            return true;
        }
    }

    public class DisableOnBuildManager : Editor
    {
        // Disable On Build
        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Setup", false, 2)]
        private static void DisableOnBuildSetup()
        {
            if (EditorUtility.DisplayDialog("Setup Disable On Build", "This setup will add a new tag DisableOnBuild. Assigning this tag to a GameObject will disable it before a build happens.", "Setup", "Cancel"))
            {
                TagHelper.AddTag("DisableOnBuild");
            }
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Setup", true)]
        private static bool DisableOnBuildSetupValidate()
        {
            return !TagHelper.TagExists("DisableOnBuild");
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Disable Objects", false, 13)]
        private static void DisableDisableObjectsLoop()
        {
            ToggleObjectsUsingTag("DisableOnBuild", false, true);
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Disable Objects", true)]
        private static bool DisableDisableObjectsValidate()
        {
            return TagHelper.TagExists("DisableOnBuild");
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Enable Objects", false, 14)]
        private static void EnableDisableObjectsLoop()
        {
            ToggleObjectsUsingTag("DisableOnBuild", true, true);
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Enable Objects", true)]
        private static bool EnableObjectsLoopValidate()
        {
            return TagHelper.TagExists("DisableOnBuild");
        }

        // Enable On Build
        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Setup", false, 13)]
        private static void EnableOnBuildSetup()
        {
            if (EditorUtility.DisplayDialog("Setup Enable On Build", "This setup will add a new tag EnableOnBuild. Assigning this tag to a GameObject will enable it before a build happens.", "Setup", "Cancel"))
            {
                TagHelper.AddTag("EnableOnBuild");
            }
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Setup", true)]
        private static bool EnableOnBuildSetupValidate()
        {
            return !TagHelper.TagExists("EnableOnBuild");
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Disable Objects", false, 24)]
        private static void DisableEnableObjectsLoop()
        {
            ToggleObjectsUsingTag("EnableOnBuild", false, true);
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Disable Objects", true)]
        private static bool DisableEnableObjectsValidate()
        {
            return TagHelper.TagExists("EnableOnBuild");
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Enable Objects", false, 25)]
        private static void EnableEnableObjectsLoop()
        {
            ToggleObjectsUsingTag("EnableOnBuild", true, true);
        }

        [MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Enable Objects", true)]
        private static bool EnableEnableObjectsLoopValidate()
        {
            return TagHelper.TagExists("EnableOnBuild");
        }

        public static void ToggleObjectsUsingTag(string tag, bool active, bool markSceneDirty)
        {
            if (!TagHelper.TagExists(tag)) return;

            var toggledGameObjectCount = 0;
            var allGameObjects = Resources.FindObjectsOfTypeAll(typeof(GameObject));
            var allGameObjectsLength = allGameObjects.Length;
            for (var i = 0; i < allGameObjectsLength; i++)
            {
                var gameObject = allGameObjects[i] as GameObject;

                if (gameObject.hideFlags != HideFlags.None || EditorUtility.IsPersistent(gameObject.transform.root.gameObject)) continue;

                if (gameObject.CompareTag(tag))
                {
                    gameObject.SetActive(active);
                    toggledGameObjectCount++;
                }
            }

            var state = active ? "active" : "inactive";
            var plural = toggledGameObjectCount > 1 ? "s" : "";
            Debug.Log($"Set {toggledGameObjectCount} GameObject{plural} in Scene with tag {tag} to be {state}");
            if (markSceneDirty) EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());
        }
    }
}
#endif