UNET⑧ NetworkStartPositionでスポーン地点を指定
UNETのデフォルトでは、プレイヤーキャラクターオブジェクトは原点(0, 0, 0)に生成されます。このままでは、ゲーム開始時は全員が重なった状態となってしまいます。これではおかしいですよね。
今回は、NetworkStartPositionを使って、スポーン地点を指定してみましょう。
※「スポーン」とは、ゲーム開始時にキャラクターが生成されることを指すゲーム用語で、開始位置のことを「スポーン地点」と呼びます。死んだ後、別の場所に復活して再出撃することは「リスポーン」と呼んだりします。
準備作業
- キャラクターの3Dモデルをダウンロードしておく
- 新規で3Dのプロジェクトを作成する
- ダウンロードしておいた3Dモデルをインポートする
- インポートした3Dモデル(pacchi.fbx)をSceneへ設置する
- Sceneへ設置したpacchiのオブジェクト名を「Player」とする
- PlayerオブジェクトにNetworkIdentityコンポーネントをアタッチする
- Playerオブジェクトをプレハブ化し、Sceneからは削除する
- 空のオブジェクトを作成する。名前は「NetworkManager」としておく
- NetworkManagerオブジェクトにNetworkManagerコンポーネントとNetworkManagerHUDコンポーネントをアタッチする
- NetworkManagerのSpawn Info>Player Prefab欄にPlayerプレハブを登録する
ここまでは、NetworkStartPositionとは無関係な、UNETでネットワークゲームを作る際の典型的な作業になります。
NetworkStartPositionを使ってスポーン地点を指定
空のオブジェクトを生成します。オブジェクト名は「StartPosition」とかにしておきましょう。
作ったStartPositionオブジェクトにNetworkStartPositionコンポーネントをアタッチします。
NetworkStartPositionは、設定項目などが一切無い、極めてシンプルなコンポーネントです。
で、あとはこのStartPositionオブジェクトを、好きなだけ複製して、スポーン地点としたい場所に設置するだけです。
なお、このままだとSceneビューで見えなくて不便なので、アイコンを設定しておくと見やすくて良いかと思います。
StartPositionオブジェクトを適当に複製して好きな場所に設置したら、ゲームを複数起動して動作確認してみましょう。
スポーン地点の決定方法
たくさんあるスポーン地点のどこにプレイヤーが生成されるのか、その決定方法を2種類から選べます。
NetworkManagerのSpawn Info>Player Spawn Method で選びます。
Random
NetworkStartPositionが付いたオブジェクトの中からランダムに選ばれます。複数のプレイヤーが連続して同じ場所からスポーンすることもあります(その場合は重なります)。
Round Robin
順番にスポーンしていき、最後まで行ったら最初に戻ります。なお、順番は指定できません。
向きも指定できる
実はNetworkStartPositionで指定できるのは位置だけではありません。Rotationも反映されます。StartPositionオブジェクトを回転させておけば、このようになります。
まあ・・・Y軸回転以外は、まず使わないと思いますが・・・💧
痒いところに手が届かない
NetworkStartPositionの使い方は以上です。
実のところ、誠に残念ながら、痒いところに手が届かない、あんまり使えない機能です・・・(今更言うな)
ネットワークゲームといえば、チーム対戦とかしたいと思いますが、NetworkStartPositionだと実現できないんですよね。チーム別にスポーン地点を登録できないので。
NetworkStartPositionが使えるのって「自分以外みんな敵」というバトルロイヤルなゲームだけじゃないですかね?
NetworkManagerを改造すれば、プレイヤーを好きな場所にスポーンさせることができるので、結局、大抵の場合はそうすることになります。NetworkStartPositionはそれまでのつなぎというか、簡易的な動作確認用というか、そんな位置付けです(少なくとも私の中では)。