【Unity】PUN2でオンライン通信対戦(マルチプレイ)を実装

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

マルチプレイを実装し、プレイヤーの位置を同期する。

Unityで通信対戦の実装

Unityでゲーム開発を進める上で、マルチプレイをしたい。

現在のゲームは多様化する中で、
通信対戦・協力の要素は人と関わりゲームを熱中させる要素になります。

離れた場所から対戦相手とマッチングさせるためには、サーバーが必要になります。
サーバーを設置するので、自己管理あるいはゲーム用のレンタルサーバーを借りる必要があります。

しかし、Unityではアセットを使うことで、1円もかけず無料で環境を構築することができます。

本記事では、Photon社が提供するPUN2を使ってマルチプレイを実現します。

本記事は次の人におすすめ
  • PUNの使い方を知りたい。
  • オンライン環境に興味がある。
Udemyで学習する
スポンサーリンク

PUN (Photon Unity Networking)

Photonについて

PUNはPhoton社が管理しているサーバー上にルームを作成し、
ゲームのマルチプレイを実現しています。

本来は、自分でサーバーを立てた後、
考えられるユーザーの行動に対する制御をしなければいけませんが、
これら全ての工程をPUNで解決できます。

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

イントロダクション | Photon Engine

Unityでマルチプレイをするためには、大きく3つの工程に分けられます。

  • Step1
    Photonアカウント作成
  • Step2
    Asset StoreでPUN2をインストール
  • Step3
    同期するスクリプトをアタッチする

早速、PUNを導入したいところですが、アセットをUnityで使う前に色々と手続きが必要です。
UnityでPUNを使うときにPhotonのサーバー情報(AppID)が要求されます。

したがって、初めに会員登録をしてサーバーを立ち上げます。
その後、Unityと連携します。

Photonではマルチプレイの他、
PC版とスマホ版のデバイスの異なるゲームで通信対戦する「クロスプレイ」も実装できます。

アンドロイド用のゲームを出力します。

PUNのアカウント作成・アプリの設置

  • Step1
    Photonにアクセスして、アカウント作成(メルアド・パスワード)

  • Step2
    「新しくアプリを作成する」に進み、アプリを立ち上げる

  • Step3
    マルチプレイヤーゲーム・Realtimeで設定し、作成するに進む

Photonの公式サイトにアクセスします。

画面に出てくる「サインアップ」をクリックして、
メールアドレス・パスワードを設定してください。

Photonの会員登録

アカウント作成が完了後、右上のダッシュボードに進み、
新しくアプリを作成する」に進んでください。

ダッシュボード

マルチプレイヤーゲームを選択して、下にスクロールします。

マルチプレイヤーゲーム

Photonの種別は「Realtime」にして、アプリケーション名を付けてください。
必要であれば、アプリケーションの説明とURLを添付してください。

アカウント作成

PUNインストール

  • Step1
    Unityの項目WindowsでAsset Storeに進む

  • Step2
    検索バーでPUN2と検索し、Add to My Assetsに進む

  • Step3
    追加後、Unityに戻る(Open in Unity)、

  • Step4
    項目WindowsでPackage Managerで追加したPUN2をダウンロードする
  • Step5
    Importに進み、アセットのチェックマークを確認、導入する

  • Step6
    PUN SetupでAppIDを入力し、Setup Projectに進む

アプリケーションを作成したので、UnityにPUNをインストールしていきます。

Unityの上部項目からWindowに進み、 Asset Storeを開いてください。

WindowからAsset Store

移動後、「Photon」と検索して、PUN2を選択してください。
※CLASSIC・VOICE・CHATなどたくさんありますが、インストールするアセットは、最新バージョンPUN2にしてください。

PUN2の検索

PUN2を選ぶと、青枠で「ADD to My Assets」があるので、取得してください。

PUN2のインストール

追加ができた後、Open in Unityに進むか、Unityを自分で開いて戻ってください。

Unityを開く

再度Windowに進み、Package ManagerでPUN2をダウンロードしてください。

PUN2をダウンロード

ダウンロード終了後、インポートが可能になるので、
チェックマークがついているか確認して、導入してください。

全て追加する必要性はありませんが、
どの機能があるか分からない場合は、Allで次に進んでください。

PUN2をプロジェクトに追加

PUN Wizardウィンドウが表示されて、セットアップを要求されます。

PUN2のセットアップ

指示では、appIDかEmailの入力が必要です。
初めに、会員登録の際に使用したメールアドレスを入力しました。
しかし、メールアドレスが正しくないとはじかれてしまいました。

したがって、AppIDの入力をおすすめします。

AppIDの場所は、Photonのログインページのダッシュボード
作成したアプリケーションの管理画面から取得できます。

アプリケーションIDの取得

AppIDを入力後、プロジェクトセットアップを完了してください。

マルチプレイの実装

  • Step1
    PhotonServerSettingに各種情報を入力する

  • Step2
    同期したいオブジェクトにスクリプトをアタッチする

  • Step3
    Resourcesフォルダーにオブジェクトを登録する

  • Step4
    Hierarchyウィンドウにスクリプトをアタッチする

アセットをインポートすると、projectウィンドウにPhotonが保管されています。

検索バーで「PhotonServerSettings」と入力してください。
Photonをインポートすると既に立ち上がっているかと思います。

PhotonServerSettings

Inspectorウィンドウの項目にそれぞれ入力して下さい。

App Id PUN各々のID
App Version(任意)1.0
Fixed Regionjp
サーバーの設定

次に、用意したゲームオブジェクト(素材)に同期するスクリプトをアタッチします。

本記事で扱う素材はBlenderで作成することができます。

Blenderのオブジェクトを追加

要するに、座標を揃えなければいけません。
Photonは標準搭載されているスクリプトがあるので、動作同期のスクリプトを書く必要はありません。

Hierarchyウィンドウに同期したいプレハブを選択し、InspectorウィンドウのAddComponentで、「Photon View」と「Photon Transform View Classic」を追加してください。
Photon Transform View ClassicのSynchronize Positionにチェックマークを入れてください。

Photon Viewの設定

追加後、プレハブをHierarchyウィンドウからAssets内の「Resources」フォルダーへ素材を移動させてください。

素材移動

Create Prefabs or Variants?というウィンドウが出てきますが、
Original Prefabsを選択してください。

Original Prefabs

プロジェクトを新規作成した場合、Resourcesフォルダーは作成されていないので、作ってください。

現在の環境では、Resourcesフォルダーの使用は推奨されてませんが、
小規模のプロジェクトであれば、Resourcesフォルダーに頼りましょう。

Resourcesフォルダーの代わりになるものを紹介しています。

Resourcesファイルにゲームオブジェクトを保管ができましたら、
Hierarchyウィンドウの素材は、非表示あるいは削除して下さい。

次に、プレイヤー同士を接続し、マッチメイキングするためのスクリプトをアタッチします。

Photonサーバーに接続し、部屋に参加して、部屋内のプレイヤーの数に基づいて
プレイヤーキャラクターをインスタンス化し、オンラインマルチプレイヤーゲームを可能にします。

参考:「PUN2(Photon Unity Networking 2)で始めるオンラインゲーム開発入門

ソースコード

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

public class Online : MonoBehaviourPunCallbacks
{
    private int playerCount;

    private void Start()
    {
        PhotonNetwork.ConnectUsingSettings();
    }

    public override void OnConnectedToMaster()
    {
        PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
    }

    public override void OnJoinedRoom()
    {
        playerCount = PhotonNetwork.PlayerList.Length; //ルームにいる人数を確認

        string playerPrefabName;

        if (playerCount == 1)
        {
            playerPrefabName = "Player1";
        }
        else
        {
            playerPrefabName = "Player2";
        }

        Vector3 position = new Vector3(Random.Range(-20f, 20f), 0, Random.Range(-20f, 20f));
        PhotonNetwork.Instantiate(playerPrefabName, position, Quaternion.identity);
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/



解説

Photon.Pun、Photon.Realtime、およびUnityに必要なusingステートメントを含めています。

Photon.Punは、MonoBehaviourPunCallbacksPhotonNetworkに必要です。
Photon.Realtimeは、RoomOptions()TypedLobby.Defaultのルーム作成に必要です。

Onlineという名前のクラスを定義し、MonoBehaviourPunCallbacksを継承しています。

MonoBehaviourとの違い

MonoBehaviourは、Unity ゲームオブジェクトのスクリプトとして動作するコンポーネントの基本クラスです。継承することにより、ゲームオブジェクトにアタッチされたスクリプトとして、そのゲームオブジェクトに対してカスタムコードを追加できます。

MonoBehaviourPunCallbacksは、.photonViewと、PUNを呼び出すすべてのコールバック/イベントを動作できます。

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

public class Online : MonoBehaviourPunCallbacks{
...
}

Startメソッドでは、PhotonNetwork.ConnectUsingSettings()を呼び出して、
Photon Unity Networking設定で構成されたPhotonクラウドに接続します。

private void Start()
{
 PhotonNetwork.ConnectUsingSettings();
}

OnConnectedToMasterメソッドでは、Photon PUNからのコールバックをするものです。
ユーザーがPhotonサーバーに正常に接続した場合に呼び出されます。

このメソッド内で、PhotonNetwork.JoinOrCreateRoomを呼び出し、
デフォルトの部屋オプションとロビー設定を使用して、
名前が “Room” の部屋に参加または作成します。

public override void OnConnectedToMaster()
{
  PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
}

OnJoinedRoomメソッドは、ユーザーが部屋に正常に参加した場合に呼び出されます。

ここで、PhotonNetwork.PlayerList.Lengthを使用して部屋内のプレイヤーの数を確認します。

プレイヤーカウントに応じて、playerPrefabNameをインスタンス化するプレハブの名前を決定します。部屋に1人しかいない場合は “Player1” 、それ以外の場合は “Player2” を使用します。

次に、指定された範囲内でランダムな位置を生成して、
PhotonNetwork.Instantiateを使用してプレイヤーオブジェクトをインスタンス化し、
プレハブ名、位置、および回転を指定します。

public override void OnJoinedRoom()
{
  playerCount = PhotonNetwork.PlayerList.Length; //ルームにいる人数を確認

   string playerPrefabName;

    if (playerCount == 1)
    {
      playerPrefabName = "Player1";
    }
     else
    {
      playerPrefabName = "Player2";
    }
      Vector3 position = new Vector3(Random.Range(-20f, 20f), 0, Random.Range(-20f, 20f));
      PhotonNetwork.Instantiate(playerPrefabName, position, Quaternion.identity);
    }

実演

スクリプトをHierarchyウィンドウにアタッチしてください。
確認のためにビルドします。

ビルドとは、Unityエンジン外でゲームをプレイする。
要するに、販売できる状況にすることです。Windowsファイルでいうexeファイルと考えてください。
ビルドの作成 – Unity マニュアル

項目のFileからBulid And Runを選択してください。

ビルド

初めての方は、FileのBuildSettingから出力するプラットフォームがあっているか確認してください。

ビルドの設定

ビルド後、ゲームを起動してください。
スクリプトより初めに入室した人はPlayer1が表示されます。

Player1の存在

次に、Unityエンジンで再生ボタンを押してください。
スクリプトよりプレイヤーがいる場合はPlayer2が追加されます。

Player2の入室

これにより冒頭で紹介したマルチプレイが実装されました。

自分のプレハブなら操作できますが、
相手のプレハブは操作できないことも確認できます。

まとめ

Unityでマルチプレイできるゲームをつくるにはサーバーを設置する必要がありますが、
構築から管理をするのは非常に困難です。

しかし、UnityではPUN2というアセットを使うことで、オンライン環境を構築することができます。

初めにPhotonでアカウントを作成して、アプリケーションを作成します。
Unityにアセットをインストールして、APPIDを認証します。

プレハブに同期するためのスクリプトをアタッチして、Resourcesフォルダーに保管します。
その後、ルームを作成、参加するスクリプトをアタッチします。

Udemyで学習する

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする