Successfully reported this slideshow.
Your SlideShare is downloading. ×

Unityと.NET

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 68 Ad

More Related Content

Slideshows for you (20)

Viewers also liked (11)

Advertisement

Similar to Unityと.NET (20)

Advertisement

Recently uploaded (20)

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. ご静聴ありがとうございました

×