C# компилятор и ссылка на языковую версию
Эта версия Unity Editor использует следующую версию компилятора и языка C#:
- C# компилятор: Рослин
- C# языковая версия: C# 9.0
Редактор передает компилятору C# набор параметров по умолчанию. Чтобы передать дополнительные параметры в вашем проекте, см. Условная компиляция в Unity.
Сборка мусора
Unity использует Сборщик мусора Бёма — Демера — Вайзера для обоих Mono и IL2CPP скриптовые бэкэнды Дополнительные сведения о доступных режимах сбора мусора, их значении и способах переключения между ними см. в разделе Режимы сбора мусора.
Неподдерживаемые функции
C# 9.0
- Подавление выдачи флага localsinit
- Ковариантные типы возврата
- Инициализаторы модулей
- Расширяемые соглашения вызова для указателей неуправляемых функций
- Настройки только для инициализации
Если вы попытаетесь использовать неподдерживаемые функции в вашем проекте, компиляция генерирует ошибки.
Поддержка записи
C# 9 Поддержка init и record имеет несколько ограничений.
- Тип
System.Runtime.CompilerServices.IsExternalInitтребуется для полной поддержки записей, так как он использует только init setters, но доступен только в .NET 5 и более поздних версиях (которые Unity не поддерживает). Пользователи могут обойти эту проблему, объявив типSystem.Runtime.CompilerServices.IsExternalInitв своих собственных проектах. - Вы не должны использовать записи C# в сериализированных типах, потому что система сериализации Unity не поддерживает записи C#.
Поддержка неуправляемого указателя функции
Unity поддерживает указатели на неуправляемые функции, как это было введено в C# 9, но не поддерживает расширяемые соглашения вызова. В следующем примере кода приведена более подробная информация о том, как правильно использовать указатели на неуправляемые функции.
Следующие примерные цели Windows платформы и требует Разрешить «небезопасный» код для включения Настройки ИгрокаЧтобы включить его, перейдите по ссылке: Project Настройки > Игрок. Развернуть Другие настройки панели, перейти к Компиляция сценариев Для получения дополнительной информации о C#’s unsafe контекст, см. Microsoft’s unsafe (C# Справочная документация или Документация Майкрософт о небезопасном коде, типах указателей и указателях функций.
using System;
using System.Runtime.InteropServices;
using UnityEngine;
public class UnmanagedFunctionPointers : MonoBehaviour
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpLibFileName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
// You must enable "Allow 'unsafe' code" in the Player Settings
unsafe void Start()
{
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
// This example is only valid on Windows
// Get a pointer to an unmanaged function
IntPtr kernel32 = LoadLibrary("kernel32.dll");
IntPtr getCurrentThreadId = GetProcAddress(kernel32, "GetCurrentThreadId");
// The unmanaged calling convention
delegate* unmanaged[Stdcall]<UInt32> getCurrentThreadIdUnmanagedStdcall = (delegate* unmanaged[Stdcall]<UInt32>)getCurrentThreadId;
Debug.Log(getCurrentThreadIdUnmanagedStdcall());
#endif
}
}