code VR

Unity×VR(157)

スポンサーリンク

//tips

//ロビー整備

ゲーム終了画面からのロビー遷移でroomの参加人数が初期状態に戻っているかを確認する。

シーン遷移とroomの退出は別物なので、退室処理は別途組み込む。

人間側勝利の場合は、soulpostにアタッチされたPostCountスクリプトで下記のように遷移させている。

public void PManage()
{
photonView.RPC(nameof(DoPManage), RpcTarget.All);
}

[PunRPC]
void DoPManage()
{
count++;

if (count == 3)
{
SceneManager.LoadScene("humanwin");
count = 0;
}
}
}

humanwinのシーンでPhotonNetwork.LeaveRoom();を実行することもできるが、robbyシーンを開いた時自動的にPhotonNetwork.LeaveRoom();メソッドが実行されるよう、void Start内に組み込んでおく形で良いように感じる。

部屋に入っていない場合にPhotonNetwork.LeaveRoom();を実行してエラーがでないかどうかだけ確認する。

SceneMoveオブジェクトのSceneMoveスクリプトのstartメソッドにLeaveRoom()メソッドを追加。こうすると、robbyシーンからenvシーンへの遷移時のphotoncountスクリプトのroomのカウントがうまくいかず、role表示のpanelが両方とも人間役となってしまう。

wolfwin/humanwinシーンのGoStartスクリプト内にLeaveRoom()を追加することを考える。

Humanwinシーンでは正常に機能した。

プレイヤーの消滅によるwinの仕組みを作っていないのでそちらの作成も行っていく。

プレイヤーがdestroyしたタイミングで何らかのプレイヤーチェックメソッドを呼び出し、そこでいずれかの陣営の勝利条件を満たしていないか都度チェックする形が考えられる。

他にはwolfUIのみに勝利条件判断のスクリプトをアタッチしておき、そちらのupdateメソッドで自身が消滅していないか、自身以外が消滅しているかの都度チェックを行わせる方法もある。
Destroyが呼ばれたタイミングで同期でUICwolfタグを検索するメソッドを全シーンで流し、そのwolf役のスクリプトで条件の確認を行う形が一番シンプルかもしれない。

Hpscriptの if (hp <= 0)の条件で photonView.RPC(nameof(DestroyObj), RpcTarget.All);を実行し、全シーンに下記の実行を同期しているのでdestroyと同時に検索も一緒に行わせる。

[PunRPC]
void DestroyObj()
{
Destroy(this.gameObject);
}

検索させた先のUICwolfタグ付きオブジェクトにアタッチするスクリプトの内容を考える。

条件としては、人狼役がnullの場合、と、人狼役がnullではなく配列変数名.Length-1>0が成り立たない場合にゲームの決着がついていることになる。

Destroyとスクリプトの実行のタイミングがうまくいくかも一緒に確認する。UIにアタッチしているdeeractionlistの中に入れても良かったが機能が別なので分けることにした。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.SceneManagement;

public class Termcheck : MonoBehaviourPunCallbacks
{
GameObject[] players;
GameObject myPlayer;

void Update()
{
players = GameObject.FindGameObjectsWithTag("Player");
Debug.Log(players.Length);

foreach (GameObject player in players)
{
PhotonView photonView = player.GetComponent<PhotonView>();

if (photonView.IsMine)
{
myPlayer = player; //wolf役にのみアタッチされ有効

}
}
}

public void termcheck()
{
if (myPlayer == null)
{
SceneManager.LoadScene("humanwin");
}
else
{
if (players.Length < 2)//wolfは生存しているのでhumanがいる場合は2以上
{
SceneManager.LoadScene("wolfwin");
}
}
}
}

これで自分のシーンの遷移はできるようになるかと思うので、他のシーンへの連動処理も加えていく。

このスクリプトはwolfのシーンのみで有効なので、どのシーンでも有効なオブジェクトのスクリプトを作成し、そちらから遷移処理を行わせるようにする。

人気の記事

1

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

4

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-code, VR
-,

Copyright© BUSINESS HACKER , 2021 All Rights Reserved Powered by AFFINGER5.