// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved.
// This code can only be used under the standard Unity Asset Store End User License Agreement
// A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms
using System;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEditor;
using UnityEditor.Build;
using UnityEngine;
// ReSharper disable MemberCanBePrivate.Global
namespace Doozy.Editor.Common.Utils
{
public static class DefineSymbolsUtils
{
private static readonly StringBuilder StringBuilderContainer = new StringBuilder();
/// Add the passed global define if it's not already present
public static void AddGlobalDefine(string id)
{
bool flag = false;
int num = 0;
#if UNITY_2023_1_OR_NEWER
foreach (BuildTargetGroup buildTargetGroup in (BuildTargetGroup[]) Enum.GetValues(typeof(BuildTargetGroup)))
if (IsValidBuildTargetGroup(buildTargetGroup))
{
var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
string defineSymbolsForGroup = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
if (Array.IndexOf(defineSymbolsForGroup.Split(';'), id) != -1) continue;
flag = true;
++num;
string defines = defineSymbolsForGroup + (defineSymbolsForGroup.Length > 0 ? ";" + id : id);
PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, defines);
}
#else
foreach (BuildTargetGroup buildTargetGroup in (BuildTargetGroup[]) Enum.GetValues(typeof(BuildTargetGroup)))
if (IsValidBuildTargetGroup(buildTargetGroup))
{
string defineSymbolsForGroup = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);
if (Array.IndexOf(defineSymbolsForGroup.Split(';'), id) != -1) continue;
flag = true;
++num;
string defines = defineSymbolsForGroup + (defineSymbolsForGroup.Length > 0 ? ";" + id : id);
PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines);
}
#endif
if (!flag) return;
Debug.Log($"Added global define \"{id}\" to {num} BuildTargetGroups");
}
/// Remove the passed global define if it's present
public static void RemoveGlobalDefine(string id)
{
bool flag = false;
int num = 0;
#if UNITY_2023_1_OR_NEWER
foreach (BuildTargetGroup buildTargetGroup in (BuildTargetGroup[])Enum.GetValues(typeof(BuildTargetGroup)))
if (IsValidBuildTargetGroup(buildTargetGroup))
{
var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
string[] array = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget).Split(';');
if (Array.IndexOf(array, id) == -1) continue;
flag = true;
++num;
StringBuilderContainer.Length = 0;
foreach (string t in array)
if (t != id)
{
if (StringBuilderContainer.Length > 0) StringBuilderContainer.Append(';');
StringBuilderContainer.Append(t);
}
PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, StringBuilderContainer.ToString());
}
#else
foreach (BuildTargetGroup buildTargetGroup in (BuildTargetGroup[])Enum.GetValues(typeof(BuildTargetGroup)))
if (IsValidBuildTargetGroup(buildTargetGroup))
{
string[] array = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup).Split(';');
if (Array.IndexOf(array, id) == -1) continue;
flag = true;
++num;
StringBuilderContainer.Length = 0;
foreach (string t in array)
if (t != id)
{
if (StringBuilderContainer.Length > 0) StringBuilderContainer.Append(';');
StringBuilderContainer.Append(t);
}
PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, StringBuilderContainer.ToString());
}
#endif
StringBuilderContainer.Length = 0;
if (!flag) return;
Debug.Log($"Removed global define \"{id}\" from {num} BuildTargetGroups");
}
///
/// Returns TRUE if the given global define is present in all the
/// or only in the given , depending on passed parameters.
///
///
///
/// to use. Leave NULL to check in all of them.
public static bool HasGlobalDefine(string id, BuildTargetGroup? buildTargetGroup = null)
{
BuildTargetGroup[] buildTargetGroupArray = buildTargetGroup.HasValue ? new[] { buildTargetGroup.Value } : (BuildTargetGroup[])Enum.GetValues(typeof(BuildTargetGroup));
foreach (BuildTargetGroup btg in buildTargetGroupArray.Where(IsValidBuildTargetGroup))
{
#if UNITY_2023_1_OR_NEWER
if (Array.IndexOf(PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(btg)).Split(';'), id) != -1)
return true;
#else
if (Array.IndexOf(PlayerSettings.GetScriptingDefineSymbolsForGroup(btg).Split(';'), id) != -1)
return true;
#endif
}
return false;
}
private static bool IsValidBuildTargetGroup(BuildTargetGroup group)
{
if (group == BuildTargetGroup.Unknown) return false;
var unityEditorModuleManagerType = Type.GetType("UnityEditor.Modules.ModuleManager, UnityEditor.dll");
if (unityEditorModuleManagerType == null) return true;
MethodInfo method1 = unityEditorModuleManagerType.GetMethod("GetTargetStringFromBuildTargetGroup", BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo method2 = typeof(PlayerSettings).GetMethod("GetPlatformName", BindingFlags.Static | BindingFlags.NonPublic);
object[] parameters = new object[] { group };
if (method1 == null) return true;
string str1 = (string)method1.Invoke(null, parameters);
if (method2 == null) return true;
string str2 = (string)method2.Invoke(null, new object[] { group });
if (string.IsNullOrEmpty(str1)) return !string.IsNullOrEmpty(str2);
return true;
}
private class SymbolsCleaner : AssetModificationProcessor
{
private static AssetDeleteResult OnWillDeleteAsset(string assetPath, RemoveAssetOptions options)
{
bool deletingDoozy = assetPath.Equals(EditorPath.path);
// Debug.Log("OnWillDeleteAsset");
// Debug.Log(assetPath);
// Debug.Log(DoozyPath.BasePath);
// Debug.Log("Deleting Doozy: " + deletingDoozy);
if (deletingDoozy)
{
RemoveGlobalDefine("INPUT_SYSTEM_PACKAGE");
RemoveGlobalDefine("LEGACY_INPUT_MANAGER");
}
return AssetDeleteResult.DidNotDelete;
}
}
}
}