[備忘録] Epic Online Services(EOS)をUnityで動かしてみる (導入～フレンド情報の取得)

この記事は、Epic Gamesが提供しているEpic Online Services(EOS)を少し触った内容について、備忘録も兼ねて記載したものとなります。

EOSで何ができるのかを知りたい方は以下の動画で説明されておりますので、ご視聴いただくのが良いかと思います。
[Epic Online Services でできること](https://www.youtube.com/watch?v=ASfE0T_-cmI)

参考にさせていただいたものは以下になりますので、詳細を確認したい方はそちらをご確認ください。

- [Epic Online Services ドキュメント](https://dev.epicgames.com/docs/services/ja/index.html)
- [Unity + Epic Online Services でオンラインゲームを作ろう](https://qiita.com/okatom/items/654c31eea7d4009a6a08)
- [【技術解説】Epic Online Serviceを試してみた](https://note.com/thedesignium/n/n32dc2a0a6d9b)


# 概要
Unityでオンラインゲームを作るにあたって、サーバーを自前で用意せずに実装する方法を調べていたところ、EOSではそれができそうだったので触ってみることにしました。
(無料であり、かつ様々なPFで利用できるところが魅力的)

今回はまず「Epic Games内のフレンド情報を取得する」までの実装を行いました。
(ゲームとして動くものはまた別の記事で…)

## 動作環境
- OS: Windows 10
- Unity: 2019.4.26f1
- EOS: v1.11(C#)

## 事前準備
[デベロッパーポータルサイト](https://dev.epicgames.com/portal/ja/my-team-pontamaru)にてアカウントの設定やプロジェクトの作成を行います。

以下の動画を参考に設定しました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/NOoLPGENwrg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

基本的には動画の通り設定していれば問題なさそうでした。
Client Policyの設定については、以下ドキュメントを参考に設定しました。
(今回はClient PolicyのタイプをPeer2Peerで設定しました。)
[クライアント資格情報とクライアント ポリシーの管理](https://dev.epicgames.com/docs/services/ja/DevPortal/ClientCredentials/index.html)
<img width="500" alt="PolicyType.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464992/8eb828c6-a1a1-0a2b-f556-ced31e2f49d5.png">

## 実装
[公式ドキュメント](https://dev.epicgames.com/docs/services/ja/CSharp/GettingStarted/index.html)を参考に進めることで初期化からログインまでは実装できました。
フレンド情報取得についてはドキュメントにサンプル等がなかったため以下で少し説明を入れておきます。

※以下で記載されている、UnityEditor上でのバグはまだ治っていないようでした。
https://qiita.com/okatom/items/654c31eea7d4009a6a08#%E7%B4%B0%E3%81%8B%E3%81%AA%E5%95%8F%E9%A1%8C

#### 自身のLocalUserIdの取得
まずログイン時のコールバックで受け取れる自身のLocalUserId(EpicAccountId)を保持しておきます。
後ほどフレンド情報を取得するときにこちらのIDを利用します。

```C#
// ログイン処理
EOSSDKComponent.Instance.Auth.Login(loginOptions, null, (LoginCallbackInfo loginCallbackInfo) =>
{
	if (loginCallbackInfo.ResultCode == Result.Success)
	{
		Debug.Log("Login succeeded");

		// ここで自身のLocalUserId(EpicAccountId)をキャッシュしておく
		EOSSDKComponent.Instance.SetLocalUserId(loginCallbackInfo.LocalUserId);
	}
	else if (Common.IsOperationComplete(loginCallbackInfo.ResultCode))
	{
		Debug.Log("Login failed: " + loginCallbackInfo.ResultCode);
	}
});
```

#### フレンド情報の取得
フレンド情報を受け取る処理は以下になります。
はじめにフレンドの人数を取得し、その人数分 [GetFriendAtIndex()](https://dev.epicgames.com/docs/services/ja/API/Members/Functions/Friends/EOS_Friends_GetFriendAtIndex/index.html) を回して、各ユーザーの EpicAccountId を取得します。
取得した EpicAccountId を用いることでその他の情報も取得できるようになります。
今回の実装ではフレンドの EpicAccountId を取得するまでとなります。

```C#
private List<EpicAccountId> GetAllFriendInfo()
{
	var friendsCountOptions = new GetFriendsCountOptions()
	{
		// ログイン時のコールバックで受け取ったLocalUserIdを用いる
		LocalUserId = EOSSDKComponent.Instance.GetLocalUserId()
	};
			
	// フレンドの人数を取得
	var friendsCount = EOSSDKComponent.Instance.Friends.GetFriendsCount(friendsCountOptions);

	// フレンドの人数分データの取得処理を回す
	var listEpicAccountId = new List<EpicAccountId>();
	for (var i = 0; i < friendsCount; i++)
	{
		var friendAtIndexOptions = new GetFriendAtIndexOptions()
		{
			LocalUserId = EOSSDKComponent.Instance.GetLocalUserId(),
			// ここで渡すインデックスによって受け取れるユーザーの情報が変わる
			Index = i
		};

		var epicAccountId = EOSSDKComponent.Instance.Friends.GetFriendAtIndex(friendAtIndexOptions);
		listEpicAccountId.Add(epicAccountId);
	}

	return listEpicAccountId;
}
```

## 動作確認
### 準備
動作確認をするにあたって、いくつかテストアカウントを作成しておく必要があります。
作成したアカウントはデベロッパーポータルサイトにて同じ組織に追加しておきます。
![EOS_TeamInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464992/e5b236ca-d0b5-516b-8eb9-6d9f5a6fb24e.png)

また、フレンド情報の確認をするため、フレンド登録の方もすませておきます。
![friend_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464992/672aba09-015e-6bbb-5eed-036bcce8242d.png)

### LocalUserIdの確認
EOS DevAuthToolを用いて、各ユーザーのLocalUserId(EpicAccountId)を確認し、メモしておきます。
上記IDは後ほどの動作検証時にうまくデータが取得できているかの確認で使います。
EOS DevAuthToolについては [こちら](https://qiita.com/okatom/items/654c31eea7d4009a6a08#eos-devauthtool-%E3%82%92%E8%B5%B7%E5%8B%95) を参考にしてください。
![TestUserInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464992/6573e5f0-081b-a3cd-8f12-5f56bd1fabe1.png)

### 実行
実装したものをビルドして、実際に動かしてみます。

実行時の様子は以下になります。
(ボタンやID表示等のUI周りは適当に実装したものです)
![EosFriendView.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464992/61262767-6e0b-c910-5f43-084adca89a1c.gif)
以下のようになりましたので、うまく動作していそうです。

- ログインボタンを押した際にブラウザが立ち上がりログイン画面やアプリケーション認可画面の表示される
- ログイン後自身のLocalUserId(EpicAccountId)が取得できている
- フレンド登録している人数分のフレンド情報(EpicAccountId)が取得できている
- 上記IDがメモしていたものと一致していることを確認

取得したEpicAccountIdを用いることでそのユーザーの追加情報の取得も行えます。
以下[公式ドキュメント引用](https://dev.epicgames.com/docs/services/ja/Interfaces/Friends/index.html#フレンドリストを調べる)。
>この関数によって返された EOS_EpicAccountId を User Info Interface に渡すことで、ユーザーに関する追加情報を取得できます。

一旦はIDの取得までができたので、今回は以上とさせていただきます。


## 最後に
今回はゲームとして組み込むところまでは実装できず、とりあえず動かしてみるまでで終わってしまいました。
次回はP2P接続を行ってキャラクターを動かしてみたりしたいと思います。
<br>
間違った情報等ありましたらご指摘いただけますと幸いです。