.NET使いからみるUnityのC#でいろいろするとつらくなる件
Unityでアプリケーション実装する際にC#使っているときは色々とつらいことが発生しています。その中でもUnityだけでアプリ開発している人が何かほかのC#ライブラリを持込む等するときに気を付けたほうがいいと思うことを備忘録として残します。
気を付けるポイントを理解するための前置き
その1 - HoloLensはUWPアプリケーションです。
重要です。UWPアプリケーションは一応C#でかけるのですが、.NET Frameworkとは別物です。いやいや同じC#言語でかけるでしょ!?となると思います。乱暴な言い方ですが、.NET Framework X.XとUWPは別のバイナリで動いてると思ってまちがいないです。
この仕様があるため、.NET Framework X.XでビルドしたクラスライブラリをUWPでは参照することができません(逆もしかり)。
その2 - Unityの.NETは「.NET Framework 3.5」が基本
Unityは.NET Framework 3.5が基本となっています。ここで「あれ?」となる人がいると思います。さっきも言ったようにHoloLensはUWPアプリケーションです。基本Unityが.NET 3.5なのになぜUWPでアプリケーションが作れるのか。とても簡単な話で単純にUnityでBuildした場合、Unity内で.NET 3.5のC#コードをUWPのプロジェクトに変換して出力しています。Unity上でビルドエラーが出ていない状態のC#のコードであれば何の問題もなくUWPに変換されます。(一部の問題を除いて)
気を付けないといけないこと
以上を踏まえ本題の内容になります。
外部ライブラリ(dll)を使用する場合.NET Framework X.Xで作られたものは使えない。
先ほどの一部の問題というのがこれに当たります。Unityは.NET 3.5のルールでコードを書くのでまず.NET 3.5より上位(4.0~)で作られたライブラリは使えません。
これだけならいいのですが、.NET3.5で作られたライブラリはUnity内では使えますが、UnityからHoloLens用にUWPでビルドすると参照できないために動きません。これは先に話したUWPと.NET X.Xのライブラリは参照関係をとれないためです。よって外部のdllを使用して作ったUnityアプリをPlayerで確認してOKでも、ビルドしてダメになるパターンが発生します。
対応方法
1つの方法として、dllの元となるソースコードがある場合、UnityのProjectにコードを全部入れてしまうという方法です。これであればHoloLens用にUWPをビルドするタイミングで変換してくれるので問題なく利用できます。ただし、投入したコードが別のdll(標準の.NETは除く)を見ているとだめなのですが。
個人的に困ると感じていること。
その1 - 部品としての流用が難しい。
上記のような対応を行う場合、Unity限定なら必要なライブラリをまとめてパッケージにすることで流用もできますし問題ないです。ただ私の場合、Unity以外の.NETでもライブラリとして使いたいことがあるのでUnityのパッケージでは不便を感じています。
その2 - 最新の技術が使えない。
現状リリースされている.NETファミリーは最新が.NET Framework 4.7です。この上で動作するC#についてはまた別にバージョンを持っています。最新はC#7.0です。Unityで使える.NET Framework 3.5は.NETとしては1世代以上前の技術になります。このため不便な部分が多々あります。下位のバージョンは処理としては同じことができますが手間が違います。
不便な例-同期/非同期処理
重い処理を非同期でさせるということはよくある話ですが、複数の非同期処理を組み合わせる処理があると思います。クラウドのサービスを2,3連携して呼ぶようなパターンです。これを.NET 4.5以降では以下のように、次の処理を同期的に待たせたりとかをかなり自然に書けます。非同期処理を待たせたい場合はawait入れるだけでその部分は処理を同期してくれます。.NET 3.5では自分で待機処理を書かないとできないです。
public Task async Hoge()
{
//非同期1つ目。待たなくてもいいパターン
ExecuteAsync();
//非同期2つ目。後続がこの処理の結果を必要とするので待つ必要がある。
var result = await ExecuteAsync2();
//非同期3つ目。2つ目の結果を受け取って処理する。
await ExecuteAsync3(result);
}
その他
Unityで無難にC#で書こうとするとUnity上で全部コード書かないといけない&HoloLensはUWPのくせにUWPの便利なものが使えない。過去にUWPと組み合わせるために色々試行してるものがあるのですが、まだまだ中途半端です。
色々不便さがあるので、より使いやすい方法でうまくライブラリ化して利用しやすい構造をとれるようにしていきたいと思います。案は色々あるのでいい方法ができればまた報告したいと思います。