はじめに
こんにちは、避雷です。今回は現在開発中の「BoosterBoots」というゲームで複数のコントローラを一つのPCに接続するタイプのマルチプレイを実装する過程で得た知見を公開します。というか助けて…
https://twitter.com/lucknknock/status/1095883926503968768
実装
Input.GetJoystickNames().Lengthの利用
Unityでゲームパッドの接続台数を調べる
こちらの記事を参考にして接続されたコントローラの個数を取得しようとしました。
var controllerNames = Input.GetJoystickNames();
Debug.Log(controllerNames.Length);
この手法はランタイム中にコントローラの抜き差しが発生しない状態では正しい個数を取得できるのですが、ランタイム中にコントローラの抜き差しが発生すると、「コントローラ名が""(空白)のコントローラが存在する扱いになる」という不具合があり、コレのせいで抜き差しするたびに接続コントローラ数が増えたり増えなかったりします。
対策方法
誤って生成されるコントローラは常に""(空白)という名称なので、これを除去してあげてカウントすれば正しいコントローラ個数を取得することができます。
string[] cName = Input.GetJoystickNames();
currentConnectionCount = 0;
for (int i = 0; i < cName.Length; i++)
{
if(cName[i] != "")
{
currentConnectionCount++;
}
}
こうすれば正しいコントローラ数を取得できます。
残る問題点
今回の解決策は決して抜本的なものではなく、その場しのぎの杜撰な対応なので、Unityのコントローラ同時接続周りの滅茶苦茶具合が直ったわけではありません。残るバグの一例として
- コントローラの接続順が入れ替わる
- 存在しないはずのコントローラが接続される
- そもそもキーコンフィグを動的に変更できない
などがあります。Unity2018.3から実装された新しいInputSystemではある程度改善されているらしいのですが、いかんせん資料が少ないです…
Unity2018.2以前でこれをやるにはお高めのアセットを買うしかなさそうで結構辛いです。誰か助けて…