Unityと.NET
Aiming 大阪 開発グループ
松田理孝
自己紹介
● 2012年新卒エンジニア
● .NET/Mono/C#er
○ 今の業務はC++
○ 担当はWebAPI、鯖、蔵、サポート、メンテ、KPT
■ 浅く広く
● 好きなゲーム
○ ブラフ(ボードゲーム)
○ ガンスリンガーストラトス(アーケード)
○ Tokyo 7th シスターズ(iOS)
● 業務Unity暦
○ 2年くらい前に半年ほど
自己紹介
● 好きな食べ物
○ ホワイトチョコレート
○ イリー(エスプレッソ)
○ ジャック・ダニエル(ウィスキー)
● 趣味
○ テニス
○ アクアリウム
● 休日はイラストレータ
○ 趣味の延長
はじめに
● セッションの動機
○ ゲームエンジンとしてのUnityは優秀
○ しかし不幸になる人が多いのは何故か
はじめに
● セッションの目的
○ .NET/Monoから見たUnityとは何か
○ Unityを使う上で.NETにできる事
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード
6. UnityとDLL
7. .NETをさらに有効活用していくには
.NET Frameworkとは
● Microsoftが開発したアプリケーション開発、実
行環境
● .NET FrameworkはCLRにその他ライブラリ群
を加えたものと言える。
○ Wikipediaより
お前は何を言ってるんだ?
.NET Frameworkは巨大
● まだまだ序の口
○ 基本ライブラリ
○ UI(WPF、XNA(MonoGames))
○ Web(OWIN, One ASP.NET)
○ データアクセス(EF、ADO.NET)
○ DIコンテナ(MEF)
○ 言語統合クエリ(LINQ)
○ 動的言語ランタイム(DLR)
○ ReactiveExtensions
○ 非同期(async/await)
○ 実行環境(CLR、Mono)
.NETに関わる部分も巨大
● 連携技術
○ Visual Studio
○ Nuget
○ Team Foundation Server
■ Visual Studio Online
○ Microsoft Azure
■ Hyper-V
■ Windows Server
■ SQL Server
○ WinRT(Windows Store App)
○ Win32 API
○ etc...
.NETは巨大過ぎてわからない
● MSが関わる部分ほとんどに関わるから巨大
● 最近はオープンソース化もしてるし
でも実際にやることって
.NETでは役割は2つにわかれている
ランタイム上で
中間言語を実行する
各言語(C#など)を
中間言語に変換する
.NETでは役割は2つにわかれている
ランタイム上で
中間言語を実行する
各言語(C#など)を
中間言語に変換する
中間言語 #とは
Common Intermediate Language
● 共通中間言語
○ .NETに対応している全ての言語は、コンパイラによって
この中間言語(のバイナリ)に変換される
■ UnityだとC#、Boo、JScript.NET
■ 他にはF#、VB.NET、C++/CLIなど
○ バイナリを逆コンパイルするとテキスト形式になる
■ 一応、人間が読める程度
■ 直接編集できる
○ 自分で編集したものを再コンパイルすれば当然使える
■ マシン語のアセンブラと同じ
Common Intermediate Language
● .NETランタイムに対するアセンブリ言語
○ アセンブリレベルでオブジェクト指向をサポート
○ 自分で直接エディタで書いてもOK
■ ちなみにC#コンパイラはCILの全ての機能をサポー
トしていない
● 実行時パフォーマンスや開発効率などを考えてそうなっている
● .NETランタイムはこの中間言語を、各環境に合
わせたマシン語に実行時コンパイルする
○ JITと呼ばれる
Common Intermediate Language
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
Common Intermediate Language
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
C#コンパイラ
Common Intermediate Language
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
C#コンパイラ ランタイム
Common Intermediate Language
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
C#コンパイラ ランタイム
IL逆アセンブラ ILアセンブラ
おさらい
● コンパイラは中間言語のバイナリを吐く
○ .NETの各ライブラリ等は、このバイナリの状態でやり取
りされる
■ マネージドなDLLという事
■ みんなが泥沼に嵌ったネイティブのDLLとは根本的
に仕組みが違う
○ 当然Roslyn(次期C#/VBコンパイラ)でも変わらない
● ネイティブを吐くときに必要なリンクが無い
○ ビルドが非常に高速
○ リンク作業はランタイムが動的に行う
アジェンダ
1. .NETとは
2. .NETとMonoの関係 ←まだここ
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード
6. UnityとDLL
7. .NETをさらに有効活用していくには
Mono
● .NET Framework互換環境を実現するための
オープンソースのソフトウェア群
● 共通言語基盤 (CLI) の実装やC#のコンパイラ
などが含まれる
○ Wikipediaより
お前は何を言ってるんだ?
実はこの図、.NETに限定していない
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
IL逆アセンブラ ILアセンブラ
C#コンパイラ ランタイム
.NETとMonoの比較
● C#コンパイラ
○ csc.exe (.NET)
○ mcs (Mono)
■ コマンドライン引数も同じようになってる
● つまり、XamarinStudioからRoslynを使うことも可能
● 実行方法
○ Windows上では、exeのメタデータを読み込んで.NETラ
ンタイム上で自動で動く
○ 例えばLinux上のMonoだとコマンドラインで動かす
■ mono hogehoge.exe
コンパイラとランタイムを置き換えると
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
IL逆アセンブラ ILアセンブラ
csc.exe
mcs
CLR(.NET)
Mono
.NETとMonoの比較
● 中間言語は実行環境に依存しないので
○ csc.exeで作成したexeファイルがMono上で動く
○ その逆も然り
■ ただMono上で実装されていない機能、またはその
逆等もあるので注意
● .NETは他のMS製品と連携できる
○ IISと連携したASP.NETなどはデバッグが非常に楽
■ IE/VisualStudioを使って徹底的にやれる
○ MonoだとApacheで動かすことになるので面倒
■ できなくも無いレベル
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割 ←ここ
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード
6. UnityとDLL
7. .NETをさらに有効活用していくには
ゲームを作るうえでのUnityの役割
● Unity
○ みんな大好きゲームエンジン
■ ありがちな名前でいろいろ被ってややこしい
MO・MMOで必要なサービス
サーバ
クライアント
ツール
MO・MMOで必要なサービス
サーバ
● リアルタイム系
○ C++
● WebAPI系
○ ruby on rails
○ Python
○ PHP
クライアント
MO・MMOで必要なサービス
● Cocos2d-x
● Unity
● Win32/DirectX
● Flash(AIR)
ツール
MO・MMOで必要なサービス
● 設定系
○ Excel
○ Unity
○ その他ツール
■ WPFとか?
● サポート系
○ ruby on rails
● 運用系
○ シェルスクリプト
○ ロガー
Unityの役割とは
● クライアント
○ 描画エンジン
○ 物理エンジン
● 設定ツール(レベルデザイン)
○ 細かな数値設定には向いてない気がする
■ 膨大な数の武器とか美麗カードの設定とか
● を、マルチプラットフォームで実現できる
○ マルチプラットフォームも2つに分けられて、
■ Unity自体がWinでもMacでも動く
■ 成果物をAndroidやiOS向けに出力できる
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割 ←ここ
5. Unityとスクリプトコード
6. UnityとDLL
7. .NETをさらに有効活用していくには
UnityにおけるMonoの役割とは
● クライアント
○ 描画エンジン
○ 物理エンジン
● 設定ツール(レベルデザイン)
● を、マルチプラットフォームで実現できる
○ マルチプラットフォームも2つに分けられて、
■ Unity自体がWinでもMacでも動く
■ 成果物をAndroidやiOS向けに出力できる
この部分!
Monoのサブプロジェクト
● Monodroid
● Mono touch
○ 今は名前が変わって
■ Xamarin Android
■ Xamarin iOS
○ みたいになってる
● Monoは実行環境
○ ということは?
UnityにおけるMonoとは
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
IL逆アセンブラ ILアセンブラ
C#コンパイラ ランタイム
そうか、中間言語をAndroidやiOSで
動くようにしているのか!!
Unity5では
● Androidなんかでも、マネージドコードを送らず
に、iOSと同じAOTでネイティブコードを送って
パフォーマンスを上げようって言う話が出ている
らしい
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード ←ここ
6. UnityとDLL
7. .NETをさらに有効活用していくには
Unityとスクリプトコード
● Unityで使える言語
○ C#
■ JScript.NET
● Boo
○ もうC#だけでいいよね
■ 変数小文字だったりするのはJScript由来だけど
● Unityで使えるC#のバージョン
○ 3.0
C# 3.0で使える構文
● 型推論var
● 拡張メソッド
● ラムダ式
● LINQ
○ from x in numbers where …
○ numbers.Where()....
● 匿名型
○ var point = new { X = 0, Y = 0 };
● C# 2.0からのもの
○ ジェネリクス
他言語から見たら今風だけど
● C# 4.0
○ DLR
○ Task
● C# 5.0
○ async/await
● 有意義に使いたい
● C# 6.0
○ Roslyn
■ C#コンパイラ
■ IL吐くだけだから基準満たせばUnityでも使えそう
Unityにおけるスクリプトとは
.cs
(テキスト)
.dll 
.exe
(バイナリ)
マシン語
.il
(テキスト)
IL逆アセンブラ ILアセンブラ
C#コンパイラ ランタイム
Unityにおけるスクリプトとは
● DLLに変換できればなんでもいい
● ただし
○ UnityのMonoが認識できるもの
○ Unityのライセンス内のもの
■ 無償版だとモバイルでSocket使えないよ
● だからJScriptやBooでも書ける
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード
6. UnityとDLL ←ここ
7. .NETをさらに有効活用していくには
C#とDLL
● Dynamic Link Library
○ しつこいけど、ネイティブのDLLとは別物
● 単純にクラスをまとめたという認識でOK
○ 厳密には色々あるけどまた今度
DLL
namespace A;
class A;
class B;
class C;
namespace B;
class A;
class B;
class C;
UnityとDLL
● Unityでは2つのライブラリが用意されてる
○ UnityEngine.dll
■ ゲームそのものに必要なクラス群
○ UnityEditor.dll
■ エディタを拡張するのに必要なクラス群
● Unityにも自作のDLLを放り込める
○ Assetフォルダ内に配置するだけ
Unity依存な部分をライブラリに
UnityEngine.dll
MyGameLibrary.dll
Assetフォルダ内に
入れた
もともと見てる
Unity依存な部分をライブラリに
UnityEngine.dll
MyGameLibrary.dll
MonoBehaviour使いたい><。
Unity依存な部分をライブラリに
UnityEngine.dll
MyGameLibrary.dll
Unityが見てるDLLを
参照すればいいだけ
Unityのエディタ拡張も共有
UnityEditor.dll
MyEditor.dll
他チームで使いたいときは、
このDLL一個送るだけで良い
なぜDLLに分離するのか
● そもそも、Unityのコンパイルの手順は
○ Asset内のスクリプトをまとめDLLの様なものにする
○ DLLをリフレクション使って解析してアレコレしてるはず
■ DLLにしてもそのまま.cs書いても変わらない
● ちゃんと動作保障できたDLL単位で分離できれ
ば、次のプロジェクトに対する資産にもなる
○ この辺.NETの十八番のようなもの
■ Win32で痛い目見た経験
■ Fakesはよ、VS Proにはよ
アジェンダ
1. .NETとは
2. .NETとMonoの関係
3. ゲームを作るうえでのUnityの役割
4. UnityにおけるMonoの役割
5. Unityとスクリプトコード
6. UnityとDLL
7. .NETをさらに有効活用していくには ←最後
開発に時間はかけていられない
● で、求められる内容
○ もっとリッチに、快適に
○ リアルタイム通信
■ ないかもしれないけど
○ 仕様変更とか余裕で対処してね
○ サーバとか落としていられない
○ アプリだって落としていられない
■ 審査にも落としていられない
○ 設定だって効率よくしたい
○ サポートエンジニアなんて沢山割けない
○ 人を増やすほど人海戦術の効果は薄くなっていく
■ 人を増やしても開発期間伸びるでしょ?
MO・MMOで必要なサービス
サーバ
クライアント
ツール
MO・MMOで必要なサービス
サーバ
● リアルタイム系
○ C++
○ C#/.NET
● WebAPI系
○ ruby on rails
○ Python
○ PHP
○ ASP.NET
● データベース
○ ADO.NET
■ EntityFramework
クライアント
MO・MMOで必要なサービス
● Cocos2d-x
● Unity(C#/Mono)
○ 他にもC#あるはず…
● Win32/DirectX
● Flash(AIR)
ツール
MO・MMOで必要なサービス
● 設定系
○ Excel
○ Unity
○ その他ツール
■ WPFとか
● サポート系
○ ruby on rails
○ ASP.NET
● 運用系
○ PowerShell
共通化した時のメリット
● ちゃんと動作保障できたDLL単位で分離できれ
ば、資産になる
○ 設定ファイルの読み書きDLLを各部分から使用できるよ
うになる
○ サポートツール上のログ検索ロジックの入ったDLLを、
運用中のサーバにアクセスしたPowerShellで叩けるよ
うになる(ツールを開かなくても良い)
○ Unityに依存する部分を少なく設計すれば移植も楽
● コードを共通化することで保守部分が減る
● 車輪の再発明も少なくなる
.NET Frameworkを手に入れられる
● まだまだ序の口
○ 基本ライブラリ
○ UI(WPF、XNA(MonoGames))
○ Web(OWIN, One ASP.NET)
○ データアクセス(EF、ADO.NET)
○ DIコンテナ(MEF)
○ 言語統合クエリ(LINQ)
○ 動的言語ランタイム(DLR)
○ ReactiveExtensions
○ 非同期(async/await)
○ 実行環境(CLR、Mono)
.NETに関わる部分も使えるようになる
● 連携技術
○ Visual Studio
○ Nuget
○ Team Foundation Server
■ Visual Studio Online
○ Microsoft Azure
■ Hyper-V
■ Windows Server
■ SQL Server
○ WinRT(Windows Store App)
○ Win32 API
○ etc...
.NETは巨大
=共有化の可能性が無限大
ご静聴ありがとうございました

Unityと.NET