#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]]
使能 自定义宏 逻辑参考
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;
}
取消使能 自定义宏
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控制开关,逻辑参考
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