#unity/日常积累 在Unity中自定义宏,可以通过以下几种方法: ‌在PlayerSettings中设置‌: 打开PlayerSettings,找到Scripts Compilation部分。 在Scripting Define Symbols字段中添加自定义宏,多个宏之间用分号隔开。 ‌自定义脚本动态设置‌: 创建编辑器脚本,使用PlayerSettings.SetScriptingDefineSymbolsForGroup方法动态设置宏。 将脚本放置在Editor文件夹下,并通过菜单项或窗口调用。 ‌使用宏文件‌: 根据使用的.Net版本,在Assets目录下创建mcs.rsp(.Net3.5)或csc.rsp(.Net4.x)文件。 在文件中添加宏定义,如-define:UNITY_5X。 注意在每次修改宏文件后,需要重新编译Unity中的脚本。 通过以上方法,开发者可以在Unity中自定义宏,以便在代码中使用条件编译等特性。 自定义宏示例: ![[Pasted image 20241025094031.png]] 在代码中调用,示例 ![[Pasted image 20241025094439.png]] 使能 自定义宏 逻辑参考 ## EnableBuildDefine ``` cs public static bool EnableBuildDefine (string define) { bool wasDefineAdded = false; Debug.LogWarning("Please ignore errors \"PlayerSettings Validation: Requested build target group doesn't exist\" below"); foreach (BuildTargetGroup group in System.Enum.GetValues(typeof(BuildTargetGroup))) { if (IsInvalidGroup(group)) continue; string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group); if (!defines.Contains(define)) { wasDefineAdded = true; if (defines.EndsWith(";", System.StringComparison.Ordinal)) defines += define; else defines += ";" + define; PlayerSettings.SetScriptingDefineSymbolsForGroup(group, defines); } } Debug.LogWarning("Please ignore errors \"PlayerSettings Validation: Requested build target group doesn't exist\" above"); if (wasDefineAdded) { Debug.LogWarning("Setting Scripting Define Symbol " + define); } else { Debug.LogWarning("Already Set Scripting Define Symbol " + define); } return wasDefineAdded; } ``` 取消使能 自定义宏 ## DisableBuildDefine ``` cs public static bool DisableBuildDefine (string define) { bool wasDefineRemoved = false; foreach (BuildTargetGroup group in System.Enum.GetValues(typeof(BuildTargetGroup))) { if (IsInvalidGroup(group)) continue; string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group); if (defines.Contains(define)) { wasDefineRemoved = true; if (defines.Contains(define + ";")) defines = defines.Replace(define + ";", ""); else defines = defines.Replace(define, ""); PlayerSettings.SetScriptingDefineSymbolsForGroup(group, defines); } } if (wasDefineRemoved) { Debug.LogWarning("Removing Scripting Define Symbol " + define); } else { Debug.LogWarning("Already Removed Scripting Define Symbol " + define); } return wasDefineRemoved; } ``` 入口: ![[Pasted image 20241231163117.png]] 使用Toggle控制开关,逻辑参考 ## PCSpriteEditor ``` cs using System; using UnityEditor; using UnityEngine; #if UNITY_EDITOR public class PCSpriteEditor : EditorWindow { private static PCSpriteEditor _pcSpriteEditor; private const string PCSpriteKey = "PCSpriteKey"; private bool _isOpen; [MenuItem("HTFramework/是否开启 PC包本地图片替换", false)] public static void ShowPCSpriteEditorWindow() { if (!EditorPrefs.HasKey(PCSpriteKey)) { EditorPrefs.SetBool(PCSpriteKey,false); } _pcSpriteEditor = (PCSpriteEditor) GetWindowWithRect(typeof(PCSpriteEditor), new Rect(0, 0, 300, 100), false, "PC包本体图片替换 宏定义开关"); _pcSpriteEditor.Show(); } private void OnGUI() { EditorGUI.BeginChangeCheck(); _isOpen = EditorGUILayout.Toggle("是否开启自定义宏", EditorPrefs.GetBool(PCSpriteKey)); if (EditorGUI.EndChangeCheck()) { EditorPrefs.SetBool(PCSpriteKey,_isOpen); } } } #endif ```