//tips
//Photonでのグループ分け
先にphotonの人陣営と人狼陣営のグループ分けをシーン開始時に行ったが、UI表示が同じものになってしまった。
遷移先のsampleSceneに最初から配置していた確認用のplayerを消して、生成Gameplayerにより表示を行うものに変えると無事にグループの区別をつけて表示されたが、これは数字が重複していない場合の可能性あったので複数回繰り返した。
その際に狼側のUI表示に時間制限を加えた。
using System.Collections;
using System.Collections.Generic;
using Photon.Pun;
using UnityEngine;
using Photon.Realtime;
public class NumberProp : MonoBehaviour
{
[SerializeField]
GameObject faceon;
bool offwolf = false;
void Update()
{
if (PhotonNetwork.LocalPlayer.CustomProperties["PNumber"] is int pnumber)
{
if (pnumber == 0)
{
if(offwolf == false)
{
faceon.SetActive(true);
StartCoroutine("WolfUIoff");
}
}
Debug.Log(pnumber);
}
}
IEnumerator WolfUIoff()
{
yield return new WaitForSeconds(3);
offwolf = true;
faceon.SetActive(false);
}
}
やはり数字が重複してしまうケースがある。GamePlayer外のスクリプトから各プレイヤーに番号を割り振る仕組みを考える。
hashtable["PNumber"] = pnumber;のpnumberを外部から持ってくれば良いのでシーンに空オブジェクトを作成し、メソッドとして値のpnumberの引き出しを行わせ、その際に値に紐ずくリスト項目を削除することで、重複なしの値の取得を実現する。
その際Gameplayerスクリプト側では、findwithtagを使用し、親スクリプトをgetcomponentする必要があることを忘れない。
下記のpnumber代入用のリスト要素のスクリプトを作成。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class Getpnumber : MonoBehaviour
{
List<int> numbers = new List<int>();
public int ransu;
private void Start()
{
for (int i = 0; i <= PhotonNetwork.PlayerList.Length - 1; i++)
{
numbers.Add(i);
}
}
public void GetpnumberOn()
{
if (PhotonNetwork.PlayerList.Length == 0) return;
RandomNumber();
}
void RandomNumber()
{
int index = Random.Range(0, numbers.Count);
int ransu = numbers[index];
Debug.Log(ransu);
numbers.RemoveAt(index);
}
}
同時に、Gameplayerスクリプトは下記のように修正。
Debug.Log("PhotonNetwork.countOfPlayers"+ PhotonNetwork.PlayerList.Length);
var hashtable = new ExitGames.Client.Photon.Hashtable();
getpnumber.GetpnumberOn();
pnumber = getpnumber.ransu;
hashtable["PNumber"] = pnumber;
PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);
これで再確認してみた。これでも同じ現象が起きてしまう。今度は常に双方に人狼側の表示がなされるようになった。
Listではあるindexの要素を削除するとそれ以降の要素を一つずつコピーして詰めて表示されるが、そこは問題なかった。
Debug.Logを確認してみて分かったことは、GetpnumberスクリプトのDebug.Log(ransu);が1の場合でも、その後表示されるNumberPropスクリプトのDebug.Log(pnumber);が0になっていること。
シーンにスクリプトを置いたことで、参照先が各gameplayerスクリプトに属するものでなくなったしまったかと考え、public int ransu;でGetnumberから乱数抽出された値をpnumber = ransu;そしてhashtable["PNumber"] = pnumber;として代入することにしたが、これも失敗。
NumberPropスクリプトのpnumber == 0を各playerが保持するものを参照し、 faceon.SetActive(true);を自分が操作するplayerがいる画面上にしか表示しないようにしたいので、PhotonNetwork.LocalPlayer.CustomProperties["PNumber"] is int pnumberの詳細理解とphoton is Mineの組み込みにより操作プレイヤーのUI上にのみ表示する方法を探っていく。