今回はUnityNetworkを使用したオンライン対応の第5回で、プレイヤーキャラクターの登場位置をいくつか作成し、そのどれかから出現するようにしてみます。
また、プレイヤーキャラクターのHPが0以下になった時は、すぐに復活して登場するようにしていきます。
死んでもすぐに復活するのでゾンビのように永遠に死なず生き返ってきます。(^_^;)
前回はHPの表示機能とキャラクターの攻撃機能を作成しました。
プレイヤーキャラクターの登場位置を作成
まずはプレイヤーキャラクターの登場位置を作成していきます。
登場位置の作成する
ヒエラルキー上で右クリック→Create Emptyを選択し名前をSpawnPointsとします。
SpawnPointsの子要素に空のゲームオブジェクトを作成しSpawnPoint1とします。
SpawnPoint1のインスペクタからAdd ComponentからNetwork→NetworkStartPositionを取り付けます。
SpawnPoint1をCtrl+Dキーでコピーし、プレイヤーキャラクターを登場させたい数だけ増やし、それぞれのSpawnPointを移動させて登場させる位置を変更します。
階層は↑のような感じにし、4つの登場位置を作成しました。
SpawnPointのそれぞれは
↑のようにNetworkStartPositionコンポーネントを設定しています。
シーンビューで登場位置をどこに設定したかわかりやすくする為に、名前の横のアイコンを押し、アイコンの設定をしています。
↑のようにどこに登場位置を設定したかわかるようになりました。
登場位置の選択法
登場位置の作成が終わったので、次はNetworkManagerゲームオブジェクトのNetworkManagerコンポーネントでどのようにプレイヤーキャラクターが登場するかの設定をします。
NetworkManagerのSpawn InfoのPlayer Spawn MethodでRandomかRoundRobinを選択します。
RandomはNetworkStartPositionを設定した位置にランダムに設定し、RoundRobinは循環して設定します。
今回はRoundRobinに設定してみます。
それではいくつかアプリケーションを起動し、プレイヤーキャラクターがSpawnPointに登場するか見てみましょう。
RoundRobinに設定したので、循環してプレイヤーキャラクターが配置されてますね。
Gameビューで表示がおかしくなってますが、おそらく動画の撮影の関係かと思います・・・・(^_^;)
プレイヤーキャラクターのリスポーン
次はキャラクターのHPが0以下になった時にHPを全回復させ、NetworkStartPositionの位置に再設定するようにします。
UStatusスクリプトのSetHpメソッド内を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void SetHp(int hp) { if (!isServer) { return; } this.hp = hp; if (this.hp <= 0) { // HPを全快にする this.hp = maxHp; // クライアントRPCを使用してキャラクター位置を設定 RpcRespawn (); } hpText.text = this.hp.ToString (); } |
SetHpではサーバーのみ動作するようにして、hpが0以下になったらHPを全回復させ、その後クライアントRPCメソッドとして作成したRpcRespawnを呼び出します。
hpはSyncVarで同期させている為、サーバーでhpを書き換えるとクライアントのhpも書き変わります。
HPをサーバーのみで減らし、それぞれのクライアントのRpcRespawnを呼び出して位置を再設定出来ます。
RpcRespawnは以下のようになります。
1 2 3 4 5 6 7 8 9 | [ClientRpc] public void RpcRespawn() { if (isLocalPlayer) { // キャラクター位置をNetworkStartPositionの位置に設定 transform.position = NetworkManager.singleton.GetStartPosition ().position; } } |
クライアントRPCコールで呼び出されるので[ClientRpc]アトリビュートを取り付けます。
自身のキャラクターであればそのキャラクターをNetworkStartPositionを設定した位置に再設定します。
サーバーから全てのクライアントのRpcRespawnメソッドが呼ばれるので、自身の操作キャラクター(ローカルプレイヤー)だけの位置を設定します。
それではいくつかアプリケーションを起動し確認してみます。
↑のようになりました。
攻撃のモーションの影響でだいぶ敵にダメージを与えるのに苦労してますが・・・(^_^;)
HPが0以下になったらHPを全回復して、NetworkStartPositionのどこかに移動しました。
見てわかる問題としては、HPを全回復した後に位置を移動しているところですね。
普通ならばログイン画面に戻したり、しばらく参加出来ない等の処理が必要になると思います。
まぁそれは少しづつ出来たらなと思いますが、今回の記事ではスルーしておきます。
サーバーでHPを回復し、RPCコールでクライアントの位置を設定というところが出来たので良かったかなと思います。
次回はプレイヤーキャラクターとは別にNPC(ノンプレイヤーキャラクター)を登場させてみようと思います。