unity怎么自定义宏.md 4.0 KB

#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

		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

		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

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