ネイティブコードでUnityスクリプトを作成できるライブラリ:C、C ++、アセンブリ。
このプロジェクトは、C#の実行可能な代替手段を提供することを目的としています。 C ++でのスクリプトは、すべてのプロジェクトのすべての部分に適していませんが、今ではオプションです。
C#コードの1行を変更するには、ゲームの新しいビルドを作成する必要があります。 IL2CPPが実行されなければならないため、典型的なAndroidビルド時間は少なくとも10分である傾向があり、その後、膨大な量のC ++をコンパイルする必要があります。
C ++を使用することにより、ゲームを約1秒でC ++プラグインとしてコンパイルし、プラグインをAPKに交換してから、すぐにゲームをインストールして実行できます。それは生産性が大きくなります!
C ++は、C#よりもはるかに迅速にコンパイルされます。 1つのファイルの変更(最も一般的なビルド)がC#よりも15倍高速になると、インクリメンタルビルドがビルドされます。より速いコンピレーションは、生産性の向上に時間とともに加算されます。繰り返しの時間を速くすることで、プログラミングの「フロー」にとどまることが容易になります。
Unityのゴミコレクターは必須であり、多くの問題があります。それは遅く、メインスレッドで走り、すべてのゴミを一度に集め、ヒープを断片化し、ヒープを縮まらないようにします。そのため、ゲームは「フレームヒッチ」を体験し、最終的にはメモリとクラッシュがなくなります。
GCを回避するにはかなりの努力が必要であり、結果のコードを維持し、遅くすることは困難です。これには、本質的にメモリ管理マニュアルを作成するオブジェクトプールなどの手法が含まれます。また、 intのようなボクシング値タイプを避けて、 objectなどの管理されたタイプから、一部の状況や他のさまざまなgotchasでは、 foreachループを使用しないようにする必要があります。
C ++には必要なガベージコレクターがなく、shared_ptrなどの「スマートポインター」タイプを介してオプションの自動メモリ管理を備えています。 Unityの原始的なゴミコレクターの優れた代替品を提供します。
一部の.NET APIを使用するにはまだガベージの作成が含まれますが、問題はすべてのコードの広範な問題ではなく、それらのAPIのみに含まれています。
C ++を直接使用することにより、CPUが実行するコードを完全に制御できます。 C#コンパイラ、IL2CPP、そして最後にC ++コンパイラよりも、C ++コンパイラを使用して最適なコードを生成する方がはるかに簡単です。中間人を切り取ると、Compiler IntrinsicsまたはAssemblyを活用して、SIMDやハードウェアAES暗号化などの強力なCPU機能を使用して、大規模なパフォーマンスの向上を使用してマシンコードを直接書き込むことができます。
C ++はC#よりもはるかに大きい言語であり、一部の開発者は、より多くのツールを自由に使用できることを好みます。ここにいくつかの違いがあります:
IL2CPPはC#をすでにC ++に変換しますが、多くのオーバーヘッドを生成します。生成されたC ++を読むと、多くの驚きがあります。たとえば、静的変数を使用した関数にはオーバーヘッドがあり、すべてのクラスの開始時に追加の2つのポインターが保存されます。 sizeof() 、必須のヌルチェックなど、あらゆる種類の機能についても同じことが言えます。代わりに、C ++を直接書き込むことができ、IL2CPPを回避する必要はありません。
C ++は、ビデオゲームや他の多くのフィールドの標準言語です。 C ++でプログラミングすることにより、非ユニティプロジェクトとの間でスキルとコードをより簡単に転送できます。たとえば、UnrealまたはLumberyardエンジンで使用するのと同じ言語(C ++)を使用することで、ロックインを避けることができます。
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviourメッセージを処理します void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROIDなど)このプロジェクトのコアはコードジェネレーターです。 C#APIをC ++ゲームコードで利用できるようにする「バインディング」と呼ばれるC#およびC ++コードを生成します。幅広い言語機能をサポートしています。
classstructenumAction )decimalobj.xのようにget set )obj[x]のようにgetてset )addおよびremove )int object and Visaの逆)outおよびrefパラメーターコードジェネレーターはまだサポートしていないことに注意してください。
Array 、 string 、およびobjectメソッド( GetHashCodeなど)paramsパラメーター(別名「var args」)の合格コードジェネレーターを構成するには、 Unity/Assets/NativeScriptTypes.jsonを開き、既存の例に注意してください。このファイルに追加して、C ++コードにUnity、.NET、またはカスタムDLLからより多くのC#APIを公開します。
コードジェネレーターを実行するには、 NativeScript > Generate Bindingsを選択します。
ほとんどすべてのプロジェクトでは、ガベージコレクションを削減し、IL2CPPのオーバーヘッドを排除し、コンパイラの内在性とアセンブリへのアクセスを行うことにより、ネットパフォーマンスの勝利が見られます。 C ++からC#への呼び出しは、マイナーなパフォーマンスペナルティのみが発生します。まれに、あなたのコードのほとんどすべてが.NET APIへの呼び出しであるということで、あなたは正味のパフォーマンス損失を経験するかもしれません。
テストとベンチマークの記事
最適化の記事
C ++でスクリプトする場合、C#は「バインディング」層としてのみ使用されるため、UnityはC ++関数を呼び出すことができ、C ++関数はUnity APIを呼び出すことができます。コードジェネレーターは、プロジェクトのニーズに応じてこれらのバインディングのほとんどを生成するために使用されます。
すべてのコードといくつかのバインディングが、単一の「ネイティブ」C ++プラグインに存在します。 C ++コードを変更すると、このプラグインを作成してから、エディターまたは展開されたビルド(Androidデバイスなど)でゲームを再生します。 CODE Generatorを実行しない限り、UnityがコンパイルするC#コードはありません。
標準のC#ワークフローは次のようになります:
C ++では、ワークフローは次のようになります。
Unity/AssetsディレクトリのすべてをUnity ProjectのAssetsディレクトリにコピーするNativeScriptTypes.jsonを編集し、C ++からアクセスしたいUnity、.NET、およびカスタムDLL APIの部分を指定します。Unity/Assets/CppSource/Game/Game.cppおよびUnity/Assets/CppSource/Game/Game.hを編集してゲームを作成します。いくつかの例コードが提供されていますが、自由に削除してください。ゲームが成長するにつれて、ここにC ++ソース( .cpp )とヘッダー( .h )ファイルを追加できます。/Applications/Utilitiesでターミナルアプリを開きますcd /path/to/your/build/directoryを実行しますcmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource 。 MyGeneratorを選択したジェネレーターに置き換えます。オプションを確認するには、 cmake --helpと下部のリストを確認します。一般的な選択には、コマンドラインから構築する「Unix MakeFiles」またはAppleのIDEを使用する「Xcode」が含まれます。Unix Makefilesジェネレーターとして選択した場合、またはNativeScript.xcodeprojを開き、xcodeを選択した場合はProduct > Build makeクリックします。 /Applications/Utilitiesでターミナルアプリを開きますcd /path/to/your/build/directoryを実行しますcmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSourceを実行します。 MyGeneratorを選択したジェネレーターに置き換えます。オプションを確認するには、 cmake --helpと下部のリストを確認します。一般的な選択には、コマンドラインから構築する「Unix MakeFiles」またはAppleのIDEを使用する「Xcode」が含まれます。 -DEDITOR=TRUE 。Unix Makefilesジェネレーターとして選択した場合、またはNativeScript.xcodeprojを開き、xcodeを選択した場合はProduct > Build makeクリックします。 cd /path/to/your/build/directoryを実行しますcmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource 。 VERSIONとYEAR使用したいVisual Studioのバージョンに置き換えます。オプションを確認するには、 cmake --helpと下部のリストを確認します。たとえば、Visual Studio 2017に"Visual Studio 15 2017 Win64"を使用します。コミュニティを含むすべてのバージョンはうまく機能します。 -DEDITOR=TRUE 。 Visual Studio 2019を使用している場合は、 cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource代わりに実行します。NativeScript.slnを開き、 Build > Build Solutionをクリックします。 cd /path/to/your/build/directoryを実行しますcmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSourceを実行します。 MyGeneratorを選択したジェネレーターに置き換えます。オプションを確認するには、 cmake --helpと下部のリストを確認します。最も一般的な選択は、コマンドラインから構築する「Unix MakeFiles」ですが、IDEオプションもあります。 -DEDITOR=TRUE 。Unix Makefilesジェネレーターとして選択した場合は、実行しmake 。 cd /path/to/your/build/directoryを実行しますcmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSourceを実行します。 MyGeneratorを選択したジェネレーターに置き換えます。オプションを確認するには、 cmake --helpと下部のリストを確認します。 Android以外の任意のプラットフォームのビルドを作成するには、 -DANDROID_NDK=/path/to/android/ndkパーツを省略します。Unix Makefilesジェネレーターとして選択した場合は、実行しmake 。このプロジェクトの新しいバージョンに更新するには、このプロジェクトのUnity/ Assets/NativeScriptディレクトリを使用してUnity/Assets/NativeScriptディレクトリを上書きし、コードジェネレーターを再実行します。
このプロジェクトの開発について説明する著者による記事。
ジャクソン・ダンスタン
お気軽にフォークしてプルリクエストを送信するか、単に機能やバグの修正について問題を送信してください。
すべてのコードはライセンスされたMITです。つまり、通常、商用および非営利のアプリケーションで簡単に使用できます。
すべての執筆は4.0程度のライセンスCCです。つまり、帰属が与えられている限り使用できます。