Unity開発者に伝えたい.NETのこと

 Unity開発者に伝えたい.NETのこと

2019/07/20(土)にUnity Technologies Japan様開催された

「Unity++~ ショートセッション勉強会 presented by Unity部~」で発表した

「Unity開発者に伝えたい.NETのこと」の発表資料です

F46c97bb74758d481531990654933050?s=128

RyotaMurohoshi

July 20, 2019
Tweet

Transcript

  1. Unity開発者に伝えたい.NETのこと ~2019 Summer~ @RyotaMurohoshi 2019/07/20(土) Unity++

  2. 昔のUnityとC#のこと

  3. 昔のUnityとC#のこと 「なんかiOSでクラッシュするからこれ禁止な」 「なんでasync/await使えないの!」 「新しいC#、使いたい!」

  4. そんな時代もありました 懐かしいですね。でも今は違いますね!

  5. Unityは進化している! 普通に最新のC#も使えるようになった!

  6. 今日はUnityで使えるようになった 新しい便利なC#の機能を紹介します!

  7. 嘘です!

  8. C#の「言語機能」や「文法」の話はしませんが Unity開発者のみなさんに それに関係のある知見を共有させていただきます

  9. Unity開発者に伝えたい.NETのこと ~2019 Summer~ @RyotaMurohoshi 2019/07/20(土) Unity++

  10. • どうやったら新しいC#が使えるの? • .NETなんちゃらの設定どっち選べばいい? • .NETなんちゃらってたくさんあよね?何?

  11. この25分のショートセッションでは、 みなさんが.NETのいろいろな要素を 理解して、整理できるようなお話をします

  12. 自己紹介 • @RyotaMurohoshi(むろほし) • Microsoft MVP • UniBook11、よろしくね!

  13. C#の文法やLINQの投稿をします

  14. .NET Standard向けのライブラリ ImportedLinq作りました! Unityでも使えるよ!使ってね!!! https://github.com/RyotaMurohoshi/ImportedLinq

  15. 「イントロダクション」 完

  16. ~知見1~ 工夫せずに最新のC#が新しいUnityで使えるよ!

  17. 長い間、Unityでは だいたいC# 4.0相当の言語機能 しか使えませんでした・・・

  18. けれど今は違う! 最新C# 7.3の言語機能もばっちり使える!

  19. Edit > Project Settings > Player Settingを開く Configurationセクションの「Scripting Runtime Version」を設定

    「.NET 4.x Equivalent」を選択!これで最新C#!
  20. これでC# 7.3の言語機能や .NETの新しいクラスライブラリが使えます!

  21. 2016年 春 Unityが.NET Foundationに参加 2017年 夏 Unity 2017.1リリース 「.NET 3.5

    Equivalent」に加え「.NET 4.6 Equivalent」がExperimentalとして選べるように 2018年 初夏 Unity 2018.1リリース 「.NET 4.x Equivalent」がExperimentalでなく安定版に 2018年 冬 Unity 2018.3リリース 「.NET 4.x Equivalent」がデフォルトに、「.NET 3.5 Equivalent」は非推奨に 2019年中 Unity 2019のリリースサイクル中 「.NET 3.5 Equivalent」が利用不可能になる予定
  22. Unity 2018.4 LTSを使っている人は ぜひ「.NET 4.x Equivalent」にして 新しいC#、そして.NETを使いましょう!

  23. 「最新のC#、Unityで使えるよ!」 完

  24. 次はこの画像中「API Compatibility Level」について

  25. ~知見2~ API Compatibility Level、どっちを選べばいいの?

  26. Scripting Runtime Versionを変えると Api Compatibility Levelの選択肢も変わります

  27. Api Compatibility Level これは何をどういう基準でえらべばいいんでしょ?

  28. Scripting Runtime VersionとApi Compatility Levelの選択肢 .NET 3.5 Equivalent .NET 4.x

    Equivalent
  29. Scripting Runtime VersionとApi Compatility Levelの選択肢 .NET 3.5 Equivalent .NET 4.x

    Equivalent .NET 2.0 .NET 2.0 Subset .NET 4.x .NET Standard 2.0
  30. • .NET 4.x • .NET Standard 2.0 Api Compatibility Levelはどっちを選べばいいの?

    何がどう変わる?
  31. Api Compatibility Levelを変えると プロジェクトで参照する.NETのDLLが変わる!

  32. .NET 4.xを選ぶ場合 • .NET Framework 4.xの APIすべてが提供されている • API として提供されているが、すべてのプラットフォームで

    動くわけではない。 実行時にエラーになることも • ビルド成果物のサイズが⼤きくなる • これを選んだ時、.NET Standard 2.0 向けのライブラリも使える
  33. .NET Standard 2.0を選ぶ場合 • .NET 4.xで提供されたAPIの内、こちらには無いAPIもある • ビルド成果物のサイズを小さくできる • 開発に.NET

    Standard 2.0向けのライブラリを使える 公式ブログより 「このプロファイルは、Unity が対応しているすべてのプラットフォームで機能するようになります。」 https://blogs.unity3d.com/jp/2018/03/28/updated-scripting-runtime-in-unity-2018-1-what-does-the-future-hold/ 機能する?すべてのAPIがすべてのプラットフォームで使えるわけではないと思う
  34. 比較表 .NET 4.x .NET Standard 2.0 提供されているAPIの数 比べると多い 比べると少ない ビルド成果物のサイズ

    比べると大きい 比べると小さい .NET Standard 2.0 の外部ライブラリは? 使える 使える
  35. 「ビルド成果物のサイズ」は、 「画像などのアセットの寄与率が⼤きい場合がある」 「Code Strippingで使わないコードに対処できる」 ということも考慮に入れましょう

  36. Api Compatibility Levelで.NET 4.xだと使えるけれど .NET Standard 2.0で使えないコードの例 System.Reflection.Emit Utf8JsonやMessagePack-Csharpで使われている

  37. 私の「Api Compatibility Level」のオススメは、 まず、.NET Standard 2.0にして .NET Standard 2.0で存在しないクラスが 必要になったら.NET

    4.xに切り替える
  38. 「Api Compatibility Level、どっちを選べばいいの?」 完

  39. .NET 2.0と.NET Standard 2.0、似てるけど別物 .NET Standard 2.0は古いわけじゃない じゃあ、.NET Standardって何だよ?って話をします

  40. ~知見3~ .NET Standardって何なの?

  41. 再掲 .NET Standard向けのライブラリ ImportedLinq作りました! Unityでも使えるよ!使ってね!!! https://github.com/RyotaMurohoshi/ImportedLinq

  42. 再掲

  43. .NET Standardとは? 仕様・規格

  44. .NET Standardとは? .NET Frameworkとか、.NET Coreとか、Monoとか、 “.NET 実装”のクラスライブラリが 提供すべきAPIの仕様・規格

  45. 「だから何だよ?意味わかんねぇよ!?」 「ん?何がうれしいの?」 そう思った方もいると思います

  46. .NET Standardを理解するためのポイント • いくつかの.NET実装があること • .NET実装ごとに、クラスライブラリのAPIが違うこと

  47. .NET実装はいくつかある • .NET Framework • .NET Core • Mono

  48. .NET実装がもっているもの • メモリ管理、例外処理、スレッドの同期などの機能をもつランタイム • クラスライブラリ • 実装ごとに複数のアプリケーションフレームワーク • 開発ツール(⼀部の開発ツールは複数の実装間で共有)

  49. .NET実装はいくつかある それぞれを簡単に紹介!

  50. .NET Framework • オリジナルの.NET実装 • Windows専用 • 2002年正式リリース。長い歴史を持つ • フレームワークはサーバー用のものやWindowsデスクトップアプリ用など

    • ⼀部のコードのみが、reference source として公開されている
  51. .NET Core • クロスプラットフォーム • オープンソース • 活発にアップデートが行われ、できることも、クラスライブラリもどんど ん増えている •

    主にサーバーサイド(ASP.NET Core)で活躍している
  52. Mono • 長い歴史を持つ(1.0が出たのが2004年!) • クロスプラットフォーム • オープンソース • Xamarinの基盤、モバイルアプリやデスクトップアプリの基盤 •

    UnityはUnity用にカスタマイズしたMonoを活用している
  53. .NET実装はいくつかある • .NET Framework • .NET Core • Mono

  54. .NET実装はいくつかある • .NET Framework • .NET Core • Mono •

    UWP • Xamarin.Mac • Xamarin.Android • Xamarin.iOS • Unity
  55. いろいろな.NET実装向けに ライブラリをつくることを想像してみてください! .NETの実装がいろいろバラバラだったら 個別に対応するの、めんどくさくないですか?

  56. .NET実装がもっているもの • メモリ管理、例外処理、スレッドの同期などの機能をもつランタイム • クラスライブラリ • 実装ごとに複数のアプリケーションフレームワーク • 開発ツール(⼀部の開発ツールは複数の実装間で共有)

  57. ランタイムは規格化されている! ECMA 335

  58. クラスライブラリにあるLINQメソッド「TakeLast」 .NET Coreには、2.0からある .NET Frameworkには、ない .NET実装のクラスライブラリごとにAPIが違う!

  59. ライブラリ開発者として、 .NET実装ごとにクラスライブラリに 差分があるの⼤変!!!

  60. 「少なくともこのAPIは全部の.NET実装で使えるよ!」 そんな規格・仕様があると嬉しい!

  61. .NET Standard

  62. .NET Standardとは? “.NET 実装”のクラスライブラリが 提供すべきAPIの仕様・規格 実は.NET Standard以前に別の規格もあった : PCL

  63. .NET Standard • 「.NET実装」が提供すべきAPIの⼀覧、仕様 • 仕様であり、APIの実態があるわけじゃない • ライブラリ開発者は.NET Standard向けにライブラリをつくれる •

    実装すべきであって、必ず正しく実装されているわけじゃない • プラットフォーム的に、「それはできない」ってAPIもある
  64. .NET Standard • .NET Standardはバージョンを持つ • バージョンアップごとにAPIが増えている • 1.0で7949個のAPI •

    1.6で13501個のAPI • 2.0で32638個のAPI • 新しい.NET Standardのバージョン向けのライブラリだと、ライブラリ開 発にたくさんのAPIを使える • ライブラリ開発者は、.NET Standard 1.0向け、.NET Standard 2.0向けみた いな感じでライブラリをつくれる
  65. Unity 2018.1とそれ以降は.NET Standard 2.0をサポートしている .NET Standard 2.0で定義されている32638個のAPIが使える そして.NET Standard 2.0向けのライブラリも使える!

    .NET Standard 1.0や.NET Standard 1.6向けのライブラリも使える!
  66. .NET Standard 1.0向けライブラリ Unity 2018.1、.NET Core 1.0、.NET Framework 4.5、Mono 4.6以上などで使える

    .NET Standard 2.0向けライブラリ Unity 2018.1、.NET Core 2.0、.NET Framework 4.6.1、Mono 5.4以上などで使える ※.NET Frameworkは4.7.2以上がおすすめ ライブラリで.NET Standardのバージョンを上げると、 ライブラリ開発で使えるAPIは増えるけど 古いバージョンの.NET 実装でそのライブラリを使えなくなる
  67. .NET Standardバージョン表 https://docs.microsoft.com/ja-jp/dotnet/standard/net-standard より

  68. .NET Standardポイントおさらい .NET Standardは.NET実装が実装すべきAPIの仕様 Unityは、2018.1から.NET Standard 2.0をサポートしている Unity 2018でも.NET Standard

    1.0や2.0向けのライブラリが使える!
  69. .NET Standardって何なの? ここまで

  70. おまけに これからの.NETの未来についてを簡単に

  71. .NET Standard 次は.NET Standardのバージョンは2.1がリリース予定 .NET CoreのSpan、ValueTask、HashCodeなども追加 System.Reflection.Emitも⼤幅追加!

  72. UnityとMono 次の.NET Standard 2.1はサポートする予定! しかし、今のところいつになるかはTBD(未定)

  73. .NET Framework 4.8が最後のメジャーバージョン 次の.NET Standard 2.1はサポートしない ※セキュリティアップデートなどはまだまだこれからも続きます

  74. .NET Core 3.0が2019年9月にリリースされる パフォーマンス改善にたくさんのAPIの追加 .NET Standard 2.1対応 .NET Frameworkでしか使えなかったWPFやWinFormsが、.NET Coreでも使えるように(ただしWindows限定)

  75. .NET 5 2020年11月、.NET なんちゃらはまた⼤きな動きがありそうです 気になる人は MicrosoftのBlog「Introducing .NET 5」 https://devblogs.microsoft.com/dotnet/introducing-net-5/

  76. おさらい • 新しいC#がUnityで使えること • それに関する.NETの設定のこと • .NET Standardと各種.NET実装のこと • これから先の.NETのこと

  77. Unity開発者に伝えたい.NETのこと ~2019 Summer~ @RyotaMurohoshi 2019/07/20(土) Unity++