PreserveAttribute 阻止字节码剥离移除类、方法、字段或属性。
创建构建时,Unity 会尝试从您的项目中剥离未使用的代码。这对获得较小的构建很有帮助。但是,有时您希望某些代码不被剥离,即使它看起来没有被使用。例如,如果您使用反射调用方法或实例化某个类的对象,就会发生这种情况。您可以将 [Preserve] 属性应用于类、方法、字段和属性。除了使用 PreserveAttribute,您还可以使用 link.xml 文件的传统方法来告诉链接器不要移除这些内容。PreserveAttribute 和 link.xml 对 Mono 和 IL2CPP 脚本后端都有效。
有关 [Preserve] 和 link.xml 的更多详细信息,请参阅 托管代码剥离
using UnityEngine; using System.Collections; using System.Reflection; using UnityEngine.Scripting;
public class NewBehaviourScript : MonoBehaviour { void Start() { ReflectionExample.InvokeBoinkByReflection(); } }
public class ReflectionExample { static public void InvokeBoinkByReflection() { typeof(ReflectionExample).GetMethod("Boink", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null); }
// No other code directly references the Boink method, so when when stripping is enabled, // it will be removed unless the [Preserve] attribute is applied. [Preserve] static void Boink() { Debug.Log("Boink"); } }
对于不想依赖 UnityEngine.dll 的第三方库,也可以定义自己的 PreserveAttribute。代码剥离器也会尊重这一点,它会将任何具有完全名称“PreserveAttribute”的属性视为不剥离其应用对象的理由,无论该属性的命名空间或程序集是什么。