2014年11月18日火曜日

photonでのシーン切り替え続きみたいなもの

どーも、siroponnです。
久しぶりに投稿かな。
今回は、前回書いたphotonでのシーン切り替えの続きみたいなものです。
前回photonでRoomシーン(Photonのルームとは違います)からGameシーンに遷移した部分で終わりました。今度はGameシーンからRoomシーンに行く部分を書こうと思います。
Roomシーンに行くのは簡単で、前回とは逆に実装します。

今回はゲームオーバになったとしましょう。

こんな感じかな?

//----------Gameシーンの方にあるスクリプト抜粋--------------------

 //ゲームオーバになったら.
 if (PhotonNetwork.player.isMasterClient && (localWaitTime >= 4f) && (!isOver) )
 {
             isOver = true;

             PhotonNetwork.room.open = false;

             PhotonNetwork.room.visible = false;

             ExitGames.Client.Photon.Hashtable h = new ExitGames.Client.Photon.Hashtable() { { "GS", GameState.Progress } };

             PhotonNetwork.player.SetCustomProperties(h);

             ExitGames.Client.Photon.Hashtable hh = new ExitGames.Client.Photon.Hashtable() { { "BS", "Ending" } };

             PhotonNetwork.room.SetCustomProperties(hh);

             PhotonNetwork.DestroyAll();

             pPview.RPC("ReturnToRoom", PhotonTargets.All);
}

ルームを閉じて、視えなくして、プレイヤ、ルームのプロパティ変更してphotonで生成したobject全部ぶっ壊してます。

PhotonNetowrk.DestroyAll();はやらないと、Buffer上(?)にobject情報が残るっぽいです。
やらずに、他のunityのシーンでこれを呼ぶと怒られます。

話は戻って、Gameシーン上からRoomシーンに戻ってきたら現在Photonに繋がっていてルームの中に存在するかを判定。


//----------Roomシーンにある方のスクリプト抜粋----------
 void Start()
{
            PhotonNetwork.isMessageQueueRunning = true;

            if (PhotonNetwork.connected && PhotonNetwork.inRoom) //Gameからかえってきたら.
            {
                ExitGames.Client.Photon.Hashtable h = new HashTable() { { "GS", GameState.Room } };

                PhotonNetwork.player.SetCustomProperties(h); //自分のプロパティを戻す.

                if (PhotonNetwork.player.isMasterClient)
                {
                     PhotonNetwork.room.open = true;

                     PhotonNetwork.room.visible = true;

                     ExitGames.Client.Photon.Hashtable hh = new HashTable() { { "BS", "idle" } };

                     PhotonNetwork.room.SetCustomProperties(hh); //準備中に戻す
                  
                }

               sceneState = SceneState.Room;

           }
            else //起動時のみ.
                sceneState = SceneState.Title;
  
}

//------------------------

sceneStateは独自で定義した列挙型です。これで、RoomシーンでもLobyに居るかRoomにいるか、はたまたまだ接続してすらいないかを判定しています。

GameシーンからRoomシーンに戻ってくるのでStartがもう一回呼び出されますね。

このやり方は1シーンだけでやってる時は出来ません。注意してください。

はい、後は特別お話することもありません。
お疲れさまでした。

今度は1シーンだけでやる方法も書きたいな。