読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Photon Unity Networkingを使ってみた

こんにちわ。
エンジニアブログを担当します乾です。
よろしくお願いします。

最近触る機会があったPUN(Photon Unity Networking)について書きたいと思います。
PUNの特徴は

インディー・プロのディベロッパー問わず、誰でも
リアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能なところです。

「導入編」

「1:アカウント登録」

ここからメールを送りアカウント登録を行ってください。
スクリーンショット 2015-07-17 2.03.12
登録作業でクーポンの有無を聞かれますが、もっていなくても問題ありません。


「2:アセットのインポート」

AssetStoreを開きPhoton Unity Networking Freeをインポートします。
スクリーンショット 2015-07-21 23.12.09
有料版もありますが、今回は無料版をダウンロードします。
ダウンロードが済んだらインポートしてください。
スクリーンショット 2015-07-17 1.51.32


「3:PUNをセットアップ」

インポート後にウィンドウが表示されるのでSetupProjectをクリックします。
スクリーンショット 2015-07-21 23.41.29
次にアプリケーションIDを入力し完了です。
スクリーンショット 2015-07-17 2.39.50
アプリケーションIDはダッシュボードで見る事が出来ます、画像の赤い所に書かれているのでコピペしてください。
スクリーンショット 2015-07-21 23.49.47


「活用編」

導入が完了したので試しに使ってみます、ベタにチャットルームとか作ります。

「1:UI作成」

ロビーに居る時に部屋を表示し、部屋選択後にはチャットを表示するようにします。
スクリーンショット 2015-07-22 0.06.13 スクリーンショット 2015-07-22 0.06.48
hierarchy上はこんな感じです、UIの作成方法については省略させて頂きます。
スクリーンショット 2015-07-22 0.01.53


「2:PUNControllerの作成」

Photon.MonoBehaviourを継承してコールバックを検知出来るようにします。
作成したらオブジェクトに付けてください。

using UnityEngine;  
using System.Collections;  
using UnityEngine.UI;  
  
public class PUNController : Photon.MonoBehaviour  
{  
    // 現在のステート表示用テキスト  
    [SerializeField] private Text _currentStateText;  
  
    // ルームの親オブジェクト  
    [SerializeField] private GameObject _room;  
    // 退室ボタン  
    [SerializeField] private GameObject _left;  
  
  
    void Start ()  
    {  
        //マスターサーバーへ接続  
        PhotonNetwork.offlineMode = false;  
        PhotonNetwork.ConnectUsingSettings ("v0.1");  
        // 退室ボタン非表示  
        _left.SetActive (false);  
        // 退室処理登録  
        _left.GetComponent<Button> ().onClick.AddListener (LeftRoom);  
    }  
  
    /// <summary>  
    /// マスターサーバーのロビー入室時  
    /// </summary>  
    void OnJoinedLobby ()  
    {  
  
        Debug.Log ("joined lobby");  
        _currentStateText.text = "Lobby";  
  
    }  
  
    /// <summary>  
    /// ルーム参加時  
    /// </summary>  
    void OnJoinedRoom ()  
    {  
        Debug.Log ("joined room");  
        _currentStateText.text = "" + PhotonNetwork.room.name;  
        // ルーム一覧非表示  
        _room.SetActive (false);  
        // 退室ボタン表示  
        _left.SetActive (true);  
    }  
  
    /// <summary>  
    /// ルーム退室時  
    /// </summary>  
    void OnLeftRoom ()  
    {  
        Debug.Log ("left room");  
        _currentStateText.text = "Lobby:" + PhotonNetwork.lobby.Name;  
        // ルーム一覧表示  
        _room.SetActive (true);  
        // 退室ボタン非表示  
        _left.SetActive (false);  
  
    }  
  
    /// <summary>  
    /// 他のユーザーのルーム退室時  
    /// </summary>  
    /// <param name="otherPlayer">Other player.</param>  
    void OnPhotonPlayerDisconnected (PhotonPlayer otherPlayer)  
    {  
        Debug.Log ("ID:" + otherPlayer.ID + "left room");  
        // 退室ログ表示  
        GetComponent<InRoomChat> ().messages.Add("player" + otherPlayer.ID+"さんが退室しました");  
    }  
  
    /// <summary>  
    /// 他ユーザーがルームに接続した時  
    /// </summary>  
    /// <param name="newPlayer">New player.</param>  
    void OnPhotonPlayerConnected (PhotonPlayer newPlayer)  
    {  
        // 入室ログ表示  
        Debug.Log ("Joined otherPlayer ");  
        GetComponent<InRoomChat> ().messages.Add("player" + newPlayer.ID+"さんが入室しました");  
  
    }  
  
  
    /// <summary>  
    /// ルーム退室  
    /// </summary>  
    public void LeftRoom(){  
        // ルーム退室  
        PhotonNetwork.LeaveRoom ();  
        // ログ削除  
        GetComponent<InRoomChat> ().messages.Clear ();  
    }  
  
  
}  

「3:RoomObjの作成」

部屋一覧のオブジェクト1つ1つに付けるスクリプトです。

using UnityEngine;  
using System.Collections;  
using UnityEngine.UI;  
using System.Linq;  
  
/// <summary>  
/// ルーム  
/// </summary>  
public class RoomObj : MonoBehaviour {  
    // 部屋名  
    [SerializeField] private Text _name;  
    // 人数  
    [SerializeField] private Text _count;  
  
  
    // Use this for initialization  
    void Start () {  
        // ボタンにコールバック登録  
        GetComponent<Button> ().onClick.AddListener (OnTapped);  
    }  
      
    // Update is called once per frame  
    void Update () {  
        // 部屋一覧からこの部屋の情報を取得  
        var room = PhotonNetwork.GetRoomList ().ToList ().Find (r => r.name == _name.text);  
        if (room != null) {  
            // 取得した情報から人数を取得  
            _count.text = room.playerCount+"/" + room.maxPlayers;  
        } else {  
            // 一覧にない = 0人、0人の部屋は削除される  
            _count.text = 0 + "/" + 2;  
        }  
  
    }  
  
    /// <summary>  
    /// タップ時  
    /// </summary>  
    public void OnTapped(){  
        // 部屋設定  
        RoomOptions roomOptions = new RoomOptions ();  
        roomOptions.isOpen = true;     // 部屋を開くか  
        roomOptions.isVisible = true;  // 一覧に表示するか  
        roomOptions.maxPlayers = 2;        // 最大参加人数  
  
        // 部屋に参加、存在しない時作成して参加  
        PhotonNetwork.JoinOrCreateRoom (_name.text, roomOptions, new TypedLobby ());  
    }  
}  
  

作成したらルームオブジェクトに付け、部屋名などを設定してください。
スクリーンショット 2015-07-22 0.36.57


「4:InRoomChat」

PUNインポート時にInRoomChatというScriptが一緒にインポートされていると思います。
接続確認をするには十分なので今回はInRoomChatを使います。
こちらもオブジェクトに付けておいてください。
スクリーンショット 2015-07-22 0.41.43


実行

実機に書き出して、チャットしてみます。
大体こんな感じですかね。
スクリーンショット 2015-07-22 1.01.17 スクリーンショット 2015-07-22 1.02.24


感想

手軽ですね、資料も沢山上がっていて使いやすかったです。
学生時代チーム制作で使用した時は、担当している子に丸投げしてしまったので一度触ってみたかったんです。
見て頂いてありがとうございました。
以上、乾でした。