Unity_Lesson

1. UnityでのC++

Unityエンジンのコア部分は主にC++で実装されています。
Unity自体が提供するレンダリングシステム、物理エンジン、メモリ管理、ゲームオブジェクトなどの基本的なエンジン機能はC++によって構築されています。


a. レンダリング

Unityのレンダリングは、C++で実装されています。具体的には、Unityは低レベルでのグラフィックAPI(DirectX、Vulkan、Metalなど)を直接操作して、描画命令をGPUに送信します。これをC#から制御するために、UnityはC++で書かれたレンダリングエンジンを提供し、その上にC#ラッパーを提供する形になっています。

b. 物理エンジン

Unityの物理エンジンは、NVIDIA PhysXを利用していますが、最近では物理演算の一部をC#側で実行する新しい実装も進んでいます。これにより、Unityの物理エンジン全体が完全にC++ベースであるわけではなく、一部はC#や他の技術も利用されています。しかし、主な計算処理や性能重視の部分はC++で行われています。

c. メモリ管理

Unityは、メモリ管理に関して非常に注意深く設計されています。C#のガベージコレクション(GC)とは別に、UnityはC++レベルでメモリの最適化や手動でのメモリ管理を行っています。例えば、低レベルのメモリ管理はC++で行われ、C#側のGCが引き起こす遅延を回避するために、特にパフォーマンスを重視するシステム(例えば、オブジェクトプールやマネージドメモリの管理など)においてはC++での管理が行われています。

d. ゲームオブジェクト

Unityのゲームオブジェクトシステムは、基本的にC#で操作されますが、その内部処理はC++で実装された低レベルのシステムが支えています。ゲームオブジェクトやコンポーネントはC#で管理され、ゲーム内のロジックや挙動を制御しますが、シーン管理やオブジェクトのインスタンス化、破棄処理などはC++で行われます。また、大規模なシーンや多数のゲームオブジェクトを効率的に扱うため、C++によるパフォーマンス最適化が行われています。C#からの操作は、C++で実行される内部処理と連携して、スムーズなゲームオブジェクトの管理が可能になっています。







2. コードについて

a. エディタ実行時

Unityエディタでゲームを動かす際、C#はマネージコード(Managed Code)として、.NETランタイム(CLR: Common Language Runtime)上で動作します。C#のスクリプトはC#のまま実行され、C++で書かれたUnityのエンジンと連携します(ゲーム内で使用される描画処理、物理演算、メモリ管理、オーディオなどのパフォーマンスクリティカルな部分はC++で処理されます)。
エディタ実行時、C#スクリプトはネイティブC++コードには変換されませんが、C#コードはUnityエンジンのネイティブ部分と直接やり取りを行いながら実行されます。

b. ビルド(エクスポート)時

ビルド時に「IL2CPP」(Intermediate Language to C++)オプションを選択した場合、C#で書かれたスクリプトは一旦中間言語(IL)に変換された後、ネイティブC++コードに変換されます。
この変換を通じて、ビルドしたゲームアプリケーションのパフォーマンスを向上させたり、プラットフォームによってはC++コードを使ってコードを保護することができます。






transform(UnityEngine.dll)に関して






おまけ_DLLの利用(C++ , C#)