前回の記事でサーバーへの接続を行いました。
今回は、オンラインで同期されるゲームオブジェクトの生成をしていきたいと思います。
目次
ゲームオブジェクトの生成
普段、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を入れています。
また、[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での検証
では、一度実行してみましょう。
こんな感じで、ユニティちゃんが生成されたと思います。
次に、2つゲームを起動させて同期するか検証してみましょう。
2つの同時起動
2つ起動させるためには、Unity上だけでは出来ません。
一度Buildをして、実行ファイルを作成します。
今は、[PhotonWorld1-1]だけ実行出来たらよいのでとりあえず赤枠で囲んだすべてのチェックを外してBuildしてください。
そして、実行してください。
実行ファイルと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で同期するオブジョクトには絶対に追加するモノと覚えてもらえればいいです。
これでもう一度実行してみましょう。
PhotonNetwork.Instantiateでの検証
実行方法は、先ほどと一緒でBuildして実行ファイルを作成。
実行ファイルとUnity上で実行をして2つ実行させます。
こんな感じで、2つ実行が完了すると二人のユニティちゃんが出たと思います。
まとめ
今回は、Photonで同期する場合のゲームオブジェクトの生成方法について書いていきました。
ただ、今のままだと片方で動かしてももう片方では動いていないと思います。
次回は、それを動くように変更していきたいと思います。
では。
コメント