2020年08月14日

[Unity] Unity2019.4のエディタで動くのにAndroidの実機でDynamoDB(AWS Mobile SDK for Unity)が動かないときの対処

Unity2017で作ったアプリをUnity2019で更新した時の話。エディタでは動くのにAndroidの実機でDynamoDBの関数を実行しようとしたら動かないことがあったのでメモ。

OS : macOS Catalina(10.15.4)
使用環境 : Unity2019.4.0f1

事の発端は、DynamoDBの関数を呼ぶところで謎のエラーが出たところから。
------------------------
ArgumentException: Object of type 'System.Object[]' cannot be converted to type 
'UnityEngine.AndroidJavaObject[]'.
at System.RuntimeType.CheckValue (System.Object value, System.Reflection.Binder binder,
System.Globalization.CultureInfo culture, System.Reflection.BindingFlags invokeAttr)
[0x00000] in <00000000000000000000000000000000>:0
at System.Reflection.MonoMethod.ConvertValues (System.Reflection.Binder binder,
System.Object[] args, System.Reflection.ParameterInfo[] pinfo, System.Globalization.CultureInfo
culture, System.Reflection.BindingFlags invokeAttr) [0x00000] in
<00000000000000000000000000000000>:0
------------------------

調べてみたら、AWSの公式プラグインではUnity2019には対応していないらしい。
参考: https://qiita.com/kosuke1113/items/904df92d444804d496c3

できるだけ簡単な対処方法を探していたところ、良いページを発見。
https://lhkmarcus.com/2020/04/05/how-to-use-aws-sdk-in-unity-2019/

このページを参考に、自分がやった事は以下の通り。

@link.xmlを確認。(変更なし)
実際に使ったlink.xmlはこの通り。

------------------------
<linker>
<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
<type fullname="UnityEngine.Networking.UploadHandlerRaw" preserve="all" />
<type fullname="UnityEngine.Networking.UploadHandler" preserve="all" />
<type fullname="UnityEngine.Networking.DownloadHandler" preserve="all" />
<type fullname="UnityEngine.Networking.DownloadHandlerBuffer" preserve="all" />
</assembly>
<assembly fullname="mscorlib">
<namespace fullname="System.Security.Cryptography" preserve="all"/>
</assembly>
<assembly fullname="System">
<namespace fullname="System.Security.Cryptography" preserve="all"/>
<namespace fullname="System.ComponentModel" preserve="all" />
</assembly>
<assembly fullname="System.Configuration">
<namespace fullname="System.Configuration" preserve="all" />
</assembly>
<assembly fullname="AWSSDK.Core" preserve="all">
<namespace fullname="Amazon.Util.Internal.PlatformServices" preserve="all"/>
</assembly>
<assembly fullname="AWSSDK.DynamoDBv2" preserve="all"/>
<assembly fullname="AWSSDK.CognitoIdentity" preserve="all"/>
<assembly fullname="AWSSDK.CognitoIdentityProvider" preserve="all"/>
<assembly fullname="AWSSDK.SecurityToken" preserve="all"/>
</linker>
------------------------

AAWS for Unityのプラグインをダウンロード&インポート。
ダウンロード元: ※2020年8月13日現在 = aws-sdk-unity_3.3.796.0
https://docs.aws.amazon.com/ja_jp/mobile/sdkforunity/developerguide/setup-unity.html

zipファイルを解凍すると、各サービス用のUnityパッケージがあるので、その中の
「AWSSDK.DynamoDBv2.3.3.106.45.unitypackage」
をWクリックして、Unityプロジェクトにインポートする。

BAssets/Plugins/Android/AndroidManifest.xml を修正。
------------------------
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
android:label="@string/app_name">
 ↓赤い箇所を削除
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name">
------------------------

CUnity2019用に修正されたSDKをダウンロード&解凍して、既存ライブラリを上書き。
このページにある「3.Download the fixed SDK here」から、Unity2019用に修正されたSDKをダウンロードする。
解凍すると、各サービス用にUnityパッケージがあるので、必要な分を選んで上書きする。
自分の場合は、link.xmlに記載されてあったサービスのを選んだ。

001.png

上書きされるのは、Unityプロジェクト内のAssets/AWSSDK にあるライブラリ。

002.png

これでビルドして実行したら、Androidの実機で無事DynamoDBが動作した!
本当にありがたい。

こうなるとUnity2020は、怖くて使えないなー。
posted by be-style at 00:45| Comment(0) | Unity