2022年09月24日

[Unity] Unity2022にバージョンアップしたらURPを更新しろと言われたときの対応

Unity2020→2022 にバージョンアップしてURP(Universal Render Pipeline)を使っているプロジェクトを開いたところ、Unity起動時に「使っているURPをアップグレードしろ」というメッセージが出た。

スクリーンショット20220920.png

対処しないと、URPを使っているシェーダーの色がおかしくなっていた。

以前も似たことがあったので、同じ対応をしたら解決した。

■手順
・Projectウィンドウから、該当するURPファイルを見つけてWクリック(または、シングルクリック > Inspectorウィンドウ > Open Shader Editor)
・Shader Editorの左上メニュー「Save Asset」を押すと、上書きされる

これでシェーダーの色は正常に戻った。
posted by be-style at 22:26| Comment(0) | Unity

2022年09月20日

[Unity] In App Purchasing 4.4.1 にアップデートして出たエラー対応

Unityのパッケージ「In App Purchasing」をPackage Managerを使って、バージョン4.4.1にアップデートしたところ、ビルドエラーが出てしまいました。
その時の対応です。

------------------------------------
Library/PackageCache/com.unity.purchasing@4.4.1/Runtime/SecurityStub/AppleValidator.cs(53,16): error CS0433: The type 'AppleReceipt' exists in both 'Security, Version=1.0.7268.24073, Culture=neutral, PublicKeyToken=null' and 'UnityEngine.Purchasing.SecurityCore, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
------------------------------------

■対応
・Unityを終了
・Finderから、Unityプロジェクト/Library/PackageCache の中身をすべて削除
・Unityを起動

すると、別のエラーが出ました。

------------------------------------
Library/PackageCache/com.unity.purchasing@4.4.1/Runtime/SecurityStub/CrossPlatformValidator.cs(43,16): error CS0433: The type 'IPurchaseReceipt' exists in both 'Security, Version=1.0.7268.24073, Culture=neutral, PublicKeyToken=null' and 'UnityEngine.Purchasing.SecurityCore, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
------------------------------------

変数「Security」の宣言が重複してるのかな?

■対応
・Unityを終了
・Finderから、2つのディレクトリを削除
 →Unityプロジェクト/Plugins > UnityChannel
 →Unityプロジェクト/Plugins > UnityPurchasing
・Unityを起動し、Package Manager で「In App Purchasing」を remove -> install
※参考 : https://teratail.com/questions/167808

今度は、プログラムの内容についてのエラーが出た。

------------------------------------
error CS1061: 'IGooglePlayConfiguration' does not contain a definition for 'SetPublicKey' and no accessible extension method 'SetPublicKey' accepting a first argument of type 'IGooglePlayConfiguration' could be found (are you missing a using directive or an assembly reference?)
------------------------------------

■対応
・SetPublicKeyの箇所をコメントアウト。
(「In App Purchasing 2.2.0」から、SetPublicKeyは廃止になったらしい)
※参考 : https://forum.unity.com/threads/alternative-to-setpublickey.1092364/

これでビルドエラーが消えた。
後でテストしてみよう。
posted by be-style at 17:00| Comment(0) | Unity

2022年06月12日

[Unity] Visual Studio Code でアウトラインが表示されなくなったときの対処

Unityで使っているVisual Studio Code(以下、VSC)で、突然アウトラインが表示されなくなりました。

スクリーンショット20220611.png

VSC本体や拡張機能を消したり再インストールしてみたものの解決せず、
困っていたら、VSCを終了&再起動したら解決しました(何だこれ)。
※以下、macでの操作となります

@Unityを起動して、Projectウィンドウ内の適当なスクリプトファイル(C#とか)を
ダブルクリックして、VSCを開く。

Aアウトラインを見ると、「ドキュメント'xxxx.cs'にシンボルが見つかりません」と
なっている(これを解決したい!)

BVSCの画面がアクティブになっている状態で、
[command] + q
を押して、VSCを終了させる。
※画面左上の×ボタンや、DockのVSCのアイコンを右クリックからの終了ではダメ

C再び、UnityのProjectウィンドウ内のスクリプトファイルをダブルクリックして、
VSCを起動させる。

DVSCの画面下の「出力(output)」画面で色々コマンドが実行されているのに気づく。

EDのコマンドが一通り終わると、アウトラインが表示される↓

スクリーンショット20220611_2.png

参考(VSCをキーボードで終了させることを知った):
https://zenn.dev/leaf/articles/ee0b7b796b9036

キーボード操作でVSCを終了させないとダメだった理由がわかりません。
理由はわからないけど、問題に対処できたので残しておきます。

参考になる人は少ないかもしれませんが、こういう方法もあるということで。
posted by be-style at 01:40| Comment(0) | Unity

2021年11月18日

[Unity] AWSの最新版SDKはUnityプラグインではなく、.NETだった件

前回の記事で、iOS用のAWSのSDKの最新版はCocoaPodsを利用することで使用できました。
でも、Unity用のAWSのSDKについては、そう簡単にはいきませんでした。
Unity用パッケージではなく、.NETで公開されている方が最新版だとわかったのです。

結論としては対応できたのですが、その過程がめっちゃ苦労したのでメモとして残しておきます。


■ 概要
@ AWS SDKの最新版は .NET。Unity用プラグイン(.unitypackage)の更新は既に終了している
A DLLは複数あるけど、.NET Standard 2.0版 を使用する(たぶん)
B SDKの圧縮ファイル(.nupkg)は、MacではWクリックでは解凍できない
C メソッド定義が重複するので、新旧のDLLは共存させない
D メソッドが非同期用になっていたので、Taskで対応


@ AWS SDKの最新版は .NET。Unity用プラグイン(.unitypackage)の更新は既に終了している


きっかけは、数消しパズル(Android版)の更新に着手した時でした。
iOS版がスムーズに作業できたので、Android版もそうだろうと思っていたら、ビルドエラーが出ました↓


Error Unity ArgumentException: Object of type 'System.Object[]' cannot be converted to type 'UnityEngine.AndroidJavaObject[]'.
2021/11/17 21:45:48.606 23782 23813 Error Unity at System.RuntimeType.CheckValue (System.Object value, System.Reflection.Binder binder, System.Globalization.CultureInfo culture, System.Reflection.BindingFlags invokeAttr) [0x00000] in <00000000000000000000000000000000>:0
...


調べてみると、Unity2019からAndroidで動作しないという声があったようです。

AWS SDK for Unity を利用したアプリがAndroid上で動作しない【Unity 2019 2.11f1】:
https://qiita.com/kosuke1113/items/904df92d444804d496c3

AWS SDKをUnity(2018.1以降)で使う:
https://qiita.com/nshinya/items/0a71d4658e7f4a650844

ではどこから最新版のSDKをダウンロードしようというと、NuGetという所から落とせるらしい。

Obtaining assemblies for the AWS SDK for .NET:
https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-obtain-assemblies.html

上記ページにある「aws-sdk-netstandard2.0.zip」のリンクからZipファイルを落とします。
(他にも、aws-sdk-net45.zip、aws-sdk-net35.zip があるけど試していません)

スクリーンショット20211118_001.png

A DLLは複数あるけど、.NET Standard 2.0版 を使用する(たぶん)


.NET Standard 2.0を選んだのは、
Unity > Project Settings > Player > Configuration(Android) > API Compatibility Level = .NET 4.x
としているので、下位互換性のあるStandard 2.0を選んだ方が無難だと思ったから。

スクリーンショット20211118_002.png

あと、DLLを直接ダウンロードする方法も紹介されていました↓

Unity のサポートに関する特別な考慮事項:
https://docs.aws.amazon.com/ja_jp/sdk-for-net/v3/developer-guide/unity-special.html

先ほどのZipファイルを解凍すると、AWSのSDKがすべて入っているので、必要なDLLだけをUnityプロジェクトにコピーして使用します。

■使用するサービス
・Cognito (ユーザー認証)
・DynamoDB (サーバーレス key-value NoSQL)

■必要なDLL
使いたいサービスに直結するDLL
・AWSSDK.CognitoIdentity.dll
・AWSSDK.CognitoSync.dll
・AWSSDK.DynamoDBv2.dll
上記3点を使用する際に必要とされるDLL
・AWSSDK.Core.dll
・AWSSDK.SecurityToken.dll
・Microsoft.Bcl.AsyncInterfaces.dll
・System.Runtime.CompilerServices.Unsafe.dll
・System.Threading.Tasks.Extensions.dll

なぜ2サービスだけなのにDLLがこんなに必要かというと、依存関係があるから。

例を挙げると、AWSSDK.CognitoIdentityを使用したい場合、AWSSDK.CoreとAWSSDK.SecurityTokenが必要になります。
https://www.nuget.org/packages/AWSSDK.CognitoIdentity/
より、
スクリーンショット20211118_003.png

こんな感じで、必要とされるDLLを調べます。

NuGetで依存関係を確認する方法↓
例)AWSSDK.Coreの場合:
https://www.nuget.org/packages/AWSSDK.Core/

各DLLの依存関係一覧:
https://github.com/aws/aws-sdk-net/blob/master/generator/ServiceModels/_sdk-versions.json

後で気づいたけど、どのDLLも@でダウンロードしたZipファイルに格納されていました。
後述で、NuGetから直接ダウンロードしていますが、その作業は不要でした。
でも勉強のため、残しておきます。

B SDKの圧縮ファイル(.nupkg)は、MacではWクリックでは解凍できない


上記で挙げたNuGetページの右側に「Download package」というリンクがあります。そこからDLLを直接ダウンロードすることができますが、圧縮されて「.nupkg」という拡張子になっていています。
調べてみると、この拡張子を「.zip」に書き換えて解凍できるとありましたが、Macを使っている自分の場合は解凍できませんでした。

解凍できた方法は2つ。
@ 「.nupkg」はそのままで、右クリック > このアプリケーションで開く > アーカイブユーティリティ.app
スクリーンショット20211118_004.png

A 上記の方法を試したら「.nupkg」と「.cpgz」に交互に変わるだけで解凍されない場合は、ターミナルから「unzip」コマンドを使って解凍

Macでzipファイルを解凍するとcpgzファイルが生成されてしまう時の対処法:
https://3daysam.com/post-301/

C メソッド定義が重複するので、新旧のDLLは共存させない


これでDLLが揃ったので、Unityプロジェクトに適当なディレクトリを作ってそこに入れます。
ただし、既に入っている古い方のDLLと競合するので、古い方はUnityプロジェクトから外しておきます(念のため、削除せずに残しておきます)

D メソッドが非同期用になっていたので、Taskで対応


dynamoDBから1項目を取得するコマンドに「GetItem」がありますが、SDKを最新版にしたところ、そのメソッドがなくなり、「GetItemAsync」になっていました。
スクリーンショット20211118_005.png

これにより、GetItemは非同期処理になったようで、Taskを使う必要が出てきました。
これまでUnityでTaskを使ったことがなかったので勉強しました↓

【Unity】【C#】Unityでasync/await、Task入門!非同期処理をスマートに書く:
https://light11.hatenadiary.com/entry/2019/03/05/221311

DBクライアントの取得などは割愛して、項目を取得する部分だけを抜粋するとこんな感じ。

public void Hogehoge()
{
// 戻り値は使わないけど、こう書くのが習わしらしい
var doc = GetData();
// こちら側でdocからデータを得ようとするとフリーズするので注意。非同期メソッドの中でデータを取得すること。
}

async Task<Document> GetData()
{
Table table = Table.LoadTable(_ddbClient, "[テーブル名]");
var doc = await table.GetItemAsync("[該当するキー]");
Debug.Log(doc["q"]);         // <----- 目的の項目のデータが取れた!!
return doc;
}

// テーブル定義
[DynamoDBTable("[テーブル名]")]
public class MyTable
{
[DynamoDBHashKey] // ハッシュキー
public string key { get; set; }
[DynamoDBProperty] // 属性
public string q { get; set; }
}



SDKが新しくなって、プログラムで修正が必要になった箇所は上記のようなテーブルにアクセスする箇所だけだった。
Cognitoを使って認証するところや、DBに接続する準備の処理はこれまで通りだった。

色々調べたけど、同期のままのメソッド例が多く、サンプル通り動かないものもあり、非同期のメソッドを使ってデータを取得する方法を見つけるまでに苦労しました。
今回のが良い方法かはわかりませんが、誰かの助けになれば幸いです。

posted by be-style at 23:17| Comment(0) | Unity

2021年08月09日

[Unity - Android] Google Play Game Serviceのリーダーボードを実装したときのメモ

UnityでGoogle Play Game Serviceのリーダーボードを利用したときにハマったのでメモ。
Google Play Consoleの管理画面が新しくなって、ややこしくなった。



■略語の説明:
・GPGS = Google Play Game Service(リーダーボード等、ゲームで使う機能がある)
・GPC = Google Play Console(Androidアプリを管理するサイト)
・GCP = Google Cloud Platform(GPGSを使う時に使うOAuth認証を管理するサイト)



■注意点
@Unityでの実装編
・PlatformがAndroidになっている
GPGSのSDKを使っている
・GPGSとAdMobのSDKでAndroid Resolverが重複したとき、バージョンの新しい方を採用する
・2021年8月1日から、申請できるアプリはAndroid11.0(API30)以上
・GPGSのUnityでの設定は、
 Unity > Window > Google Play Gams > Setup > Android setup...
 「Resources Definition」の欄に入力するのは、
 Google Play Console > Playゲームサービス > 設定と管理 > リーダーボード > 画面右上の「リソースを取得」 > Android(XML) の内容 ※GPCでリーダーボードを既に作っていること
 Client IDは、Androidアプリなので空欄でOK。
・Android実機のログ確認は、
 Unity > Window > Analytics > Android Log Cat

AGoogle Play Console(管理画面)編
・.apkまたは.aabファイルを内部テストに登録している
・クローズドテストをする場合は、ストア情報を全て埋める必要がある
・ポリシー > ポリシーのステータス で、プライバシーポリシー(Webサイト)を登録する
・ポリシー > アプリのコンテンツ で、アンケートにすべて答える
・テスト > 内部テスト > テスター数 で、テストユーザーを登録する
 招待URLは、テスター数 の下にある「テストへの参加方法」にある。
・Playゲームサービス > 設定と管理 > テスター数 で、テストユーザーを登録する

BGoogle Cloud Platform(管理画面)編
・GPC > Playゲームサービス > 設定と管理 > 設定 > OAuthクライアント
 から GCP に行ける。
・GCPでは、必須項目以外は記入しない(色々と申請が面倒そう)
・認証情報 > SHA-1証明書のフィンガープリントに記入するのは、実機のログ(後述)で出力された方を採用。
 ※「keytool -keystore...」を使って取得したSHA-1証明書は、なぜかエラーになった
 ※GPC > 設定 > アプリの完全性 > SHA-1 証明書のフィンガープリント でもないので注意
・OAuth同意画面 > 公開ステータス が「本番環境 or テスト環境」かをチェックする
 ※テスト環境の場合、テストユーザーが登録されていることを確認する



■エラーの内容
実機で実行すると下記のエラーが出てGPGSの認証に失敗した。
下記の(1)(2)(3)を設定できているかチェックする。

APP NOT CORRECTLY CONFIGURED TO USE GOOGLE PLAY GAME SERVICES
DEVELOPER_ERROR
This is usually caused by one of these reasons:
(1) Your package name and certificate fingerprint do not match
the client ID you registered in Developer Console.

(2) Your App ID was incorrectly entered.

(3) Your game settings have not been published and you are
trying to log in with an account that is not listed as
a test account.

(4) A server auth code was requested, but an incorrect client
id was provided. The client id for server auth codes should
be the client id for the game server (not the android app).

To help you debug, here is the information about this app
Package name : [アプリのパッケージ名]
Cert SHA1 fingerprint: [XX:XX:XX:XX:.... といった、SHA-1証明書のフィンガープリント]
App ID from manifest : [GPC > Playゲームサービス > 設定と管理 > 設定 > プロジェクトID と一致]

※GCP > 認証情報 > OAuth2.0クライアントID > 該当ID > SHA-1証明書のフィンガープリント
 には、上記のフィンガープリントを設定する必要がある

【2021.8.10追記】
オープンテストのためGPCにアップロードしてストアからインストールしたところ、また認証で失敗して上記エラーが出た。PCから直接インストールするのと、ストアからインストールするのとで、フィンガープリントが違っていた。なぜ!
ということで、ログに出力されたフィンガープリントを改めてGCPで設定しなおすと、オープンテストでインストールしたアプリで認証できた。仕組みがわからない!




■リンク
GPGS(Google Play Game Service) for Unityプラグイン:
https://github.com/playgameservices/play-games-plugin-for-unity
※2021年8月9日時点 = v10.12

GPC(Google Play Console):
https://play.google.com/console/u/0/developers/

GCP(Google Cloud Platform):
https://console.cloud.google.com/apis/credentials



■参考
GPGSの実装でハマりやすい点:
https://qiita.com/flying_water_pot/items/eb18ad1e8520eb068907

UnityからAndroidの署名あり/なしビルド:
https://light11.hatenadiary.com/entry/2019/07/07/211057

GCPでOAuth同意画面の公開ステータスが「本番環境 or テスト環境」かチェック:
https://tyatran.hatenablog.com/entry/2020/12/29/140700

Xcodeの不要ファイルが重くなった場合の削除シェル:
https://qiita.com/star__hoshi/items/0ce9cd1c3793e6a951fc
posted by be-style at 10:31| Comment(0) | Unity