//tips
//スポーン位置設定
プレイヤーおよびゴーレムのスポーン位置を調整する。
スポーン位置は現在固定なので、ランダム要素を加えていく。
photonCountのvar v = new Vector3(35, 5, 120);部分をランダムで切り替えられるようにしたいので、座標vのパターンを複数個作り、ランダムな数値の領域で切り替えが行われるようにする。
下記のようにphotoncountスクリプトを一部変更し、キャラクターのスポーン位置をランダムにした。
float indexrandom = Random.Range(1, 100);
Debug.Log(indexrandom);
if (indexrandom < 30)
{
v = new Vector3(35, 5, 120);
}
else if(indexrandom < 60 && indexrandom >= 30)
{
v = new Vector3(30, 5, 120);
}
else
{
v = new Vector3(25, 5, 120);
}
if (chara == 1)
{
//var v = new Vector3(35, 5, 120);
PhotonNetwork.Instantiate("Deer", v, Quaternion.identity);
}
こちらできちんと対応できている。
ただ、プレイヤーの全スポーン位置を覚えられてしまったら簡単にwolf役が見つかってしまうので5つのスポーン位置を決め、それをプレイヤーごとにランダムに取っていく形にすることで、座標でのrole指定をさせないようにする。
先に配列を作成しておき、その値に各Vector3を入れ、値を取得されるたびに同期・削除して、配列のカウント内でランダムを繰り返し行わせる形にすれば対応できそう。
そちらの仕組みを導入する。
まずはリストを作成し、List<Vector3> spownnumbers = new List<Vector3>();、この中に座標を入れる。
void Awake()
{
spownnumbers.Add(new Vector3(35, 5, 120));
spownnumbers.Add(new Vector3(30, 5, 120));
spownnumbers.Add(new Vector3(25, 5, 120));
spownnumbers.Add(new Vector3(32, 5, 110));
spownnumbers.Add(new Vector3(32, 5, 120));
}
ここからランダムに一つ取り出し、取り出したリスト項目を削除すれば良いので下記の流れになる。
void shuffleposition()
{
if(spownnumbers.Count > 0)
{
int index = Random.Range(0, spownnumbers.Count);
v = spownnumbers[index];
Debug.Log(v);
spownnumbers.RemoveAt(index);
}
}
ここから更新したリスト内容を他のシーンに共有する必要がある。
なのでもう一手間加えて、下記のように同期処理も加えた。
void shuffleposition()
{
if(spownnumbers.Count > 0)
{
int index = Random.Range(0, spownnumbers.Count);
v = spownnumbers[index];
Debug.Log(v);
photonView.RPC(nameof(sharelist), RpcTarget.AllViaServer, PhotonNetwork.LocalPlayer.UserId);
}
}
[PunRPC]
void sharelist(int x)
{
spownnumbers.RemoveAt(x);
}
エラーが発生し、sharelistがString型で実行されているよう。
RPC method 'sharelist' found on object with PhotonView 4 but has wrong parameters. Implement as 'sharelist(String)'. PhotonMessageInfo is optional as final parameter.Return type must be void or IEnumerator (if you enable RunRpcCoroutines).
コードを見直してみると引数がPhotonNetwork.LocalPlayer.UserIdのままだったのでこちらをindexに修正。
photonView.RPC("Sharelist", RpcTarget.AllViaServer,index);
これで無事に機能した。