2019/07/20(土)にUnity Technologies Japan様開催された
「Unity++~ ショートセッション勉強会 presented by Unity部~」で発表した
「Unity開発者に伝えたい.NETのこと」の発表資料です
Unity開発者に伝えたい.NETのこと~2019 Summer~@RyotaMurohoshi2019/07/20(土) Unity++
View Slide
昔のUnityとC#のこと
昔のUnityとC#のこと「なんかiOSでクラッシュするからこれ禁止な」「なんでasync/await使えないの!」「新しいC#、使いたい!」
そんな時代もありました懐かしいですね。でも今は違いますね!
Unityは進化している!普通に最新のC#も使えるようになった!
今日はUnityで使えるようになった新しい便利なC#の機能を紹介します!
嘘です!
C#の「言語機能」や「文法」の話はしませんがUnity開発者のみなさんにそれに関係のある知見を共有させていただきます
• どうやったら新しいC#が使えるの?• .NETなんちゃらの設定どっち選べばいい?• .NETなんちゃらってたくさんあよね?何?
この25分のショートセッションでは、みなさんが.NETのいろいろな要素を理解して、整理できるようなお話をします
自己紹介• @RyotaMurohoshi(むろほし)• Microsoft MVP• UniBook11、よろしくね!
C#の文法やLINQの投稿をします
.NET Standard向けのライブラリImportedLinq作りました!Unityでも使えるよ!使ってね!!!https://github.com/RyotaMurohoshi/ImportedLinq
「イントロダクション」完
~知見1~工夫せずに最新のC#が新しいUnityで使えるよ!
長い間、UnityではだいたいC# 4.0相当の言語機能しか使えませんでした・・・
けれど今は違う!最新C# 7.3の言語機能もばっちり使える!
Edit > Project Settings > Player Settingを開くConfigurationセクションの「Scripting Runtime Version」を設定「.NET 4.x Equivalent」を選択!これで最新C#!
これでC# 7.3の言語機能や.NETの新しいクラスライブラリが使えます!
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」が利用不可能になる予定
Unity 2018.4 LTSを使っている人はぜひ「.NET 4.x Equivalent」にして新しいC#、そして.NETを使いましょう!
「最新のC#、Unityで使えるよ!」完
次はこの画像中「API Compatibility Level」について
~知見2~API Compatibility Level、どっちを選べばいいの?
Scripting Runtime Versionを変えるとApi Compatibility Levelの選択肢も変わります
Api Compatibility Levelこれは何をどういう基準でえらべばいいんでしょ?
Scripting Runtime VersionとApi Compatility Levelの選択肢.NET 3.5 Equivalent.NET 4.x Equivalent
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
• .NET 4.x• .NET Standard 2.0Api Compatibility Levelはどっちを選べばいいの?何がどう変わる?
Api Compatibility Levelを変えるとプロジェクトで参照する.NETのDLLが変わる!
.NET 4.xを選ぶ場合• .NET Framework 4.xの APIすべてが提供されている• API として提供されているが、すべてのプラットフォームで 動くわけではない。実行時にエラーになることも• ビルド成果物のサイズが⼤きくなる• これを選んだ時、.NET Standard 2.0 向けのライブラリも使える
.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がすべてのプラットフォームで使えるわけではないと思う
比較表.NET 4.x .NET Standard 2.0提供されているAPIの数 比べると多い 比べると少ないビルド成果物のサイズ 比べると大きい 比べると小さい.NET Standard 2.0の外部ライブラリは?使える 使える
「ビルド成果物のサイズ」は、「画像などのアセットの寄与率が⼤きい場合がある」「Code Strippingで使わないコードに対処できる」ということも考慮に入れましょう
Api Compatibility Levelで.NET 4.xだと使えるけれど.NET Standard 2.0で使えないコードの例System.Reflection.EmitUtf8JsonやMessagePack-Csharpで使われている
私の「Api Compatibility Level」のオススメは、まず、.NET Standard 2.0にして.NET Standard 2.0で存在しないクラスが必要になったら.NET 4.xに切り替える
「Api Compatibility Level、どっちを選べばいいの?」完
.NET 2.0と.NET Standard 2.0、似てるけど別物.NET Standard 2.0は古いわけじゃないじゃあ、.NET Standardって何だよ?って話をします
~知見3~.NET Standardって何なの?
再掲.NET Standard向けのライブラリImportedLinq作りました!Unityでも使えるよ!使ってね!!!https://github.com/RyotaMurohoshi/ImportedLinq
再掲
.NET Standardとは?仕様・規格
.NET Standardとは?.NET Frameworkとか、.NET Coreとか、Monoとか、“.NET 実装”のクラスライブラリが提供すべきAPIの仕様・規格
「だから何だよ?意味わかんねぇよ!?」「ん?何がうれしいの?」そう思った方もいると思います
.NET Standardを理解するためのポイント• いくつかの.NET実装があること• .NET実装ごとに、クラスライブラリのAPIが違うこと
.NET実装はいくつかある• .NET Framework• .NET Core• Mono
.NET実装がもっているもの• メモリ管理、例外処理、スレッドの同期などの機能をもつランタイム• クラスライブラリ• 実装ごとに複数のアプリケーションフレームワーク• 開発ツール(⼀部の開発ツールは複数の実装間で共有)
.NET実装はいくつかあるそれぞれを簡単に紹介!
.NET Framework• オリジナルの.NET実装• Windows専用• 2002年正式リリース。長い歴史を持つ• フレームワークはサーバー用のものやWindowsデスクトップアプリ用など• ⼀部のコードのみが、reference source として公開されている
.NET Core• クロスプラットフォーム• オープンソース• 活発にアップデートが行われ、できることも、クラスライブラリもどんどん増えている• 主にサーバーサイド(ASP.NET Core)で活躍している
Mono• 長い歴史を持つ(1.0が出たのが2004年!)• クロスプラットフォーム• オープンソース• Xamarinの基盤、モバイルアプリやデスクトップアプリの基盤• UnityはUnity用にカスタマイズしたMonoを活用している
.NET実装はいくつかある• .NET Framework• .NET Core• Mono• UWP• Xamarin.Mac• Xamarin.Android• Xamarin.iOS• Unity
いろいろな.NET実装向けにライブラリをつくることを想像してみてください!.NETの実装がいろいろバラバラだったら個別に対応するの、めんどくさくないですか?
ランタイムは規格化されている!ECMA 335
クラスライブラリにあるLINQメソッド「TakeLast」.NET Coreには、2.0からある.NET Frameworkには、ない.NET実装のクラスライブラリごとにAPIが違う!
ライブラリ開発者として、.NET実装ごとにクラスライブラリに差分があるの⼤変!!!
「少なくともこのAPIは全部の.NET実装で使えるよ!」そんな規格・仕様があると嬉しい!
.NET Standard
.NET Standardとは?“.NET 実装”のクラスライブラリが提供すべきAPIの仕様・規格実は.NET Standard以前に別の規格もあった : PCL
.NET Standard• 「.NET実装」が提供すべきAPIの⼀覧、仕様• 仕様であり、APIの実態があるわけじゃない• ライブラリ開発者は.NET Standard向けにライブラリをつくれる• 実装すべきであって、必ず正しく実装されているわけじゃない• プラットフォーム的に、「それはできない」ってAPIもある
.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向けみたいな感じでライブラリをつくれる
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向けのライブラリも使える!
.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 実装でそのライブラリを使えなくなる
.NET Standardバージョン表https://docs.microsoft.com/ja-jp/dotnet/standard/net-standard より
.NET Standardポイントおさらい.NET Standardは.NET実装が実装すべきAPIの仕様Unityは、2018.1から.NET Standard 2.0をサポートしているUnity 2018でも.NET Standard 1.0や2.0向けのライブラリが使える!
.NET Standardって何なの?ここまで
おまけにこれからの.NETの未来についてを簡単に
.NET Standard次は.NET Standardのバージョンは2.1がリリース予定.NET CoreのSpan、ValueTask、HashCodeなども追加System.Reflection.Emitも⼤幅追加!
UnityとMono次の.NET Standard 2.1はサポートする予定!しかし、今のところいつになるかはTBD(未定)
.NET Framework4.8が最後のメジャーバージョン次の.NET Standard 2.1はサポートしない※セキュリティアップデートなどはまだまだこれからも続きます
.NET Core3.0が2019年9月にリリースされるパフォーマンス改善にたくさんのAPIの追加.NET Standard 2.1対応.NET Frameworkでしか使えなかったWPFやWinFormsが、.NET Coreでも使えるように(ただしWindows限定)
.NET 52020年11月、.NET なんちゃらはまた⼤きな動きがありそうです気になる人は MicrosoftのBlog「Introducing .NET 5」https://devblogs.microsoft.com/dotnet/introducing-net-5/
おさらい• 新しいC#がUnityで使えること• それに関する.NETの設定のこと• .NET Standardと各種.NET実装のこと• これから先の.NETのこと