GoogleAdsence

Unityで始めるオンラインゲーム制作 Photon Pun2超入門

2020年3月31日

こんにちはジェイです。みなさんはUnityでオンラインゲームを作りたいと思ったことはありますか?もし今からオンラインゲームを作るのであれば、Photonの新しいバージョンであるPun2で制作するのをおすすめします。

Photon Pun2導入

導入の手順は公式サイトであるこちらを参考にするのがよいです。 4. アプリケーションIDを入力してセットアップ完了まで終わらせればOKです。

実装

これで実装できます!オンライン上でCubeを動かすとこまで一気にやってしまいましょう。スクリプトファイルを作成し以下のコードを記述する。 簡単に解説すると、Start関数でPUNの設定ファイルを読み込み、
後ほど作成する「chara」プレハブをログイン後に生成するというスクリプトになります。

using UnityEngine;
using System.Collections;
using Photon.Pun;
using Photon.Realtime;

public class SimplePun : MonoBehaviourPunCallbacks
{

    // Use this for initialization
    void Start()
    {
        //旧バージョンでは引数必須でしたが、PUN2では不要です。
        PhotonNetwork.ConnectUsingSettings();

        if (string.IsNullOrEmpty(PhotonNetwork.NickName))
        {
            PhotonNetwork.NickName = "player" + Random.Range(1, 99999);
        }
    }

    void OnGUI()
    {
        //ログインの状態を画面上に出力
        GUILayout.Label(PhotonNetwork.NetworkClientState.ToString());
    }


    //ルームに入室前に呼び出される
    public override void OnConnectedToMaster()
    {
        // "room"という名前のルームに参加する(ルームが無ければ作成してから参加する)
        PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default);
    }

    //ルームに入室後に呼び出される
    public override void OnJoinedRoom()
    {
        //キャラクターを生成
        GameObject chara= PhotonNetwork.Instantiate("chara", new Vector3(0.0f,0.5f,0.0f), Quaternion.identity, 0);
        //自分だけが操作できるようにスクリプトを有効にする
        CharaScript charaScript = chara.GetComponent<CharaScript>();
        charaScript.enabled = true;
    }
}

次に Hierarchy上で右クリック、Create Emptyをクリックし、空のGameObjectを作成し、SimplePun.csのスクリプトをアタッチしましょう。

その次は、 Hierarchy上で右クリック 、3DObject→Cubeを選択し、以下のスクリプトをアタッチする。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharaScript : MonoBehaviour
{
    void Start()
    {

    }

    void Update()
    {
        if (Input.GetKey("up"))
        {
            transform.position += transform.forward * 0.05f;
        }
        if (Input.GetKey("down"))
        {
            transform.position -= transform.forward * 0.05f;
        }
        if (Input.GetKey("right"))
        {
            transform.Rotate(0, 100 * Time.deltaTime, 0) ;
        }
        if (Input.GetKey("left"))
        {
            transform.Rotate(0, -100 * Time.deltaTime, 0);
        }
    }
}

以下の画像を参考に、Componentを追加していきましょう。
追加対象は手順は以下になります。

  • Photon View
  • Photon Transform View (追加後、「Observed Component」に Photon Transform View を追加してください。)

※CharaScriptはチェックボックスを外してください。

作成した 「chara」 のプレハブを/Photon/Resources配下に配置してください。
※配置後はHierarchy上の 「chara」 は不要ですので削除しましょう。

実行結果

PunとPun2の違い

1つ目

Photon.MonoBehaviour
これは一番最初に困るところ。MonoBehaviourPunMonoBehaviourPunCallbacksを使えばOKです。

2つ目

public override void OnJoinedLobby()
ロビーに接続する時に使う関数。代わりにpublic override void OnConnectedToMaster()を使えます。

3つ目

public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)そして入室失敗した時の処理、これはルームがなくて入室失敗した際にルーム自分で作るよーって処理。Pun2の場合はわざわざ失敗した時の処理を書いて作成せずにOnConnectedToMasterPhotonNetwork.JoinOrCreateRoom(“room”, new RoomOptions(), TypedLobby.Default);
を使う事によってroomという名前のルームに参加(なければ作成)ということができます。

4つ目

PhotonNetwor.inRoomとか、photonView.isMineとかのis,inシリーズ
これらの対処は簡単で、iを大文字にするだけで対応してくれます。

PhotonMessageInfoの要素のsenderSenderに、IDUserIDに変更
sender.IDSender.UserIdに変更することで対応できます。
また ownerOwnerに代わってます 。

5つ目

PhotonNetwork.ConnectUsingSettings(_gameVersion);
_gameVersionを消すだけで解決します。

6つ目

PhotonNetwork.playerName
これはplayerNameをNickNameに変えれば、解決します。
PhotonNetwork.playerPhotonNetwork.LocalPlayerで代用ができます。

7つ目

photonView.RPC(“chat”,Targets.All,~省略~);
Pun2だとTargets.Allがなくなったようです。RpcTarget.Allに変えることで対処できます。

8つ目

PhotonNetwork.player.ID;
これはint型が返されますがPhotonNetwork.LocalPlayer.UserId;はstring型が返されます。

using Photon.Pun;
using Photon.Realtime;
の上の2つを追加するのも忘れない様にしましょう。

以上PunとPun2の違いで気づいた点について、まとめてみました。 以下に詳しく書いてあるのでよかったら参考にしてください。

PunとPun2の違い 参考文献