今回はUnityオンラインゲーム(複数人で遊ぶマルチプレイヤーゲーム)でキャラを動かし、同期させる方法のメモです。PhotonUnityNetworking2(PUN2)を利用していきます。
はじめに
前回はとりあえずPUN2の導入をしました。今回はその続きで、「キー入力」でキャラを動かし、相手の画面に反映(同期)させます。
参考サイト様
今回もPUN2(PhotonUnityNetworking2)で始めるオンラインゲーム開発入門さまを参考にしています。
ゲーム作成開始
では、さっそく作成していきます。
ラベルの追加
現状だとどちらが自分のキャラなのか判断がつかないので、識別するためにラベルを追加します。
Playerのプレハブを開いて「空のオブジェクトを作成」
NameTxtに変更してコンポーネントを追加から「TextMeshPro – Text」を追加。
位置やフォントサイズを変更していい感じにします。Textの中身はとりあえず「Player(0)」にしておきます。ここで設定するテキストの中身は仮です。
次にコンポーネントを追加から「新しいスクリプト」を追加。スクリプト名は「PlayerNameDisplay」としておきます。スクリプト内で動的にプレイヤー名を変更していきます。
スクリプトの中身を下記にします。テキスト(ラベル)をセットしています。
using Photon.Pun; using TMPro; public class PlayerNameDisplay : MonoBehaviourPunCallbacks { private void Start() { var nameLabel = GetComponent<TextMeshPro>(); nameLabel.text = $"{photonView.Owner.NickName}({photonView.OwnerActorNr})"; } }
次にSampleSceneのスクリプトに1行追加します。
PhotonNetwork.NickName = "Player";
変更が終わったらビルドを行い、2つアプリを起動します。一つ目に起動した方がPlayer(1)、2つ目に起動した方がPlayer(2)となればOK
プレイヤー移動と同期
次にキー入力でオブジェクトを動くようにして、相手の画面にも反映されるようにします(同期)。イメージとしては下記のような感じで、上の画面でPlayer(1)を操作したら下の画面でも動くというものです。
Playerのプレハブを開き、新しいスクリプトを追加します。名前は「PlayerController」にしておきます。
スクリプトの中身は下記に変更します。
using Photon.Pun; using UnityEngine; public class PlayerController : MonoBehaviourPunCallbacks { private void Update() { if (photonView.IsMine) { var input = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0f); transform.Translate(6f * Time.deltaTime * input.normalized); } } }
最後にPlayerのプレハブにコンポーネントを追加から「Photon Transform View」を追加して完了。
ビルドして2つ起動。動かしてみて同期すればOK。