簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~同期されるオブジョクトの生成~

PhotonCloud

前回の記事でサーバーへの接続を行いました。

今回は、オンラインで同期されるゲームオブジェクトの生成をしていきたいと思います。

ゲームオブジェクトの生成

普段、Unityでゲームオブジェクトを生成する時は、Prefabにしたモノを直接指定していると思います。

Instantiate(prefab, new Vector3(0f, 0f, 0f), Quaternion.identity);

こんな感じですよね。

これで生成されてもオンライン上では同期がされずにそれぞれで生成されるだけです。

試しに、この方法でPhotonサーバーに接続された状態でゲームオブジェクトを生成してどうなるのか見てみましょう。

使うゲームオブジェクトは、ユニティちゃんの2Dモデルにします。

Scene「PhotonWorld1-1」の中に「DemoUnityChan2D」をPrefab化します。

そして、前回作ってもらった「PhotonSystem」のOnJoinedRoom()の中にInstanceを書きます。

これで、サーバーに接続して、部屋に入室したタイミングでユニティちゃん2Dが生成されます。

 


using UnityEngine;
using System.Collections;

public class PhotonSystem : Photon.MonoBehaviour {

public GameObject prefab;

///
/// マスターサーバーのロビーに入るに呼び出されます。
///

void OnJoinedLobby() {
Debug.Log("ロビーに入室");
//ランダムにルームへ参加
PhotonNetwork.JoinRandomRoom();
}

///
/// 部屋に入るとき呼ばれます。
/// これは参加する際だけでなく作成する際も含みます。
///

void OnJoinedRoom() {
Debug.Log("部屋に入室");
Instantiate(prefab, new Vector3(0f, 0f, 0f), Quaternion.identity); //プレイヤーをインスタンス化

}

///
/// JoinRandom()の入室が失敗した場合に後に呼び出されます。
///

void OnPhotonRandomJoinFailed() {
Debug.Log("部屋入室失敗");
//名前のないルームを作成
PhotonNetwork.CreateRoom(null);
}

void Awake() {
//マスターサーバーへ接続
PhotonNetwork.ConnectUsingSettings("v0.1");
}
}

 

25行目に追加したのが生成処理です。

変数GameObjectにユニティちゃんの2DのPrefabを入れています。

PhotonCloud_22

また、[CameraController]で最初にユニティちゃんがいないとtargetがnulllで実行が止まってしまうのでとりあえずif分でnullなら処理をしないようにしておきます。

[CameraController]全体を貼ると大きく場所を取るので変更部分がある[LateUpdate()]だけ書きます。


void LateUpdate()
 {
 var right = m_camera.ViewportToWorldPoint(Vector2.right);
 var center = m_camera.ViewportToWorldPoint(Vector2.one * 0.5f);

if (target != null) {

if (center.x < target.position.x) {
 var pos = m_camera.transform.position;

if (Math.Abs(pos.x - target.position.x) >= 0.0000001f) {
 m_camera.transform.position = new Vector3(target.position.x, pos.y, pos.z);
 }
 }

if (stopPosition.position.x - right.x < 0) {
 StartCoroutine(INTERNAL_Clear());
 enabled = false;
 }
}
 }

Instanceでの検証

では、一度実行してみましょう。

PhotonCloud_23

こんな感じで、ユニティちゃんが生成されたと思います。

次に、2つゲームを起動させて同期するか検証してみましょう。

2つの同時起動

2つ起動させるためには、Unity上だけでは出来ません。

一度Buildをして、実行ファイルを作成します。

PhotonCloud_24

今は、[PhotonWorld1-1]だけ実行出来たらよいのでとりあえず赤枠で囲んだすべてのチェックを外してBuildしてください。

そして、実行してください。

PhotonCloud_25

実行ファイルとUnity上、2つ実行出来たと思います。

1つ1つでは正常に動いていますが、これだとそれぞれのユニティちゃんが非同期です。

これを次は同期させてみましょう。

同期するためのInstance

同期させるためには、ゲームオブジェクトの生成方法を少し変える必要があります。

Instanceを次のように変更します。

PhotonNetwork.Instantiate(“DemoUnityChan2D”, new Vector3(0f, 0f, 0f), Quaternion.identity, 0);

こんな感じです。

先ほどは

Instantiate(prefab, new Vector3(0f, 0f, 0f), Quaternion.identity);

これでした。

InstanceがPhotonNetwork.Instantiateに、Prefabが”DemoUnityChan2D”に変わり、最後に0がつきました。

PhotonNetwork.InstantiateはPhotonで同期する場合に使うからという感じで覚えてもらい、

“DemoUnityChan2D”は、GameObjectを指定するのでなく生成するPrefabの名前を指定するというカタチに変わりました。

最後の0は、とりあえず今は0のままで大丈夫です。

そして、生成するPrefabを置く場所も変更する必要があります。

先ほどのユニティちゃん2DをPrefab化したものを

[Assets]→[Photon Unity Networking]→[Resources]の中に移動させてください。

また、Prefab化したユニティちゃんに[Photon View]というScriptを追加してください。

Photonで同期するオブジョクトには絶対に追加するモノと覚えてもらえればいいです。

PhotonCloud_26

 

これでもう一度実行してみましょう。

PhotonNetwork.Instantiateでの検証

実行方法は、先ほどと一緒でBuildして実行ファイルを作成。

実行ファイルとUnity上で実行をして2つ実行させます。

PhotonCloud_27

こんな感じで、2つ実行が完了すると二人のユニティちゃんが出たと思います。

まとめ

今回は、Photonで同期する場合のゲームオブジェクトの生成方法について書いていきました。

ただ、今のままだと片方で動かしてももう片方では動いていないと思います。

次回は、それを動くように変更していきたいと思います。

では。

ユニティちゃんライセンスこのアセットは、『ユニティちゃんライセンス』で提供されています。このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。

コメント

タイトルとURLをコピーしました