マルチプレイを実装し、プレイヤーの位置を同期する。
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つの工程に分けられます。
- Step1Photonアカウント作成
- Step2Asset StoreでPUN2をインストール
- Step3同期するスクリプトをアタッチする
早速、PUNを導入したいところですが、アセットをUnityで使う前に色々と手続きが必要です。
UnityでPUNを使うときにPhotonのサーバー情報(AppID)が要求されます。
したがって、初めに会員登録をしてサーバーを立ち上げます。
その後、Unityと連携します。
Photonではマルチプレイの他、
PC版とスマホ版のデバイスの異なるゲームで通信対戦する「クロスプレイ」も実装できます。
PUNのアカウント作成・アプリの設置
- Step1Photonにアクセスして、アカウント作成(メルアド・パスワード)
- Step2「新しくアプリを作成する」に進み、アプリを立ち上げる
- Step3マルチプレイヤーゲーム・Realtimeで設定し、作成するに進む
Photonの公式サイトにアクセスします。
画面に出てくる「サインアップ」をクリックして、
メールアドレス・パスワードを設定してください。
アカウント作成が完了後、右上のダッシュボードに進み、
「新しくアプリを作成する」に進んでください。
マルチプレイヤーゲームを選択して、下にスクロールします。
Photonの種別は「Realtime」にして、アプリケーション名を付けてください。
必要であれば、アプリケーションの説明とURLを添付してください。
PUNインストール
- Step1Unityの項目WindowsでAsset Storeに進む
- Step2検索バーでPUN2と検索し、Add to My Assetsに進む
- Step3追加後、Unityに戻る(Open in Unity)、
- Step4項目WindowsでPackage Managerで追加したPUN2をダウンロードする
- Step5Importに進み、アセットのチェックマークを確認、導入する
- Step6PUN 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を入力後、プロジェクトセットアップを完了してください。
マルチプレイの実装
- Step1PhotonServerSettingに各種情報を入力する
- Step2同期したいオブジェクトにスクリプトをアタッチする
- Step3Resourcesフォルダーにオブジェクトを登録する
- Step4Hierarchyウィンドウにスクリプトをアタッチする
アセットをインポートすると、projectウィンドウにPhotonが保管されています。
検索バーで「PhotonServerSettings」と入力してください。
Photonをインポートすると既に立ち上がっているかと思います。
Inspectorウィンドウの項目にそれぞれ入力して下さい。
App Id PUN | 各々のID |
App Version(任意) | 1.0 |
Fixed Region | jp |
次に、用意したゲームオブジェクト(素材)に同期するスクリプトをアタッチします。
本記事で扱う素材は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フォルダーは作成されていないので、作ってください。
現在の環境では、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 C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
Photon.Pun、Photon.Realtime、およびUnityに必要なusingステートメントを含めています。
Photon.Punは、MonoBehaviourPunCallbacksとPhotonNetworkに必要です。
Photon.Realtimeは、RoomOptions()とTypedLobby.Defaultのルーム作成に必要です。
Onlineという名前のクラスを定義し、MonoBehaviourPunCallbacksを継承しています。
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フォルダーに保管します。
その後、ルームを作成、参加するスクリプトをアタッチします。