UE4にSteamworksSDKを導入（未解決）

#はじめに
ちょっとした気の迷いでUE4にSteamのオーバーレイ的なイロイロを導入してみたくなった。
手順は[UE4のドキュメント](https://docs.unrealengine.com/ja/Programming/Online/Steam/index.html)に載ってるので書く必要もないけど、沼にハマっているのでメモ感覚でQiita行。
なお初記事。

# 導入
UE4もSteamworksSDKも現時点の最新版を使う。

- UnrealEngine 4.25.1
- Steamworks sdk 1.49

## 事前準備
（インストールしていない方がこの記事を見るハズないと思いますが）Steamクライアントが必要。
インストールとログインを済ませてください。

[ダウンロード](https://store.steampowered.com/about/)

## Steamworks SDKのダウンロード
ここからダウンロードできる。
https://partner.steamgames.com/downloads/steamworks_sdk.zip
Steamでリリースする場合はSteamDirectで色々と登録したり、1万円払う必要がありますが、試す分には何もする必要ナシ。
（参考：[Steamworks SDKのドキュメント](https://partner.steamgames.com/doc/sdk)）

## SDKの配置
ダウンロードしたsteamworks_sdk_149.zipを解凍。
解凍したsdkディレクトリを
C:\Program Files\Epic Games\UE_4.25\Engine\Source\ThirdParty\Steamworks\Steamv149\sdk
に配置。Steamv149ディレクトリは作ってください。
（UE4のパスは言わずもがな自分のインストールした場所にどうぞ。）

### Steamworks.build.csの設定
デフォルト以外のバージョンを利用する場合、Steamworksフォルダ内のSteamworks.build.csに手を加える必要がある。
SteamVersionNumberを1.49に設定すればOK。上の方にあるはず。

```csharp:Steamworks.build.cs
        // The current SDK version number.
        double SteamVersionNumber = 1.49;
```

## DLLの配置
DLLも最新版用に設置しないといけない？らしい。
C:\Program Files\Epic Games\UE_4.25\Engine\Binaries\ThirdParty\Steamworks\
にSteamv149ディレクトリを作り、さらにその中にWin32,Win64ディレクトリを作る。
そして以下のように配置する。

- Win64
    - steam_api64.dll
    - steamclient64.dll
    - tier0_s64.dll
    - vstdlib_s64.dll
- Win32
    - steam_api.dll
    - steamclient.dll
    - tier0_s.dll
    - vstdlib_s.dll

steam_apiとsteam_api64は先ほど配置したsdkの中のredistributable_binディレクトリの中にある。
それ以外のDLLはSteamクライアントディレクトリの中にある（C:\Program Files (x86)\Steam）。
全てコピーしてきて配置する。

## プロジェクトの設定
### iniの設定
ここからはプロジェクトの設定。
Steamworks SDKを導入したいプロジェクトディレクトリを開き、Configディレクトリ内のDefaultEngine.iniを編集する。
iniファイル内の最終行以下に次の文を追加する。

```ini:DefaultEngine.ini
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
```

ちなみにここのSteamDevAppIdの480は、開発者向けに用意されたID。
リリースするときはこのIDを固有のIDに置き換えないと動作しない。

### プラグインの設定
最後に、UE4エディタの方でプラグインを有効化する。
エディタ上部の「編集＞プラグイン」の検索ボックスに「OnlineSubsystem」と入力し、

- Online Subsystem
- Online Subsystem NULL
- Online Subsystem Utils
- Online Subsystem Steam

を有効化する。iOS,GooglePlayとかも有効化されてるかもしれないが、たぶん切っても切らなくても影響しない、と思う。
詳しいことは知らない。

# テストプレイ
ここまでの手順を終えれば、Steamworks SDKの導入は完了しているはず。
スタンドアローンゲームを選択してプレイする。
上手くいっていれば、右下にいつものSteamのポップアップが表示される。

# が、うまくいかないのである
ここまで公式ドキュメント通りに進めてきたはずなのだが、うまくいかない。
エディタのアウトプットログを見てみると、

*LogSteamShared: Warning: SteamAPI failed to initialize, conditions not met.*

とエラーが。
しかも、「Steam」で検索をかけてみると、プラグイン読み込み時に

*LogSteamShared: Display: Loading Steam SDK 1.47*
*LogSteamShared: Steam SDK Loaded!*

とログが。
結局読み込まれてるのがデフォルトバージョン。

**ナンモウマクイッテナイ！！！**

#終わりに
駄記事生産してごめんなさい。
いろいろ調べてでき次第更新します。

## 参考記事一覧

- [Online Subsystem Steam | Unreal Engine Documentation](https://docs.unrealengine.com/ja/Programming/Online/Steam/index.html)
- [Steamworks SDK (Steamworks ドキュメント)](https://partner.steamgames.com/doc/sdk)
- [UE4のOnlineSubsystemをさわってみた](https://qiita.com/mechamogera/items/312333b165b4b9940f09)
- [Setup Unreal Engine for Steam Multiplayer Game | by takoji3 | Medium](https://medium.com/@takoji3/setup-unreal-engine-for-steam-multiplayer-game-e73cc5d4f99f)