Open16

PUN2を使ってみる🩲

じょにじょに

①アカウント登録のURLに飛び、登録をする
②新しくアプリを作成するボタンをクリック
③アプリケーション名、説明、URLは後から編集できるので、仮で入力しても問題ない
 ※Photonの種別を「Photon PUN」にする

「Photon PUN」と「Photon Realtime」の違いがいまいち分からない
参考URLが「Photon PUN」なのでこっちでテストしてみる

じょにじょに

UnityでPUN2をDownload→Install
サイトで登録したアプリのIDを入力、セットアップ
※「Window」>「Photon Unity Networking」>「PUN Wizard」>「Settings : Setup Project」でもOK

じょにじょに

①Prefabの名前は「Avatar」にする
②Prefabは「Resources」フォルダーの中に入れる
③GameObjectにはPhotonViewコンポーネントを追加する

じょにじょに

ヒエラルキーに空のObjectを追加して、以下のコードを貼り付ける

using Photon.Pun;
using Photon.Realtime;
using UnityEngine;

// MonoBehaviourPunCallbacksを継承して、PUNのコールバックを受け取れるようにする
public class SampleScene : MonoBehaviourPunCallbacks
{
    private void Start() {
        // PhotonServerSettingsの設定内容を使ってマスターサーバーへ接続する
        PhotonNetwork.ConnectUsingSettings();
    }

    // マスターサーバーへの接続が成功した時に呼ばれるコールバック
    public override void OnConnectedToMaster() {
        // "Room"という名前のルームに参加する(ルームが存在しなければ作成して参加する)
        PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
    }

    // ゲームサーバーへの接続が成功した時に呼ばれるコールバック
    public override void OnJoinedRoom() {
        // ランダムな座標に自身のアバター(ネットワークオブジェクト)を生成する
        var position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f));
        PhotonNetwork.Instantiate("Avatar", position, Quaternion.identity);
    }
}
じょにじょに
PhotonNetwork.Instantiate("Avatar", position, Quaternion.identity);

で"Avatar"じゃなくてもPrefabの名前と一致してれば問題ない。

「Resources」フォルダーじゃなくても大丈夫なようにしたい

じょにじょに

プレイヤー名の表示を試してみるが、参考URLがAvator配下に直接TextMesh ProのコンポーネントがついてるObjectがいるのが不可解。CanvasもないしEventSystemもないしどうやって設定しているんだ。。

じょにじょに

TMPは2種類ある
・Canvasが必要なTMP(UIから作る)
・CanvasがいらないTMP(3Dから作る)

子要素にCanvas→Text(普通の)で、Canvasサイズを変更やWorld Spaceに変更でも可
今回は・CanvasがいらないTMP(3Dから作る)を利用して作る

じょにじょに

TMPのコンポーネントに下のコードをつける

using Photon.Pun;
using TMPro;

// MonoBehaviourPunCallbacksを継承して、photonViewプロパティを使えるようにする
public class AvatarNameDisplay : MonoBehaviourPunCallbacks
{
    private void Start() {
        var nameLabel = GetComponent<TextMeshPro>();
        // プレイヤー名とプレイヤーIDを表示する
        nameLabel.text = $"{photonView.Owner.NickName}({photonView.OwnerActorNr})";
    }
}

SampleSceneのコードのスタート関数に以下を追記

        // プレイヤー自身の名前を"Player"に設定する
        PhotonNetwork.NickName = "Player";
じょにじょに

AvatarControllerをPlayerに追加して自分のPlayerを操作できるようにする

using Photon.Pun;
using UnityEngine;

// MonoBehaviourPunCallbacksを継承して、photonViewプロパティを使えるようにする
public class AvatarController : 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);
        }
    }
}
じょにじょに

オブジェクトの座標を他プレイヤーと自動的に同期してくれる:PhotonTransformViewコンポーネント
を、Playerに追加する