Перейти к содержимому

Serializefield unity c что это

  • автор:

SerializeField

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Your name Your email Suggestion * Submit suggestion

Description

Force Unity to serialize a private field.

When Unity serializes your scripts, it only serializes public fields. If you also want Unity to serialize your private fields you can add the SerializeField attribute to those fields.

Unity serializes all your script components, reloads the new assemblies, and recreates your script components from the serialized versions. This serialization is done with an internal Unity serialization system; not with .NET’s serialization functionality.

The serialization system can do the following:

  • CAN serialize public non-static fields (of serializable types)
  • CAN serialize nonpublic non-static fields marked with the SerializeField attribute.
  • CANNOT serialize static fields.
  • CANNOT serialize properties.

Serializable types

Unity can serialize fields of the following types:

  • All classes inheriting from UnityEngine.Object, for example GameObject, Component, MonoBehaviour, Texture2D, AnimationClip.
  • All basic data types, such as int, string, float, bool.
  • Some built-in types, such as Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect, LayerMask.
  • Arrays of a serializable type
  • Lists of a serializable type
  • Enums
  • Structs

For more information on serialization, see Script Serialization.

Note: If you put one element in a list (or array) twice, when the list gets serialized, you’ll get two copies of that element, instead of one copy being in the new list twice.

Note: If you want to serialize a custom Struct field, you must give the Struct the [System.Serializable] attribute.

Hint: Unity won’t serialize Dictionary, however you could store a List<> for keys and a List<> for values. See ISerializationCallbackReceiver for an example.

using UnityEngine;

public class SomePerson : MonoBehaviour < //This field gets serialized because it is public. public string firstName = "John";

//This field does not get serialized because it is private. private int age = 40;

//This field gets serialized even though it is private //because it has the SerializeField attribute applied. [SerializeField] private bool hasHealthPotion = true;

void Start() < if (hasHealthPotion) Debug.Log("Person's first name: " + firstName + " Person's age: " + age); > >

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2024 Unity Technologies. Publication Date: 2024-01-05.

Атрибут Unity [SerializeField]

Добрый день, понимаю, что по-поводу этого атрибута в сети много статей и информации в целом, однако я не понял одного момента и поэтому я хотел бы его прояснить.
Этот атрибут делает переменные видимыми в редакторе, ну в основном его только для этого и используют. Однако понятие сериализация переводится как «перевести в биты» и я либо чего-то не понимаю, либо как перевод в биты влияет на то, что переменные начинают показываться в редакторе?

#1
23:19, 4 апр 2018

Сериализация — это перевод в биты. Эти биты нужно где-то хранить, например на диске. В юнити это работает примерно так: данные записываются на диск и в случае необходимости могут быть изменены И эти изменения сохраняются снова на диске (если это не playMode). На сколько я понимаю, редактор юнити отображает только сериализованные данные, по это причине их и сериализуют.

#2
0:30, 5 апр 2018

Да, Unity показывает в стандартном инспекторе только те поля, которые сериализирует.

Сериализацию можно понимать как процесс приведения кучи разнотипных данных к какому-то единому виду (перевести в поток битов/байтов, в xml, в json, ещё во что-нибудь), для того чтобы куда-то записать/сохранить или передать по сети. Потом над полученным потоком данных можно провести обратное действие — десериализацию — и получить назад данные в исходном виде.

По умолчанию Unity сериализирует только public поля. Если хочется, чтобы сериализировались поля и с другими модификаторами доступа, надо таким полям добавлять атрибут SerializeField.

1. Ты меняешь что-то в коде.
2. Unity перекомпилирует код.
3. Сериализирует всё что может и сохраняет полученные данные на диск.
4. Выгружает старый работающий код.
5. Загружает только что скомпилированный новый код.
6. Десериализирует сохранённые на диске данные и восстанавливает старые значения полей у всех компонентов.

1. Ты нажимаешь Play.
2. Unity сериализирует всё что может и сохраняет данные на диск.
3. В режиме Play меняешь значения каких-то полей или они меняются сами программно.
4. Нажимаешь Stop.
5. Unity десериализирует сохранённые данные и восстанавливает старые значения полей, как они были до нажатия на Play.

Для своих компонентов можно написать свой инспектор, который будет показывать любые поля; но просто у тех полей, которые в Unity не сериализируются, значения будут обнуляться после каждой перекомпиляции кода или выхода из режима Play. Это будет неинтуитивно и неудобно, поэтому логично, что такие поля Unity просто не показывает в инспекторе.

#3 – Базовые концепции скриптов в Unity

#3 – Базовые концепции скриптов в Unity

В уроке мы рассмотрим базовые концепции при работе с C# скриптами в Unity. Вы научитесь выводить информацию в консоль и ознакомитесь с использованием и отображением переменных и массивов в Юнити.

Видеоурок

В базовом плане язык C# в Юнити ничем не отличается в от языка C# вне Unity. Вы точно так же можете создавать переменные, циклы, условия и прочие стандартные концепции языка.

В уроке мы рассмотрели множество стандартных примеров по использованию языка. Дополнительно были рассмотрены модификаторы: NonSerialized и SerializeField. Рассмотрим их детальнее:

  • NonSerialized – указывает что поле с типом public не будет показано в Unity;
  • SerializeField – указывает что поле с типом private будет показано в Unity.

Базовый функционал

using UnityEngine; using System; using System.Collections; using System.Collections.Generic; public class Basics : MonoBehaviour < [NonSerialized] public int _num = 5; public string word; [SerializeField] private float nums; public int[] numbers = new int[3]; public Listwords = new List(); void Start() < if (_num != 5) Debug.Log(word + nums); Info(); >void Info() < >>

Задание к уроку

Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца

Рекомендации по написанию кода — MRTK2

В этом документе описываются принципы программирования и соглашения, которые следует соблюдать при участии в MRTK.

Философия

Будьте лаконичными и стремитесь к простоте

Самое простое решение часто является лучшим. Это является переопределяющей целью этих рекомендаций и должно быть целью всех действий по программированию. Часть простоты заключается в том, чтобы быть кратким и согласованным с существующим кодом. Старайтесь упростить код.

Читатели должны сталкиваться только с артефактами, предоставляющими полезную информацию. Например, комментарии, в которые переиздается очевидное, не предоставляют дополнительных сведений и повышают отношение шума к сигналу.

Используйте простую логику кода. Обратите внимание, что речь идет не об использовании наименьшего числа строк, сведении к минимуму размера имен идентификаторов или стиля фигурных скобок, а об уменьшении числа понятий и максимальном увеличении видимости этих строк с помощью знакомых шаблонов.

Создание согласованного и удобочитаемого кода

Удобочитаемость кода связана с низким уровнем дефектов. Старайтесь создавать удобный для чтения код. Старайтесь создавать код, который имеет простую логику и повторно использует существующие компоненты, так как это также поможет обеспечить правильность.

Все сведения о коде, который вы создаете, имеют значение, от самых основных деталей правильности до согласованного стиля и форматирования. Поддерживайте стиль написания кода в соответствии с уже имеющимся, даже если он не соответствует вашим предпочтениям. Это повышает удобочитаемость общей базы кода.

Поддержка настройки компонентов как в редакторе, так и во время выполнения

MRTK поддерживает разнообразный набор пользователей : пользователей, которые предпочитают настраивать компоненты в редакторе Unity и загружать заготовки, и людей, которым необходимо создавать экземпляры и настраивать объекты во время выполнения.

Весь код должен работать путем добавления компонента в GameObject в сохраненной сцене и путем создания экземпляра этого компонента в коде. Тесты должны включать тестовый случай как для создания заготовок, так и для создания экземпляров, настраивая компонент во время выполнения.

Игра в редакторе — это ваша первая и основная целевая платформа

Воспроизведение в редакторе — это самый быстрый способ итерации в Unity. Предоставление нашим клиентам способов быстрой итерации позволяет им быстрее разрабатывать решения и пробовать больше идей. Другими словами, максимизация скорости итерации позволяет нашим клиентам достичь большего.

Сделайте все, чтобы все работало в редакторе, а затем — на любой другой платформе. Работайте в редакторе. В play-In-Editor легко добавить новую платформу. Если приложение работает только на устройстве, очень сложно обеспечить работу редактора.

Добавление новых открытых полей, свойств, методов и сериализованных частных полей с осторожностью

Каждый раз, когда вы добавляете открытый метод, поле или свойство, оно становится частью общедоступной области API MRTK. Частные поля, помеченные параметром , [SerializeField] также предоставляют поля редактору и являются частью общедоступной области API. Другие пользователи могут использовать этот общедоступный метод, настраивать пользовательские заготовки с помощью вашего открытого поля и принимать от него зависимость.

Следует тщательно изучить новых членов общественности. В будущем необходимо будет поддерживать любое открытое поле. Помните, что если тип открытого поля (или сериализованного закрытого поля) изменяется или удаляется из MonoBehaviour, это может нарушить поведение других пользователей. Поле сначала должно быть нерекомендуемо для выпуска, а для переноса изменений для людей, которые приняли зависимости, потребуется предоставить код.

Определение приоритетов при написании тестов

MRTK — это проект сообщества, измененный различными участниками. Эти участники могут не знать сведения об исправлении ошибки или функции и случайно нарушить ее. MRTK выполняет непрерывные тесты интеграции перед выполнением каждого запроса на вытягивание. Изменения, которые прерывают тесты, не могут быть возвращены. Поэтому тесты — это лучший способ убедиться, что другие пользователи не нарушат вашу функцию.

Исправив ошибку, напишите тест, чтобы убедиться, что она не будет регрессировать в будущем. При добавлении функции напишите тесты, которые проверяют работоспособность функции. Это необходимо для всех функций пользовательского интерфейса, кроме экспериментальных.

Соглашения о написании кода на C#

Заголовки с информацией о лицензии сценария

Все сотрудники Корпорации Майкрософт, предоставляющие новые файлы, должны добавить следующий стандартный заголовок Лицензии в верхней части всех новых файлов, точно так, как показано ниже:

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. 

Сводные заголовки функций и методов

Все открытые классы, структуры, перечисления, функции, свойства, поля, размещенные в MRTK, должны быть описаны в соответствии с его назначением и использованием, точно так, как показано ниже:

/// /// The Controller definition defines the Controller as defined by the SDK / Unity. /// public struct Controller < /// /// The ID assigned to the Controller /// public string ID; > 

Это гарантирует правильное создание и распространение документации для всех классов, методов и свойств.

Все файлы сценариев, отправленные без соответствующих тегов сводных сведений, будут отклонены.

Правила пространства имен MRTK

Набор средств Смешанная реальность использует модель пространства имен на основе функций, где все базовые пространства имен начинаются с Microsoft.MixedReality.Toolkit. Как правило, не нужно указывать уровень набора средств (например, Core, Providers, Services) в пространствах имен.

В настоящее время определены следующие пространства имен:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Boundary
  • Microsoft.MixedReality.Toolkit.Diagnostics
  • Microsoft.MixedReality.Toolkit.Editor
  • Microsoft.MixedReality.Toolkit.Input
  • Microsoft.MixedReality.Toolkit.SpatialAwareness
  • Microsoft.MixedReality.Toolkit.Teleport
  • Microsoft.MixedReality.Toolkit.Utilities

Для пространств имен с большим количеством типов допустимо создать ограниченное количество вложенных пространств имен, чтобы упростить использование области.

Если пропустить пространство имен для интерфейса, класса или типа данных, изменение будет заблокировано.

Добавление новых скриптов MonoBehaviour

При добавлении новых скриптов MonoBehaviour с запросом на AddComponentMenu вытягивание убедитесь, что атрибут применяется ко всем применимым файлам. Это гарантирует, что компонент будет легко обнаруживать в редакторе под кнопкой Добавить компонент . Флаг атрибута не требуется, если компонент не может отображаться в редакторе, например в абстрактном классе.

В приведенном ниже примере в поле Пакет здесь должно быть указано расположение пакета компонента. При размещении элемента в папке MRTK/SDK пакет будет пакетом SDK.

[AddComponentMenu("Scripts/MRTK//MyNewComponent")] public class MyNewComponent : MonoBehaviour 

Добавление новых скриптов инспектора Unity

Как правило, старайтесь избегать создания пользовательских скриптов инспектора для компонентов MRTK. Это добавляет дополнительные издержки и управление базой кода, которую может обрабатывать подсистема Unity.

Если требуется класс inspector, попробуйте использовать класс Unity DrawDefaultInspector() . Это еще раз упрощает класс inspector и оставляет большую часть работы Unity.

public override void OnInspectorGUI() < // Do some custom calculations or checks // . DrawDefaultInspector(); >

Если в классе inspector требуется пользовательская отрисовка, попробуйте использовать SerializedProperty и EditorGUILayout.PropertyField . Это обеспечит правильную обработку Unity вложенных заготовок и измененных значений.

Если EditorGUILayout.PropertyField не удается использовать из-за требования в пользовательской логике, убедитесь, что все использование заключено в оболочку EditorGUI.PropertyScope . Это гарантирует, что Unity правильно отрисовывает инспектор для вложенных заготовок и измененных значений с заданным свойством.

Кроме того, попробуйте украсить пользовательский класс inspector с помощью CanEditMultipleObjects . Этот тег гарантирует, что несколько объектов с этим компонентом в сцене могут быть выбраны и изменены вместе. Любые новые классы инспектора должны проверять, работает ли их код в этой ситуации в сцене.

 // Example inspector class demonstrating usage of SerializedProperty & EditorGUILayout.PropertyField // as well as use of EditorGUI.PropertyScope for custom property logic [CustomEditor(typeof(MyComponent))] public class MyComponentInspector : UnityEditor.Editor < private SerializedProperty myProperty; private SerializedProperty handedness; protected virtual void OnEnable() < myProperty = serializedObject.FindProperty("myProperty"); handedness = serializedObject.FindProperty("handedness"); >public override void OnInspectorGUI() < EditorGUILayout.PropertyField(destroyOnSourceLost); Rect position = EditorGUILayout.GetControlRect(); var label = new GUIContent(handedness.displayName); using (new EditorGUI.PropertyScope(position, label, handedness)) < var currentHandedness = (Handedness)handedness.enumValueIndex; handedness.enumValueIndex = (int)(Handedness)EditorGUI.EnumPopup( position, label, currentHandedness, (value) =>< // This function is executed by Unity to determine if a possible enum value // is valid for selection in the editor view // In this case, only Handedness.Left and Handedness.Right can be selected return (Handedness)value == Handedness.Left || (Handedness)value == Handedness.Right; >); > > > 

Добавление новых объектов ScriptableObject

При добавлении новых скриптов ScriptableObject убедитесь, что CreateAssetMenu атрибут применяется ко всем применимым файлам. Это гарантирует, что компонент будет легко обнаруживать в редакторе с помощью меню создания ресурсов. Флаг атрибута не требуется, если компонент не может отображаться в редакторе, например в абстрактном классе.

В приведенном ниже примере вложенная папка должна быть заполнена вложенной папкой MRTK, если применимо. Если поместить элемент в папку MRTK/Providers , пакет будет поставщиком. При размещении элемента в папке MRTK/Core задайте для этого параметра значение «Профили».

В приведенном ниже примере myNewService | Если применимо, myNewProvider должен быть заполнен именем вашего нового класса. При размещении элемента в папке MixedRealityToolkit оставьте эту строку.

[CreateAssetMenu(fileName = "MyNewProfile", menuName = "Mixed Reality Toolkit///MyNewProfile")] public class MyNewProfile : ScriptableObject 

Ведение журнала

При добавлении новых компонентов или обновлении существующих функций рекомендуется добавить журналы DebugUtilities.LogVerbose в интересный код, который может быть полезен для дальнейшей отладки. Здесь есть компромисс между добавлением ведения журнала и добавленным шумом и недостаточным ведением журнала (что затрудняет диагностику).

Интересный пример, в котором полезно ведение журнала (наряду с интересными полезными данными):

DebugUtilities.LogVerboseFormat("RaiseSourceDetected: Source ID: , Source Type: ", source.SourceId, source.SourceType); 

Этот тип ведения журнала может помочь перехватывать такие проблемы, как https://github.com/microsoft/MixedRealityToolkit-Unity/issues/8016, которые были вызваны несовпадаемыми обнаруженными источниками и событиями потери источника.

Избегайте добавления журналов для данных и событий, происходящих на каждом кадре. В идеале ведение журнала должно охватывать «интересные» события, определяемые различными входными данными пользователя (т. е. «щелчок» пользователем и набор изменений и событий, которые возникают в журнале). Текущее состояние «пользователь по-прежнему держит жест», зарегистрированное в каждом кадре, не интересно и будет перегружено журналы.

Обратите внимание, что это подробное ведение журнала не включено по умолчанию (оно должно быть включено в параметрах системы диагностики).

Пробелы и вкладки

При участии в этом проекте используйте 4 пробела вместо вкладок.

Интервал

Не добавляйте дополнительные пробелы между квадратными скобками и скобками:

Не рекомендуется
private Foo()
Рекомендуется
private Foo()

Соглашения об именах

Всегда используйте PascalCase для свойств. Используется camelCase для большинства полей, за исключением использования PascalCase для static readonly полей и const . Единственным исключением из этого является структура данных, требующая сериализации полей с помощью JsonUtility .

Не рекомендуется
public string myProperty; //  
Рекомендуется
public string MyProperty; protected string MyProperty; private static readonly string MyField; private string myField; 

Модификаторы доступа

Всегда объявляйте модификатор доступа для всех полей, свойств и методов.

  • Все методы API Unity должны быть по умолчанию равны private , если их не нужно переопределять в производном классе. В этом случае следует использовать protected .
  • Поля всегда должны иметь значение private , с методами доступа к свойствам public или protected .
  • По возможности используйте элементы, воплощаемые в выражениях, и автоматические свойства
Не рекомендуется
// protected field should be private protected int myVariable = 0; // property should have protected setter public int MyVariable => myVariable; // No public / private access modifiers void Foo() < >void Bar()
Рекомендуется
public int MyVariable < get; protected set; >= 0; private void Foo() < >public void Bar() < >protected virtual void FooBar()

Использование фигурных скобок

Всегда используйте фигурные скобки после каждого блока операторов и поместите их на следующую строку.

Не рекомендуется
private Foo() < if (Bar==null) //
Не рекомендуется
private Foo() < //
Рекомендуется
private Foo() < if (Bar==true) < DoThing(); >else < DoTheOtherThing(); >> 

Открытые классы, структуры и перечисления должны находиться в собственных файлах.

Если класс, структуру или перечисление можно сделать частными, то их можно включить в тот же файл. Это позволяет избежать проблем с компиляцией с Unity и обеспечить правильную абстрагирование кода, а также сократить количество конфликтов и критических изменений при необходимости изменения кода.

Не рекомендуется
public class MyClass < public struct MyStruct() < >public enum MyEnumType() < >public class MyNestedClass() < >> 
Рекомендуется
 // Private references for use inside the class only public class MyClass < private struct MyStruct() < >private enum MyEnumType() < >private class MyNestedClass() < >> 
Рекомендуется
// Public Struct / Enum definitions for use in your class. Try to make them generic for reuse. public struct MyStruct
public enum MuEnumType < Value1, Value2 //
public class MyClass

Инициализация перечислений

Чтобы обеспечить правильную инициализацию всех перечислений, начиная с 0, .NET предоставляет аккуратный ярлык для автоматической инициализации перечисления, просто добавив первое (начальное) значение. (например, значение 1 = 0 оставшихся значений не требуется)

Не рекомендуется
public enum Value
Рекомендуется
public enum ValueType

Перечисления порядка для соответствующего расширения

Очень важно, чтобы если перечисление, скорее всего, будет расширено в будущем, чтобы упорядочить значения по умолчанию в верхней части перечисления, это гарантирует, что индексы Перечисления не будут затронуты новыми дополнениями.

Не рекомендуется
public enum SDKType
Рекомендуется
/// /// The SDKType lists the VR SDKs that are supported by the MRTK /// Initially, this lists proposed SDKs, not all may be implemented at this time (please see ReleaseNotes for more details) /// public enum SDKType < /// /// No specified type or Standalone / non-VR type /// None = 0, /// /// Undefined SDK. /// Other, /// /// The Windows 10 Mixed reality SDK provided by the Universal Windows Platform (UWP), for Immersive MR headsets and HoloLens. /// WindowsMR, /// /// The OpenVR platform provided by Unity (does not support the downloadable SteamVR SDK). /// OpenVR, /// /// The OpenXR platform. SDK to be determined once released. /// OpenXR > 

Проверка использования перечисления для битовых полей

Если существует возможность для перечисления требовать несколько состояний в качестве значения, например, Handedness = Left & Right. Затем перечисление необходимо правильно украсить с помощью BitFlags, чтобы обеспечить его правильное использование.

Файл Handedness.cs имеет конкретную реализацию для этого.

Не рекомендуется

public enum Handedness

Рекомендуется

[Flags] public enum Handedness

Жестко заданные пути к файлам

При создании путей к строковым файлам и, в частности, при написании жестко заданных строковых путей выполните следующие действия.

  1. По возможности используйте API C# Path , например Path.Combine или Path.GetFullPath .
  2. Используйте / или Path.DirectorySeparatorChar вместо \ или \\.

Эти действия гарантируют, что MRTK работает в системах Windows и Unix.

Не рекомендуется

private const string FilePath = "MyPath\\to\\a\\file.txt"; private const string OtherFilePath = "MyPath\to\a\file.txt"; string filePath = myVarRootPath + myRelativePath; 

Рекомендуется

private const string FilePath = "MyPath/to/a/file.txt"; private const string OtherFilePath = "folderfile.txt"; string filePath = Path.Combine(myVarRootPath,myRelativePath); // Path.GetFullPath() will return the full length path of provided with correct system directory separators string cleanedFilePath = Path.GetFullPath(unknownSourceFilePath); 

Рекомендации, включая рекомендации по Unity

Для некоторых целевых платформ этого проекта необходимо учитывать производительность. Учитывая это, всегда будьте осторожны при выделении памяти в часто вызываемом коде в жестких циклах обновления или алгоритмах.

Инкапсуляция

Всегда используйте частные поля и открытые свойства, если доступ к полю требуется извне класса или структуры. Не забудьте разместить частное поле и открытое свойство вместе. Это упрощает краткое представление о том, что поддерживает свойство и что поле можно изменить с помощью скрипта.

Единственным исключением из этого является структура данных, для которой требуется сериализация полей в JsonUtility , где для сериализации должны быть открыты все поля класса.

Не рекомендуется
private float myValue1; private float myValue2; public float MyValue1 < get< return myValue1; >set < myValue1 = value >> public float MyValue2 < get< return myValue2; >set < myValue2 = value >> 
Рекомендуется
// Enable field to be configurable in the editor and available externally to other scripts (field is correctly serialized in Unity) [SerializeField] [ToolTip("If using a tooltip, the text should match the public property's summary documentation, if appropriate.")] private float myValue; // /// If using a tooltip, the text should match the public property's summary documentation, if appropriate. /// public float MyValue < get =>myValue; set => myValue = value; > /// /// Getter/Setters not wrapping a value directly should contain documentation comments just as public functions would /// public float AbsMyValue < get < if (MyValue < 0) < return -MyValue; >return MyValue > > 

Кэширование значений и их сериализация в сцене или заготовке, когда это возможно

С учетом HoloLens лучше оптимизировать для максимальной производительности и помещать в кэш ссылки в сцене или заготовке, чтобы ограничить выделение памяти во время выполнения.

Не рекомендуется
void Update() < gameObject.GetComponent().Foo(Bar); > 
Рекомендуется
[SerializeField] // To enable setting the reference in the inspector. private Renderer myRenderer; private void Awake() < // If you didn't set it in the inspector, then we cache it on awake. if (myRenderer == null) < myRenderer = gameObject.GetComponent(); > > private void Update()

Кэшировать ссылки на материалы, не вызывайте .material каждый раз

Unity будет создавать новый материал каждый раз при использовании ".material", что приведет к утечке памяти при неправильной очистке.

Не рекомендуется
public class MyClass < void Update() < Material myMaterial = GetComponent().material; myMaterial.SetColor("_Color", Color.White); > > 
Рекомендуется
// Private references for use inside the class only public class MyClass < private Material cachedMaterial; private void Awake() < cachedMaterial = GetComponent().material; > void Update() < cachedMaterial.SetColor("_Color", Color.White); >private void OnDestroy() < Destroy(cachedMaterial); >> 

Кроме того, можно использовать свойство Unity под названием SharedMaterial, которое не создает новый материал при каждом обращении.

Используйте зависимую от платформы компиляцию, чтобы набор средств не нарушал сборку на другой платформе

  • Используйте WINDOWS_UWP , чтобы использовать API, относящихся к UWP и не относящимся к Unity. Это предотвратит попытку запуска в редакторе или на неподдерживаемых платформах. Это эквивалентно UNITY_WSA && !UNITY_EDITOR и следует использовать в пользу .
  • Используйте UNITY_WSA , чтобы использовать API Unity, зависящие от UWP, например пространство имен UnityEngine.XR.WSA . Эта функция будет выполняться в редакторе, когда платформа имеет значение UWP, а также во встроенных приложениях UWP.

Эта таблица поможет вам выбрать нужный вариант #if в зависимости от ваших сценариев использования и ожидаемых параметров сборки.

Платформа UWP IL2CPP UWP .NET Редактор
UNITY_EDITOR False False True
UNITY_WSA True True True
WINDOWS_UWP True True False
UNITY_WSA && !UNITY_EDITOR True True False
ENABLE_WINMD_SUPPORT True True Неверно
NETFX_CORE False True False

Предпочитайте использовать DateTime.UtcNow вместо DateTime.Now

DateTime.UtcNow работает быстрее, чем DateTime.Now. В предыдущем исследовании производительности мы обнаружили, что использование DateTime.Now значительно влияет на производительность, особенно при использовании в цикле Update(). Другие пользователи столкнулись с той же проблемой.

Используйте DateTime.UtcNow, если только вам не требуется локализованное время (согласно требованиям законодательства может понадобиться отобразить текущее время в часовом поясе пользователя). Если вы работаете с относительным временем (т. е. разницей между последним обновлением и сейчас), лучше использовать DateTime.UtcNow, чтобы избежать издержек при преобразовании часового пояса.

Соглашения о написании кода PowerShell

Подмножество базы кода MRTK использует PowerShell для инфраструктуры конвейера, а также различных скриптов и служебных программ. Новый код PowerShell должен соответствовать стилю PoshCode.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *