Unityでオンラインマルチプレイ対応4-キャラクターを登場させる-

記事内に広告が含まれています。

今回はユーザーがサーバーに接続したら操作キャラクターをゲームの世界に登場させます。

前回でPhoton Cloudのサーバーに接続する事が出来るようになりました。

Unityでオンラインマルチプレイ対応3-ネットワーク接続処理-
Unityでマルチプレイヤーのゲームに対応する為、ネットワークに接続する為のスクリプトの作成とUIを作成していきます。

登場させるキャラクターは

Unityでオンラインマルチプレイ対応1-まずは動くキャラ作り-
UnityでPhotonCloudを使ったリアルタイムのオンライン対応をしていきます。今回はオンライン対応する前の主人公と敵キャラクターを作成していきます。

で作成したEthanになります。

スポンサーリンク

EthanにPhotonViewを取りつけプレハブにする

マルチプレイ1の記事で作成したEthanはあらかじめヒエラルキー上に配置していました。

しかしネットワーク対応する場合は自分のゲーム世界ではなくネットワーク上にキャラクターを登場させなくてはいけません。

ネットワーク上にキャラクターを登場させる為にはキャラクターにPhotonViewコンポーネントを取りつけます。

Add Component→Photon Networking→PhotonViewを選択します。

PhotonViewを取りつけたらEthanをProjectタブのAssetsフォルダにPrefabsというフォルダを作成し、さらにその中にResourcesという特殊フォルダを作成しその中にドラッグ&ドロップしてプレハブにします。

敵キャラクターもPhotonViewを取りつけ同じようにPrefabs/Resourcesフォルダの中にドラッグ&ドロップしプレハブ化しておきます。

Resourcesフォルダに入れる理由はネットワーク上にキャラクターをインスタンス化する時にResourcesフォルダにプレハブを入れる必要があるからです。

プレハブにしたEthanをネットワーク上でインスタンス化

プレハブにしたEthanをネットワークに登場させましょう。

前回ネットワークに接続する事が出来ましたが、部屋に入室したと同時にネットワーク上にキャラクターをインスタンス化します。

NetworkManagerスクリプトに処理を追加します。

OnJoinedRoom内でコルーチンをスタートさせます。

SetPlayerメソッドではPhotonNetwork.Instantiateを使ってネットワーク上にキャラクターをインスタンス化します。

PhotonNetwork.Instantiateで指定するプレハブは文字列で指定し、EthanはResourcesフォルダの直下に入れておく必要があります。

これでプレイヤーが入室した時にゲームの世界に操作キャラクターが登場する事になります。

ネットワーク上にキャラクターが登場するか確認

それでは確認してみましょう。

↑のようにアプリケーションを2つ起動した後、ログインするとEthanが登場しました。

ログインした方のキャラクターをキーボードの移動キーで動かし移動させた後、もう一方の方も同じ部屋にログインします。

最初にログインしたアプリケーションの方に別のキャラクターが登場しました!

これでマルチプレイが出来る!と単純にいけばいいんですが、最初のアプリケーションの方でキャラクターを動かすと後から登場した別のプレイヤーキャラクターも一緒に動いてしまいます。

これは自身のアプリケーションに他のキャラクターは登場したんですが、このキャラクターも自身のキャラクターと同じように移動させるCharaスクリプト等が設定されている為です。

また最初のアプリケーションでキャラを動かした後に後で起動したアプリケーションの方を見るとキャラクターが動いていません。

これは他のキャラクターのデータが自身のアプリケーションにいる他のキャラクターにシンクロしてデータを渡していないからです。

自分のキャラクター以外は動かさないようにする

自身のキャラクターと同様、他のプレイヤーのキャラクターもCharaスクリプトを持っているので一緒に動いてしまいます。

そこで自身のキャラクター以外は操作出来ないようにキャラクター操作スクリプト等を無効化させます。

EthanにNetworkPlayerCheckというスクリプトを作成し取りつけます。

NetworkPlayerCheckはPhoton.PunBehaviourを継承して作成します。

photonView.isMineでPhotonViewが自身のものかどうかを判定し、違う場合はCharaスクリプト、ProcessAttack、Attackなど自分のキャラクター以外の操作はいらないので無効化しておきます。

これでキャラクターを操作した時に他のキャラクターが一緒に動く事はなくなります。

他のプレイヤーのデータをシンクロさせる

他のプレイヤーがキャラクターを動かした時に自分のアプリケーション内にいる他のキャラクターが動くようにします。

これをするにはキャラクターに取り付けたPhotonViewのObserved Componentsにシンクロ(同期)させるコンポーネントを設定します。

とりあえず移動値だけを反映させてみましょう。

EthanのPhotonViewのObserved Componentsに自身のTransformをドラッグ&ドロップします。

Observed ComponentsにTransformを設定

↑のように設定したらEthanのインスペクタのApplyを押しプレハブに反映し、Ethanを非表示にしておきます。

他キャラクターの移動値がシンクロするか確認する

それでは2つアプリケーションを起動しお互いのキャラクターを操作した時に相手方にいる自分のキャラクターが動くかどうか確認しましょう。

自身のキャラクターを動かすと相手方のアプリケーションでもキャラクターが移動しているのが確認出来ます。

しかし今回Observed Componentsに設定したのはTransformコンポーネントだけなので同期するのは移動値だけです。

その為、攻撃したり歩くアニメーションになったりということは同期されていません。

他キャラクターの移動値やアニメーションをスクリプトで同期させる

Observed Componentsに指定出来るのはコンポーネントなのでスクリプトも同期させる事が出来ます。

そこでキャラクターの移動値やアニメーションのフラグ等をスクリプトで同期させるようにします。

NetworkPlayerCheckスクリプトに追記していきます。

Startメソッド内で自身のキャラクターでなかったら(他のプレイヤーキャラを自身のアプリ上に登場させたキャラ)コルーチンを使ってUpdateMoveメソッドを呼びます。

キャラクターの位置や回転を現在の値からデータとして受け取った値にLerpを使って徐々に変更します。

Lerpを使う事で通信の度に断続的なデータで更新してカクカク動かず滑らかに動いているように見えます。

またアニメーションの遷移条件も受け取りアニメーション遷移もさせるようにします。

Observed Componentに設定したスクリプトではOnPhotonSerializeViewメソッドが呼ばれます。

データが読み込みであればそのstream.ReceiveNextでデータを受け取りデータのキャストをした後に変数に入れています。

データの書き込みであれば現在の位置や回転、アニメーションの操作値をSendNextを使ってデータとして送ります。

読み込みと書き込みのデータの順番は統一しておく必要があります。

これでデータの同期も出来ました。

PhotonViewのObserved Componentsには自信(Ethan)のTransformを設定していましたが、それを削除し、今作成したNetworkPlayerCheckスクリプトを設定します。

PhotonViewのObserved ComponentsにNetworkPlayerCheckスクリプトを設定

他のキャラクターが同期されるか確認する

アプリケーションを2つ実行し、同じ部屋に入室させてください。

片方のキャラクターを移動させたり攻撃ボタンを押すともう一方のアプリケーションで他のキャラクターが同期して動いているのが確認出来ると思います。

あ・・・すでにキャラクター名が表示されてしまってますが、これは次回やる予定なので無視してください。

終わりに

いやぁとうとう他のキャラクターの同期まで出来ましたね!

こんなに簡単にマルチプレイが実現出来るようになってるんですねぇ、すごいです。

と言ってもやっぱり難しいですが・・・・(^_^;)

慣れれば当たり前になっていくんでしょうね・・・・・・(-_-)

次回はプレイヤー毎に名前を表示したり、敵を攻撃して他のキャラクターと敵の情報を共有させていきます。

タイトルとURLをコピーしました