UnityでEOSを使う備忘録
2023/11/10追記
Unity向けのプラグインが用意されているので、こちらを使うと良さそうです。
https://github.com/PlayEveryWare/eos_plugin_for_unity
UnityでEpicOnlineServicesを導入した時の備忘録です。
P2Pを利用するまでにつまづいた点など。
手順書というよりは、困った誰かの検索に引っかかれば良いなという感じです。
利用ライブラリ
・EpicOnlineServices C# v1.13
・UniTask (Callbackが多いのでawaitできるようラップ)
必要なもの
・Epicアカウント2個
利用するInterface
P2Pを実装するまでに必要なInterface
https://dev.epicgames.com/docs/services/ja/Interfaces
・PlatformInterface (SDKの起動)
・AuthInterface (DeveloperToolを通してEpicユーザログイン)
・ConnectInterface (ゲームへのログイン)
・LobbyInterface (マッチング・他のユーザのIDを取得)
・P2PInterface (パケット送受信)
導入・Platform・Auth
基本的にはC#(Unityユーザ)向けのページを見れば、各種設定・PlatformInterface・AuthInterfaceまわりは実装できます。
後半のサンプルコードはコピペしたほうが良いです。UnityEditorで動かすための専用処理が含まれていました。
特筆事項
・DeveloperPortalからSDKをダウンロード
・EOS-SDK-CSharp.../SDK をAssets以下のどこかに配置すればOK
・DeveloperPortal設定
・ProductId, SandoboxId, DeploymentIdは製品作成後すぐに取得可能
・Client~の値は「クライアント」タブの「新たなクライアントを追加」
クライアントポリシー:Peer2Peer
・Epicアカウントサービス→パーミッション→リンクされているクライアント を設定
・エラー「Multiple plugins with the same name 'xaudio2_9redist'」
ビルドエラー「Plugin 'xaudio2_9redist.dll' is used from several locations」
SDK/Bin/x64/xaudio2_9diredist, SDK/Bin/x86/xaudio2_9diredistを選択
それぞれPlatform settingsのUnityタブのCPUをx86_64, x86に変更
Windowsタブも同様
Auth (Developer Tool)
開発中のログインはデベロッパー認証ツールを使ったほうが便利そうです。ゲームを開始するたびにパスワードを打ち直す手間を省けます。
ログイン情報を保持するだけのツールのため、LobbyやP2Pでの接続確認のためにEpicアカウントは2つ必要です。
特筆事項
・ログイン時「アプリケーションアクセスが制限されています」と出る
DeveloperPortalの 組織→チーム から招待すればOK
職務はとりあえずEpicAcountService
Connect
Authのログイン時に取得したTokenを用いて、ProductUser(ゲーム固有アカウント)の作成やログインを行います。
ここで最終的に取得できるProductUserIdは、後の処理で使用します。
Lobby
ロビーの作成や参加ができます。LobbyIdや属性を指定してロビーを検索できます。
ここで最終的に取得できる相手のProductUserIdは、後の処理で使用します。
特筆事項
・相手のProductUserIdを取得する方法
・ロビー作成者(ホスト)はNotifyLobbyMemberStatusから取得
・ロビー参加者(ゲスト)はCopyLobbyDetailsHandleから取得
・他のユーザがJoinしてもNotifyが呼ばれない場合
DeveloperToolで同じアカウントを使っていないか確認
P2P
自分と相手のProductUserIdを用いて、Packetを送受信します。
相手のProductUserIdが分かった時点で、とりあえずAcceptConnectionしとけば良さそうです。
特筆事項
・プロトコルは DTLS/SCTP/UDP
SendPacket()のオプションでReliabilityを指定できます。
確実に届ける重要なデータはReliableOrdered(再送あり・順序を保障)
重要でないデータはUnreliableUnordered(再送なし・順序変わるかも)
と、使い分けると良さそうです。
・リレーサーバ?
NAT越えに失敗した場合はリレーサーバに自動で切り替わるらしい。
Androidビルド
Unity向けの情報はまだまとまっていないようです。以下のページを参考にしました。
・https://dev.epicgames.com/docs/services/ja/Platforms/Android
・https://eoshelp.epicgames.com/s/question/0D52L00004jCz7RSAS
やることは以下の通りです。
プラグイン設定
・SDK/Bin/Android/aar/eos-sdk.aarがAndroidだけincludeされるようにチェックを入れる。
・SDK/Bin/Android/libs/以下にあるlibEOSSDK.soはincludeされないようにチェックを外す。(aarに同じ物が入っているため)
・AndroidNDKのディレクトリにあるlibc++_shared.soを、Assets/Android/libs/以下にコピーする。
libc++_shared.soはNDKのsources/cxx-stl/llvm-libc++/libs/以下にあります。(ドキュメントより)
gradle設定
PlayerSettingsのBuild項目からTemplateを追加できます。
・gradleTemplateに以下を記述する。
android.useAndroidX=true
・mainTemplateのdependenciesブロックに以下を記述する。
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.security:security-crypto:1.0.0-rc01'
implementation(name: 'eos-sdk', ext:'aar')
C#コード
・Awake()の中など、EOSを利用する前に以下を記述する。(CreateDeviceIDの実行に必要)
#if UNITY_ANDROID && !UNITY_EDITOR
var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
var context = activity.Call<AndroidJavaObject>("getApplicationContext");
var EOS_SDK_JAVA = new AndroidJavaClass("com.epicgames.mobile.eossdk.EOSSDK");
EOS_SDK_JAVA.CallStatic("init", context);
#endif
調査中の項目
Android用ドキュメントによると、ディスクアクセスに必要なInternalDirectoryやExternalDirectoryの設定が必要そうです。
ドキュメントはもちろんjavaですが、C#SDKのnamespace PlatformにAndroidInitializeOptionsやAndroidInitializeOptionsSystemInitializeOptionsがあるので、これをInitializeOptions.SystemInitializeOptionsにどうにか渡すのかなと予想しています。
設定しない場合はどの機能に支障がでるんだろう。