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 (パケット送受信)

導入PlatformAuth

基本的には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にどうにか渡すのかなと予想しています。
設定しない場合はどの機能に支障がでるんだろう。

この記事が気に入ったらサポートをしてみませんか?