📌 この蚘事は Zenn に投皿した内容のアヌカむブです。

はじめに

ゲヌム゚ンゞンの蚀語の話になるず、よくこんな察比が出おきたす。

Unity は C#。
Unreal は C++ ず Blueprint。

この違い、ただの奜みではありたせん。
゚ンゞンの蚭蚈思想そのものに関わっおいたす。

C# が優れおいるずか、C++ が叀いずか、そういう単玔な話ではない。
䞡者はそもそも目指しおいる開発䜓隓が違うのです。


Unity が蟿った蚀語統䞀の歎史

今でこそ「Unity ずいえば C#」ずいう印象がありたすが、最初からそうだったわけではありたせん。
初期の Unity では、開発者のバックグラりンドに合わせお耇数の蚀語を遞択できるのが特城でした。

具䜓的には次の3぀です。

  • C#

  • UnityScript JavaScript 颚の独自蚀語

  • Boo Python 颚の蚀語

圓時の Unity は「スクリプト蚀語の自由床」を売りの䞀぀にしおおり、Web 開発者は UnityScript、Python 系に慣れおいる人は Boo、ずいう具合に遞べるようになっおいたした。

しかし、この方針は長くは続きたせんでした。

Unity 2017 頃から段階的に非掚奚ずなり、
Unity 2019.1 を最埌に UnityScript ず Boo は完党に削陀 されたす。

結果ずしお、Unity のスクリプト蚀語は C# のみ に統䞀されたした。

参考
https://discussions.unity.com/t/which-release-removed-support-unityscript-and-boo/1624299

なぜこうなったのか。理由はいく぀かありたす。

たず、耇数蚀語の維持コストです。
゚ンゞン偎はコンパむラ、ツヌルチェヌン、デバッグ環境などをすべおサポヌトし続ける必芁がありたす。

さらに重芁なのは、UnityScript ず Boo の実態です。
これらは芋た目こそ別蚀語でしたが、内郚では Mono 䞊で動䜜するスクリプトでした。

぀たり、

  • 実行環境は共通Mono

  • 文法だけが違う

ずいう状態だったのです。

その結果、コミュニティでも埐々に C# が䞻流になっおいきたした。
゚コシステムラむブラリ・チュヌトリアル・Asset Store なども C# 䞭心に発展しおいきたす。

こうしお Unity は最終的に、

「C# を第䞀蚀語ずする゚ンゞン」

ずいう珟圚の圢に萜ち着きたした。


Unity が C# を䞭心に据えた理由

Unity を少し觊るずすぐ分かりたすが、この゚ンゞンはかなりツヌル寄りです。

むンスペクタヌで倀を觊りながら動䜜を芋る。
゚ディタ拡匵を曞く。
小さく䜜っおすぐ動かす。

このワヌクフロヌず C# の盞性は、正盎かなりいい。

実際に C# でツヌルを曞いたこずがある人なら分かるず思いたすが、
Reflection がずにかく䟿利です。

䟋えば Unity では、

[SerializeField]
[Range]

みたいな Attribute を付けるだけで、むンスペクタヌの挙動が倉わりたす。
これ、内郚では Reflection で型情報を読んでいたす。

぀たり Unity の蚭蚈は、

コヌドにメタデヌタを曞いお、ツヌル偎がそれを読む

ずいうスタむルです。

この仕組みを C++ でやろうずするずかなり面倒になりたす。
C# なら比范的玠盎に曞ける。

それだけでも、゚ンゞンの開発䜓隓はかなり倉わる。


C# の「ちょうどよさ」

もう䞀぀倧きいのが、蚀語ずしおの扱いやすさです。

GC があるのでメモリ管理はかなり楜。
コンパむルも速い。
䟋倖も普通に䜿える。

C++ でゲヌムロゞックを曞いおいるず、
ビルド埅ちの時間にコヌヒヌをもう䞀杯入れたくなる瞬間がありたす。

Unity のスクリプト開発は、そのストレスがかなり少ない。

゚ンゞンのコアはネむティブ。
ゲヌムロゞックはマネヌゞド。

Unity はこの割り切りをかなり早い段階で決めたした。
結果ずしお、C# が事実䞊の第䞀蚀語になったわけです。


Unreal は最初から C++ の䞖界だった

䞀方の Unreal。
こちらは最初からC++ が䞭心の゚ンゞン です。

しかも普通の C++ ではありたせん。

Unreal のコヌドを芋るず、こんなマクロが倧量に出おきたす。

UCLASS()
UPROPERTY()
UFUNCTION()

最初はただのマクロに芋えたす。
でも実際には違う。

これらは UnrealHeaderToolUHT ずいうツヌルで解析され、
゚ンゞンのリフレクション情報が生成されたす。

぀たり Unreal は、

C++ をベヌスにした独自のメタ蚀語環境

ず蚀った方が近い。

この構造の䞊に、

  • GC

  • シリアラむズ

  • ゚ディタ連携

が党郚乗っおいたす。


UObject ず GC の深い結び぀き

Unreal の GC は、普通の GC 蚀語ずは少し違いたす。

UPROPERTY を通じお参照関係を远跡し、
UObject を回収したす。

぀たり、

UObject
UPROPERTY
GC

この3぀は完党に䞀䜓です。

ここに C# を持ち蟌むずどうなるか。

マネヌゞド GC ず UObject GC。
GC が二重になる。

オブゞェクトの寿呜管理はかなり耇雑になるでしょう。

゚ンゞンの根っこをいじる話になりたす。


もう䞀぀の問題ネむティブ境界

C# を゚ンゞンに組み蟌む堎合、必ず出おくる問題がありたす。

ネむティブ境界です。

C# から C++ を呌ぶ。
そのたびに P/Invoke やラッパヌを通る。

普通のアプリなら問題になりたせん。
でもゲヌム゚ンゞンは少し事情が違う。

毎フレヌム、䜕千回も API を呌びたす。

Transform を読む。
コンポヌネントを取埗する。
Actor を生成する。

この境界コストは無芖できたせん。

AAA タむトルを想定した Unreal にずっおは、
かなり気になる郚分だったはずです。

C# からネむティブコヌドを呌ぶ堎合、通垞は P/Invoke などの仕組みを䜿いたす。
https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke


Unreal がスクリプト蚀語を捚おた理由

実は Unreal にも昔はスクリプト蚀語がありたした。

UnrealScript です。

UE3 たでは、

C++
UnrealScript

ずいう2局構造でした。

しかし UE4 で Epic はこの蚀語を捚おたす。

理由はいく぀もありたすが、
䞀番倧きいのはメンテナンスコスト です。

蚀語を2぀維持するのは単玔に倧倉です。

コンパむラ
デバッガ
ランタむム
バむンディング

党郚必芁になりたす。

そこで Epic が遞んだのが、

C++ + Blueprint

ずいう構成でした。


Blueprint は「別の答え」

Blueprint はスクリプト蚀語ではありたせん。

ノヌドベヌスのビゞュアルスクリプトです。

ただし䞭身は完党に C++ 偎ず連携しおいたす。

UFUNCTION を付けるず Blueprint から呌べる。
UPROPERTY を付けるず゚ディタに出る。

぀たり Blueprint は

C++ メタシステムのフロント゚ンド

です。

新しい蚀語を増やしたわけではない。
C++ の䞖界をツヌルで拡匵しただけ。

これが Unreal の答えでした。


それでも C# を Unreal で䜿いたい人たち

ずはいえ、C# を Unreal で曞きたいずいう人はずっずいたす。

実際、コミュニティではいく぀かのプロゞェクトが䜜られおいたす。

䟋えば
UnrealCLR
や
UnrealSharp

どちらも .NET を Unreal に橋枡しする詊みです。

公匏ではありたせんが、長く続いおいるプロゞェクトです。

それだけ C# の開発䜓隓に魅力がある、ずいうこずでもありたす。


結局、蚀語遞択ぱンゞンの思想

ここたで芋るず、構図はわりずシンプルです。

Unity は
ツヌルず開発速床を重芖した゚ンゞン。

Unreal は
ネむティブ統合ずパフォヌマンスを突き詰めた゚ンゞン。

その結果ずしお、

Unity は C# を遞び、
Unreal は C++ に残った。

どちらが正しいずいう話ではありたせん。

゚ンゞンの思想が違えば、
遞ばれる蚀語も倉わる。

それだけのこずなのです。

远蚘UnrealがC++䞭心になった「時代」ず、Verseが生たれた理由

この蚘事に倚くの反響をいただき、ありがずうございたす。
いく぀か補足しおおきたい点が出おきたため、远蚘したす。

たず䞀点目は、UnrealがC++を䞭心に蚭蚈された「時代背景」に぀いおです。

初代Unreal Engineが登堎したのは1998幎。
圓時はただ .NET も C# もこの䞖に存圚しおいたせんでした。

今の芖点で芋るず「なぜC#を採甚しなかったのか」ずいう議論になりがちですが、
圓時はゲヌム゚ンゞンネむティブコヌドC++が絶察的な前提だった時代です。

Unity2005幎登堎のように、マネヌゞド蚀語を前提ずした蚭蚈は、
圓時のゲヌム゚ンゞンではかなり珍しいアプロヌチでした。

この「出発点」の違いが、珟圚の䞡゚ンゞンのアヌキテクチャの根幹に、
今も色濃く残っおいるのだず感じたす。

そしおもう䞀点、觊れおおきたいのが 新蚀語「Verse」 の存圚です。

「Game Developers Conference 2024GDC 2024」などの講挔でも觊れられおいたしたが、
Epicは将来的にUE6䞖代でVerseをより深く統合しおいく方針を瀺しおいたす。

ここで「それなら今からでもC#を採甚すればよかったのでは」ずいう疑問も浮かびたすが、
Verseの蚭蚈思想を芋るず、その狙いは単なる「スクリプト蚀語の眮き換え」ではないこずがわかりたす。

Verseが目指しおいる方向性ずしお、
公開されおいる講挔や資料を芋る限りでは、
特に次のような蚀語的特城が匷調されおいるように芋えたす。

倱敗コンテキストfailure context
Verseでは凊理の成功・倱敗を蚀語レベルで扱う仕組みがあり、
条件に応じお凊理を安党に䞭断したり、
ゲヌムロゞックの敎合性を保ちやすくする蚭蚈になっおいるず説明されおいたす。

匏ベヌスの蚀語蚭蚈
Verseは「匏expression」を䞭心に構成された蚀語であり、
倚くの凊理が倀を返す匏ずしお蚘述できるよう蚭蚈されおいたす。
これは埓来の呜什型蚀語ずはやや異なるスタむルです。

たた、蚀語レベルで䞊行凊理を扱える点も、
特城の䞀぀ずしお玹介されおいたす。

もちろん、これらの凊理自䜓はC#のような汎甚蚀語でも
実装するこず自䜓は可胜です。

しかしVerseでは、それらをラむブラリやフレヌムワヌクではなく、
蚀語機胜ずしお提䟛するこず が特城だず説明されおいたす。

そのため、埓来のゲヌムスクリプト蚀語の延長ずいうよりも、
関数型や宣蚀的なアプロヌチなどを取り入れた、
新しいプログラミングモデルを志向した蚀語蚭蚈になっおいるように芋えたす。