【Unity】無料アセットPUN2でオンライン対戦ゲームを作成

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

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

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

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

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

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

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

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

PUN (Photon Unity Networking)

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の種別は、「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を開いてください。

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

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

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

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

ダウンロード終了後、インポートが可能になるので、チェックマークがついているか確認して、導入してください。
全て追加する必要性はありませんが、どの機能があるか分からない場合は、Allで次に進んでください。

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

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

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

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

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

マルチプレイの実装

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

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

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

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

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

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

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

App Id PUN各々のID
App Version(任意)1.0
Fixed Regionjp

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

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

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

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

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

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

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

UnityにCSVフォルダーを読み込む記事でも解説していますが、フォルダー名が別の名前にしてはいけません。大文字、小文字もしっかり区別してください。

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);
    }
}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

容量不足を解消

Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。

価格耐久性静音性読み書きサイズ
HDD
SSD

注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。

  • 据え置きHDD
  • 外付けSDD
  • 内蔵SSD

ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。

解説

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が表示されます。

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

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

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

まとめ

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

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

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

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

この記事を書いた人

プロフィール

アリッシア

                 

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

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました