Unity プロジェクトで C# ソース コードをコンパイルするために、Unity エディターは C# コンパイラーを使用します。
C# コンパイラー | C# 言語バージョン |
---|---|
Roslyn | C# 9.0 |
エディターはデフォルトの一揃いのオプションを C# コンパイラーに渡します。プロジェクトの追加のオプションを渡すには、プラットフォーム依存のコンパイル のドキュメントを参照してください。
サポートされない機能をプロジェクトで使用しようとすると、コンパイルでエラーが発生します。
C# 9 の init と record (レコード) のサポートには、いくつかの注意点があります。
System.Runtime.CompilerServices.IsExternalInit
型は init のみのセッターを使用するため、レコードの完全なサポートに必要ですが、.NET 5 以降 (Unity ではサポートなし) でのみ利用可能です。ユーザーは、自分のプロジェクトで System.Runtime.CompilerServices.IsExternalInit
型を宣言することによって、この問題を回避することができます。Unity は C# 9 で導入されたアンマネージ関数ポインターをサポートしていますが、拡張可能な呼び出し規則はサポートしていません。以下のサンプルコードでは、アンマネージ関数ポインターを正しく使用する方法について、より詳細な情報を提供します。
以下の例は Windows プ ラ ッ ト フ ォーム を対象 と し てお り、Player 設定 メニューで Allow ‘unsafe’ code を有効にする必要があります。C# の unsafe
コンテキストの詳細については、Microsoft の unsafe (C#リファレンス) のドキュメント または Microsoft の アンセーフ コード、ポインター型、関数ポインターのドキュメント を参照してください。
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
}
}