Описание
PreserveAttribute предотвращает удаление класса, метода, поля или свойства при удалении байт-кода.
При создании сборки Unity попытается удалить неиспользуемый код из вашего проекта. Это здорово, чтобы получить небольшие сборки. Однако иногда вы хотите, чтобы какой-то код не удалялся, даже если он выглядит так, как будто он не используется. Это может произойти, например, если вы используете отражение для вызова метода или создаете экземпляр объекта определенного класса. Вы можете применить атрибут [Preserve] к классам, методам, полям и свойствам. В дополнение к использованию PreserveAttribute вы также можете использовать традиционный метод файла link.xml, чтобы указать компоновщику не удалять вещи. PreserveAttribute и link.xml работают как для сценариев Mono, так и для IL2CPP.
Дополнительные сведения о [Preserve] и link.xml см. Managed Code Stripping
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);
}
// Никакой другой код напрямую не ссылается на метод Boink, поэтому, когда включено удаление,
// он будет удален, если не применен атрибут [Preserve].
[Preserve]
static void Boink()
{
Debug.Log("Boink");
}
}
Для сторонних библиотек, которые не хотят зависеть от UnityEngine.dll, также можно определить собственный атрибут PreserveAttribute. Средство удаления кода также учтет это и будет рассматривать любой атрибут с точным именем "PreserveAttribute" как причину не удалять объект, к которому он применяется, независимо от пространства имен или сборки атрибута.