diff options
author | chai <215380520@qq.com> | 2024-05-23 10:08:29 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-05-23 10:08:29 +0800 |
commit | 8722a9920c1f6119bf6e769cba270e63097f8e25 (patch) | |
tree | 2eaf9865de7fb1404546de4a4296553d8f68cc3b /Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs | |
parent | 3ba4020b69e5971bb0df7ee08b31d10ea4d01937 (diff) |
+ astar project
Diffstat (limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs')
-rw-r--r-- | Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs new file mode 100644 index 0000000..e3f1666 --- /dev/null +++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/PackageTools/Editor/OptimizationHandler.cs @@ -0,0 +1,164 @@ +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; + +namespace Pathfinding { + /// <summary> + /// Helper for enabling or disabling compiler directives. + /// Used only in the editor. + /// </summary> + public static class OptimizationHandler { + public class DefineDefinition { + public string name; + public string description; + public bool enabled; + public bool consistent; + } + + /// <summary> + /// Various build targets that Unity have deprecated. + /// There is apparently no way to figure out which these are without hard coding them. + /// </summary> + static readonly BuildTargetGroup[] deprecatedBuildTargets = new BuildTargetGroup[] { + BuildTargetGroup.Unknown, +#if UNITY_5_4_OR_NEWER + (BuildTargetGroup)16, /* BlackBerry */ +#endif +#if UNITY_5_5_OR_NEWER + (BuildTargetGroup)5, /* PS3 */ + (BuildTargetGroup)6, /* XBox360 */ + (BuildTargetGroup)15, /* WP8 */ +#endif +#if UNITY_2017_4_OR_NEWER + (BuildTargetGroup)2, /* WebPlayer */ + (BuildTargetGroup)20, /* PSM */ +#endif +#if UNITY_2018_1_OR_NEWER + (BuildTargetGroup)22, /* SamsungTV */ + (BuildTargetGroup)24, /* WiiU */ +#endif +#if UNITY_2018_2_OR_NEWER + (BuildTargetGroup)17, /* Tizen */ +#endif +#if UNITY_2018_3_OR_NEWER + (BuildTargetGroup)18, /* PSP2 */ + (BuildTargetGroup)23, /* Nintendo3DS */ +#endif + }; + + static string GetPackageRootDirectory () { + var rootDir = EditorResourceHelper.editorAssets + "/../../"; + + return rootDir; + } + + static Dictionary<BuildTargetGroup, List<string> > GetDefineSymbols () { + var result = new Dictionary<BuildTargetGroup, List<string> >(); + + var nonDeprecatedBuildTypes = typeof(BuildTargetGroup) + .GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) + .Where(fieldInfo => fieldInfo.GetCustomAttributes(typeof(System.ObsoleteAttribute), false).Length == 0) + .Select(fieldInfo => (BuildTargetGroup)fieldInfo.GetValue(null)).ToArray(); + + for (int i = 0; i < nonDeprecatedBuildTypes.Length; i++) { + // Kept for compatibility with older versions of Unity which did not always accurately add Obsolete attributes + // (in particular Unity 2017.4 seems to miss marking the PSM build target as obsolete, the other ones seem accurate) + if (deprecatedBuildTargets.Contains(nonDeprecatedBuildTypes[i])) continue; + +#if UNITY_2021_3_OR_NEWER + PlayerSettings.GetScriptingDefineSymbols(UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(nonDeprecatedBuildTypes[i]), out var defines); +#else + string defineString = PlayerSettings.GetScriptingDefineSymbolsForGroup(nonDeprecatedBuildTypes[i]); + if (defineString == null) continue; + + var defines = defineString.Split(';').Select(s => s.Trim()); +#endif + result[nonDeprecatedBuildTypes[i]] = defines.ToList(); + } + return result; + } + + static void SetDefineSymbols (Dictionary<BuildTargetGroup, List<string> > symbols) { + foreach (var pair in symbols) { +#if UNITY_2021_3_OR_NEWER + string[] symbolsArr = pair.Value.Distinct().ToArray(); + PlayerSettings.SetScriptingDefineSymbols(UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(pair.Key), symbolsArr); +#else + var defineString = string.Join(";", pair.Value.Distinct().ToArray()); + PlayerSettings.SetScriptingDefineSymbolsForGroup(pair.Key, defineString); +#endif + } + } + + public static void EnableDefine (string name) { + name = name.Trim(); + var newSymbols = GetDefineSymbols().ToDictionary(pair => pair.Key, pair => { + pair.Value.Add(name); + return pair.Value; + }); + SetDefineSymbols(newSymbols); + } + + public static void DisableDefine (string name) { + name = name.Trim(); + var newSymbols = GetDefineSymbols().ToDictionary(pair => pair.Key, pair => { + pair.Value.Remove(name); + return pair.Value; + }); + SetDefineSymbols(newSymbols); + } + + public static void IsDefineEnabled (string name, out bool enabled, out bool consistent) { + name = name.Trim(); + int foundEnabled = 0; + int foundDisabled = 0; + + foreach (var pair in GetDefineSymbols()) { + if (pair.Value.Contains(name)) { + foundEnabled++; + } else { + foundDisabled++; + } + } + + enabled = foundEnabled > foundDisabled; + consistent = (foundEnabled > 0) != (foundDisabled > 0); + } + + public static List<DefineDefinition> FindDefines () { + var path = GetPackageRootDirectory()+"/defines.csv"; + + if (File.Exists(path)) { + // Read a file consisting of lines with the format + // NAME;Description + // Ignore empty lines and lines which do not contain exactly 1 ';' + var definePairs = File.ReadAllLines(path) + .Select(line => line.Trim()) + .Where(line => line.Length > 0) + .Select(line => line.Split(';')) + .Where(opts => opts.Length == 2); + + return definePairs.Select(opts => { + var def = new DefineDefinition { name = opts[0].Trim(), description = opts[1].Trim() }; + IsDefineEnabled(def.name, out def.enabled, out def.consistent); + return def; + }).ToList(); + } + + Debug.LogError("Could not find file '"+path+"'"); + return new List<DefineDefinition>(); + } + + public static void ApplyDefines (List<DefineDefinition> defines) { + foreach (var define in defines) { + if (define.enabled) { + EnableDefine(define.name); + } else { + DisableDefine(define.name); + } + } + } + } +} |