ラディアスリーの加藤です。
先日まで、macOS Sierra + Unity5.6.5p1 を利用して開発を進めていたのですが、ひょんなことから macOS High Sierra に乗り換えることになりまして、ちょうど『素数ガール』のリリースも終わったことだし、この際 Unity の環境も見直してしまおうなどと思い立ちまして、Unity2017.3.0p4 に移行することにしました。
暫くの間は、特に問題もなかったので「これで新環境に移行できたかなぁ…」なんてことを考えていたのですが、ちょいと Unity から AWS Lambda を叩くプロジェクトを実行してみたら変な例外が発生することに気が付きました。
先日まで動いていたプロジェクトが急に動かなくなったんで、ひとまずは Unity のバージョンを戻して試すか…なんてことを試してみたら、Unity5.6.5p1 を High Sierra で動かすと、ファイルシステムが変わった関係で Assets 配下のファイルがUnityで読み込めないんですね…
この現象については、Unity からアナウンスとパッチが公開されていたので、すぐに気づくことができたんですが、肝心の AWS Lambda の例外に関しては、どうも Unity2017.* の問題っぽいと…
そんなわけで、原因と対策について調べてみました。
あまり日本語の情報も出回っていないようですし、せっかくなので足跡を残しておこうと思います。
『Unity 2017.3.0p4 で、AWS SDK(Lambda)を利用しようとすると、以下のような例外が発生してしまう。』
—
InvalidOperationException: Cannot override system-specified headers
UnityEngine.Networking.UnityWebRequest.SetRequestHeader (System.String name, System.String value) (at /Users/builduser/buildslave/unity/build/Modules/UnityWebRequest/Public/UnityWebRequest.bindings.cs:424)
—
Unity5.6.5p1 では動いていたプロジェクトを Unity 2017.3.0p2 にアップデートして動かしてみたところ、上記の Exception が発生してしまったので、原因などを調べてみた。
macOS High Sierra(10.13.3)
Unity 2017.3.0p4
aws-sdk-unity_3.3.233.0
AWS のAPIを呼び出す前に、AWSConfigs.HttpClient に UnityWebRequest を利用するように設定する。
(ここでは、 UnityInitializer.AttachToGameObject を呼び出すタイミングで設定を行った)
1 2 3 4 5 6 7 8 9 10 11 |
void Start() { UnityInitializer.AttachToGameObject(this.gameObject); // この行を追加 AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest; InvokeButton.onClick.AddListener(() => { Invoke(); }); ListFunctionsButton.onClick.AddListener(() => { ListFunctions(); }); } |
どうやら Unity 2017.* から WWW の挙動に変更が入ったようで、AWS SDK では UnityWebRequest を使う必要があったようだ。
UnityWebRequest は、Unity の WWW の代替クラスとして Unity 5.4 から正式版としてリリースされたものらしい。
UnityWebRequest では、WWW クラスと比べて RESTful API に対応できるように設計されていて、つまり PUT や DELETE などのメソッドを利用できるようになったもののようだ。
AWS SDK では、 UnityWebRequest を使用するためのサポートとして、 AWSConfigs に利用するAPIを指定するフラグを用意していたようだ。
(参考)
https://aws.amazon.com/jp/blogs/mobile/unity-v3-support-in-the-aws-sdk-for-net-is-out-of-preview/
色々と調べてみたのだが、今ひとつ根本的な原因はわからなかった。
Unity 2017.* から WWW の仕様に変更が入り、AWS SDK で問題が発生することになったのではないかと想像している。
ハマりどころとしては、『AWS Mobile SDK for Unity』 の公式ページ から、sdkをダウンロードして、そのsdkに含まれている Exapmles を実行してみても同じ例外が発生してしまうといった点だと思う。
◯ まとめ
原因がもやっとしているじょうたいなので、いまひとつスッキリしないのだが…
そのうち AWS SDK か Examples が更新されるんじゃないかと思う。
ひとまずは(直接関係はないけど)、UnityWebRequest とか WWW とかについて少し知見が広がったので良かったとしよう。
しかし、UnityWebRequest があれば WWW クラスは不要なんじゃないのか?
そのうち deprecated になるのだろうか?
また、『AWS SDK for Unity Is Now Part of AWS SDK for .NET』によると、どうも AWS SDK は、 .Net 版と Unity版を分離して管理していくのが手間になってきたから、 .Net用の AWK SDK に Unity コンポーネントを利用した版も含めるってなことを言っているようだけれども、そもそも(現状で)AWS SDK を Unity から利用する場合には、どこが1次配布元になっているのだろうか?
github の aws-sdk-net から clone してビルドするのが良いのだろうか…
やっぱり、いまひとつスッキリしない…
◯ 参考
https://github.com/aws/aws-sdk-net/issues/643
https://github.com/aws-samples/aws-gaming-unity-labs-sample/issues/1