Unityと.NET

9,268 views

Published on

Published in: Technology
0 Comments
42 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,268
On SlideShare
0
From Embeds
0
Number of Embeds
1,191
Actions
Shares
0
Downloads
33
Comments
0
Likes
42
Embeds 0
No embeds

No notes for slide

Unityと.NET

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

×