イントロダクション

Photon Unity Networking(PUN)は、マルチプレイヤーゲーム対応のUnityパッケージです。 柔軟性の高いマッチメイキングによってプレイヤーはルームに入室し、ルーム内のオブジェクトはネットワーク上で同期されます。RPC、カスタムプロパティ、または「低いレベル」のPhotonイベントなどの機能があります。信頼性が高く、(オプションで)高速な通信が専用Photonサーバーによって実現されます。このため、クライアントは1対1で接続する必要はありません。

PUNはUnity対応の、ほぼすべてのプラットフォームへエキスポート可能です。また、PUNは以下の2種類から選べます。

PUN FREE

PUN FREE 無償パッケージで多数のデモ、あらかじめ作成されたスクリプトやリファレンスドキュメントが含まれています。 ほぼすべてのプラットフォームへエクスポート可能です。

PUN 2 FREE をダウンロード

PUN PLUS

PUN FREE Unity Plugin PUN FREEと同じ内容のほか、Photon Cloudの100CCUプラン(約40,000MAU、60ヶ月間有効)が含まれます。

PUN 2 PLUS >はこちらから

PUNの構造

PUNの構造を気にする必要は特段ありませんが、概要をおさえるために説明します。PUNパッケージは3層のAPIレイヤーでできています。

  • 最上層にあたるのはPUNコードで、ネットワークオブジェクトやRPCなどのUnity特定の機能を実装します。
  • 真ん中の層にあるのはPhotonサーバと動作しマッチメイキングやコールバックなどを行うロジックです。これはリアルタイムAPIで、単独で使用できます。PUNとリアルタイムAPI(別名ロードバランシングAPI)間のトピックについて多くのオーバーラップが存在しますが、問題ありません。
  • 最下層はDLLファイルでできており、このファイルにはシリアライゼーション・デシリアライゼーション、プロトコル等が含まれています。

はじめましょう

PUNを最大限活用するには、若干のプログラミングが必要です。 このページでは、数件のスニペットを表示しますが、ガイドではなく概要として説明します。

問題なく開始するため、「PUN基本チュートリアル」を参照のうえ作業してください。

接続とコールバック

ConnectUsingSettingsを使うと、直ちにオンラインになります。この機能は PhotonServerSettingsアセットから必要な情報をとり、オンラインにします。

PhotonNetwork.ConnectUsingSettings();

PUNではいつクライアントが接続を確立しルームに参加したかなどを通知するため、コールバックを使用しています。

例: IConnectionCallbacks.OnConnectedToMaster.

便宜上、PUNには MonoBehaviourPunCallbacks というMonoBehaviourがあります。これにより重要なコールバックインターフェースが実装されMonoBehaviour自身も自動的に登録されるので、継承して特定のコールバックメソッドを上書きできます。

    // ...
    public class YourClass : MonoBehaviourPunCallbacks
    {
        // ...
        public override void OnConnectedToMaster()
        {
            Debug.Log("OnConnectedToMaster() was called by PUN.");
            PhotonNetwork.JoinRandomRoom();
        }
        // ...
    }
    // ...

代わりにIConnectionCallbacksをあらゆるクラスに実装しPhotonNetwork.AddCallbackTargetを介してコールバックのインスタンスを登録します。

マッチメイキング

OnConnectedToMasterの中で既存のルームに参加するか、独自の作成することもできます。 以下のコードスニペットでは、ゲームを開始するか、またはゲームに参加するためのメソッドコールを示しています。

    // Join room "someRoom"
    PhotonNetwork.JoinRoom("someRoom");
    //Fails if "someRoom" is not existing, closed or full. Error callback: IMatchmakingCallbacks.OnJoinRoomFailed
    // Tries to join any random game:
    PhotonNetwork.JoinRandomRoom();
    //Fails if there are no open games. Error callback: IMatchmakingCallbacks.OnJoinRandomFailed
    // Create this room.
    PhotonNetwork.CreateRoom("MyMatch");
    // Fails if "MyMatch" room already exists and calls: IMatchmakingCallbacks.OnCreateRoomFailed

友達と一緒にプレイをするにあたってPUN以外でコミュニケーションできる(例えばPhoton Chat, Facebook)場合、ルーム名を作成してJoinOrCreateRoomを使用できます。もし、他の誰もそのルームにマッチさせたくない場合にはそのルーム自体をマッチメイキングから不可視にします。以下の手順です。

    RoomOptions roomOptions = new RoomOptions();
    roomOptions.IsVisible = false;
    roomOptions.MaxPlayers = 4;
    PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);

JoinOrCreateRoomを使うと、必要に応じてルームが作成されるので、誰が一番かというのは関係なくなります。 満員であれば、IMatchmakingCallbacks.OnJoinRoomFailed が呼び出されます。(どこかしらに実装および登録していた場合) マッチメイキングについて詳細はガイドをご確認ください。

ゲームロジック

GameObjectはPhotonViewコンポーネントで「ネットワークゲームオブジェクト」としてインスタンス化されます。 オブジェクトとオーナー(もしくはコントローラー)を識別します。コントロールしているプレイヤーは他のプレイヤーをアップデートします。

通常はプレハブに PhotonViewを追加し、そのためのObservedコンポーネントを選択します。そしてインスタンスを作成するためにPhotonNetwork.Instantiateを使用します。

PhotonViewのobservedコンポーネントはネットワークオブジェクトの状態を一秒間に数回書き込む(および読み込む)のを管理します。これを実現するには、スクリプトはOnPhotonSerializeViewを定義するIPunObservableを実装する必要があります。下記を参照してください。

    // used as Observed component in a PhotonView, this only reads/writes the position
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            Vector3 pos = transform.localPosition;
            stream.Serialize(ref pos);
        }
        else
        {
            Vector3 pos = Vector3.zero;
            stream.Serialize(ref pos);  // pos gets filled-in. must be used somewhere
        }
    }

クライアントは、ネットワーク化された特定のオブジェクト上で、発生頻度の低い事柄について [リモートプロシージャコール]を実行できます。

    // defining a method that can be called by other clients:
    [PunRPC]
    public void OnAwakeRPC(byte myParameter)
    {
        //Debug.Log(string.Format("RPC: 'OnAwakeRPC' Parameter: {0} PhotonView: {1}", myParameter, this.photonView));
    }
    // calling the RPC somewhere else
    photonView.RPC("OnAwakeRPC", PhotonTargets.All, (byte)1);

GameObjectsとは別に、独自のイベントを送信することも可能です:

    PhotonNetwork.RaiseEvent(eventCode, eventContent, raiseEventOptions, SendOptions.SendReliable);

PUNのRPCとRaiseEventについては、こちらを参照してください。

デモとチュートリアル

PUNパッケージには、複数のデモと、便利なスクリプトが含まれています。これらは何度でも利用でき、解析や再実行も可能です。

問題なく開始するために、「PUNベーシックチュートリアル」を十分に確認したうえでコーディングしてください。

 ドキュメントのトップへ戻る