Unity 6.3
0 онлайн 67 гостей 3 в системе
Вход

PreserveAttribute

класс в UnityEngine.Scripting

Выполнено в:UnityEngine.CoreModule

Описание

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" как причину не удалять то, к чему он применяется, независимо от пространства имен или сборки атрибута.