//tips
//Photon同期の際の数値共有
ボタンクリックをシーンのスクリプトにカウントさせ、該当クリック数にてボタンを押したプレイヤーのフラグを変更する方法を考える。
プレイヤーのMoveMineスクリプトとシーンのNumberpropスクリプトに同一ボタンのクリックで発動させるメソッドをアタッチさせて、2回目のクリック当事者にUI表示をさせるようにする。
プレイヤースクリプトに下記のonflagメソッドを追加、Numberpropスクリプトに LobbyCountメソッドを組み込んだが、やはりカウントは各プレイヤーのシーンごとになされ、カウント数が共有されない。
public void Onflag()
{
numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
int Mycount = numberProp.lobbyPlayerMaxCount;
Debug.Log(Mycount);
if (Mycount == 1)
{
numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Faceon();
//flag = false;
}
}
public void LobbyCount()
{
lobbyPlayerMaxCount++;
Debug.Log(lobbyPlayerMaxCount);
moveMine.Onflag();
}
今度はPlayerprefsのデータ保存を用いてこの問題に対応できないか考える。
public void LobbyCount()
{
lobbyPlayerMaxCount++;
PlayerPrefs.SetInt("Count", lobbyPlayerMaxCount);
PlayerPrefs.Save();
Debug.Log(lobbyPlayerMaxCount);
moveMine.Onflag();
}
public void Onflag()
{
numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
int Mycount = PlayerPrefs.GetInt("Count", 0); ;
Debug.Log(Mycount);
if (Mycount == 2)
{
numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Faceon();
//flag = false;
}
}
Playerprefsでデータ保存してもそれはシーンごとに保存データは別れてしまうので失敗。
下記2サイトを参考に再度カスタムプロパティの付与に挑戦していく。
https://qiita.com/OKsaiyowa/items/118be61ddaa175aae3e6
https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono4
プレイヤーのカスタムプロパティの値を取得する場合は、カスタムプロパティの値がobject型でしか取得できないため、is演算子を利用することで、適切な型にキャストできるかの判定を行い、問題なければその結果を変数で受け取る処理を利用する。
上記サイトのPlayerPropertyExtensionsスクリプトを導入した後に、MoveMineスクリプトに下記のメソッドを導入し、デバッグで数字を確認するも、シングルプレイヤーの時はきちんと0と表示されるが、マルチプレイヤーになった際にデバッグ表示がされなくなった。
public void SetMyCustomProperties()
{
//自分のクライアントの同期オブジェクトにのみ
if (photonView.IsMine)
{
List<int> playerSetableCountList = new List<int>();
//制限人数までの数字のリストを作成
//例) 制限人数 = 4 の場合、{0,1,2,3}
int count = 0;
for (int i = 0; i < _PLAYER_UPPER_LIMIT; i++)
{
playerSetableCountList.Add(count);
count++;
}
//他の全プレイヤー取得
Player[] otherPlayers = PhotonNetwork.PlayerListOthers;
Debug.Log("otherPlayers.Length" + otherPlayers.Length);
//他のプレイヤーがいなければカスタムプロパティの値を"0"に設定
if (otherPlayers.Length <= 0)
{
//ローカルのプレイヤーのカスタムプロパティを設定
int playerAssignNum = otherPlayers.Length;
PhotonNetwork.LocalPlayer.UpdatePlayerNum(playerAssignNum);
Debug.Log("playerSetableCountList[0]" + playerSetableCountList[0]);
return;
}
//他のプレイヤーのカスタムプロパティー取得してリスト作成
List<int> playerAssignNums = new List<int>();
for (int i = 0; i < otherPlayers.Length; i++)
{
playerAssignNums.Add(otherPlayers[i].GetPlayerNum());
}
Debug.Log("playerAssignNums" + playerAssignNums);
//リスト同士を比較し、未使用の数字のリストを作成
//例) 0,1にプレーヤーが存在する場合、返すリストは2,3
playerSetableCountList.RemoveAll(playerAssignNums.Contains);
//ローカルのプレイヤーのカスタムプロパティを設定
//空いている場所のうち、一番若い数字の箇所を利用
PhotonNetwork.LocalPlayer.UpdatePlayerNum(playerSetableCountList[0]);
Debug.Log("playerSetableCountList[0]" + playerSetableCountList[0]);
}
}
デバッグで細かくみていくとphotonView.IsMineが問題のようで、0は表示されるが1まで進めない。
public void SetMyCustomProperties()
{
Debug.Log("0");
//自分のクライアントの同期オブジェクトにのみ
if (photonView.IsMine)
{
Debug.Log("1");
Demoのbuild and runを実行する前にUnityエディターを先に実行することでphotonView.IsMineとしてUnityエディターを認識させることができた。
playerSetableCountList[0]も1の表示を獲得することができたが、demoでボタンをクリックした後も同様の表示となり、値の共有ができないよう。
異なるディスプレイ間で共有する値を持てる機能を模索中。
現状ではRPCを用いて送受信する方法が助けになりそう。
https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono3