Files
Silly-Home/Packages/dev.onevr.vrworldtoolkit/Editor/DisableOnBuildManager.cs
2026-06-07 16:58:24 +01:00

140 lines
5.4 KiB
C#

#if VRC_SDK_VRCSDK3
using VRC.SDKBase.Editor.BuildPipeline;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
namespace VRWorldToolkit.Editor
{
public class DisableOnBuildCallback : IVRCSDKBuildRequestedCallback, IProcessSceneWithReport
{
public int callbackOrder => 1;
public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType)
{
DisableOnBuildManager.ToggleObjectsUsingTag("DisableOnBuild", false, false);
DisableOnBuildManager.ToggleObjectsUsingTag("EnableOnBuild", true, false);
return true;
}
public void OnProcessScene(Scene scene, BuildReport report)
{
DisableOnBuildManager.ToggleObjectsUsingTag("DisableOnBuild", false, false);
DisableOnBuildManager.ToggleObjectsUsingTag("EnableOnBuild", true, false);
}
}
public class DisableOnBuildManager : UnityEditor.Editor
{
// Disable On Build
[MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Setup", false, 13)]
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"))
{
Helper.AddTag("DisableOnBuild");
}
}
[MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Setup", true)]
private static bool DisableOnBuildSetupValidate()
{
return !Helper.TagExists("DisableOnBuild");
}
[MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Disable Objects", false, 24)]
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 Helper.TagExists("DisableOnBuild");
}
[MenuItem("VRWorld Toolkit/On Build Functions/Disable On Build/Enable Objects", false, 25)]
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 Helper.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"))
{
Helper.AddTag("EnableOnBuild");
}
}
[MenuItem("VRWorld Toolkit/On Build Functions/Enable On Build/Setup", true)]
private static bool EnableOnBuildSetupValidate()
{
return !Helper.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 Helper.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 Helper.TagExists("EnableOnBuild");
}
public static void ToggleObjectsUsingTag(string tag, bool active, bool markSceneDirty)
{
if (!Helper.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