スコアを同期させる

スコアを加算するメソッド
using UnityEngine;
using Photon.Pun;
using ExitGames.Client.Photon;
using TMPro;
public class ScoreManager : MonoBehaviourPunCallbacks
{
public TextMeshProUGUI playerLabel_1;
public TextMeshProUGUI playerLabel_2;
private const string P1_NAME = "p1n";
private const string P2_NAME = "p2n";
private const string P1_SCORE = "p1s";
private const string P2_SCORE = "p2s";
void Start()
{
if (PhotonNetwork.IsMasterClient)
{
InitRoomProperties();
}
else
{
ResisterPlayer2();
}
RefreshUI();
}
void InitRoomProperties()
{
Hashtable props = new Hashtable
{
{P1_NAME, PhotonNetwork.NickName},
{P1_SCORE,0},
{P2_NAME,"Waiting..."},
{P2_SCORE,0}
};
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
void ResisterPlayer2()
{
Hashtable props = new Hashtable { { P2_NAME, PhotonNetwork.NickName } };
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
base.OnRoomPropertiesUpdate(propertiesThatChanged);
RefreshUI();
}
void RefreshUI()
{
if (PhotonNetwork.CurrentRoom == null)
{
return;
}
var props = PhotonNetwork.CurrentRoom.CustomProperties;
if (props.ContainsKey(P1_NAME) && props.ContainsKey(P1_SCORE))
{
playerLabel_1.text = props[P1_NAME].ToString() + ": " + ((int)props[P1_SCORE]).ToString("D4");
}
if (props.ContainsKey(P2_NAME) && props.ContainsKey(P2_SCORE))
{
playerLabel_2.text = props[P2_NAME].ToString() + ": " + ((int)props[P2_SCORE]).ToString("D4");
}
}
// ★追加
// スコアを加算するメソッド
public void AddScore(int playerNumber, int amount)
{
string scoreKey = (playerNumber == 1) ? P1_SCORE : P2_SCORE;
// 現在のスコアを読み出す
int currentScore = (int)PhotonNetwork.CurrentRoom.CustomProperties[scoreKey];
Hashtable props = new Hashtable { { scoreKey, currentScore + amount } };
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
}
オブジェクトを破壊したら得点が入る
using UnityEngine;
using Photon.Pun;
public class ObjectHP : MonoBehaviourPunCallbacks
{
public int HP;
private PhotonView pv;
// ★追加
private ScoreManager sm;
private int score;
void Start()
{
pv = GetComponent<PhotonView>();
// ★追加
// シーン内のScoreManagerを探して参照を保持
sm = FindFirstObjectByType<ScoreManager>();
// 耐久力(HP)の10倍のスコア
score = HP * 10;
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Bomb"))
{
PhotonView bombPV = collision.gameObject.GetComponent<PhotonView>();
if (!bombPV.IsMine)
{
return;
}
// ★改良
// RPCの引数に自分のActorNumber(1 or 2)を渡す
pv.RPC(nameof(ReduceHP), RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.ActorNumber);
}
}
// ★改良
[PunRPC]
void ReduceHP(int attackerActorNumber)
{
HP -= 1;
if (HP < 1)
{
// トドメを刺した本人(RPCを送った人)だけがスコア加算を実行
if (PhotonNetwork.LocalPlayer.ActorNumber == attackerActorNumber)
{
// ScoreManagerのメソッドを呼び出し(Player1なら1, Player2なら2が入る)
sm.AddScore(attackerActorNumber, score);
}
this.gameObject.SetActive(false);
}
}
}

【Unity6版】BattleOnline(全38回)
他のコースを見る
スコアを加算するメソッド
using UnityEngine;
using Photon.Pun;
using ExitGames.Client.Photon;
using TMPro;
public class ScoreManager : MonoBehaviourPunCallbacks
{
public TextMeshProUGUI playerLabel_1;
public TextMeshProUGUI playerLabel_2;
private const string P1_NAME = "p1n";
private const string P2_NAME = "p2n";
private const string P1_SCORE = "p1s";
private const string P2_SCORE = "p2s";
void Start()
{
if (PhotonNetwork.IsMasterClient)
{
InitRoomProperties();
}
else
{
ResisterPlayer2();
}
RefreshUI();
}
void InitRoomProperties()
{
Hashtable props = new Hashtable
{
{P1_NAME, PhotonNetwork.NickName},
{P1_SCORE,0},
{P2_NAME,"Waiting..."},
{P2_SCORE,0}
};
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
void ResisterPlayer2()
{
Hashtable props = new Hashtable { { P2_NAME, PhotonNetwork.NickName } };
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
base.OnRoomPropertiesUpdate(propertiesThatChanged);
RefreshUI();
}
void RefreshUI()
{
if (PhotonNetwork.CurrentRoom == null)
{
return;
}
var props = PhotonNetwork.CurrentRoom.CustomProperties;
if (props.ContainsKey(P1_NAME) && props.ContainsKey(P1_SCORE))
{
playerLabel_1.text = props[P1_NAME].ToString() + ": " + ((int)props[P1_SCORE]).ToString("D4");
}
if (props.ContainsKey(P2_NAME) && props.ContainsKey(P2_SCORE))
{
playerLabel_2.text = props[P2_NAME].ToString() + ": " + ((int)props[P2_SCORE]).ToString("D4");
}
}
// ★追加
// スコアを加算するメソッド
public void AddScore(int playerNumber, int amount)
{
string scoreKey = (playerNumber == 1) ? P1_SCORE : P2_SCORE;
// 現在のスコアを読み出す
int currentScore = (int)PhotonNetwork.CurrentRoom.CustomProperties[scoreKey];
Hashtable props = new Hashtable { { scoreKey, currentScore + amount } };
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
}
}
オブジェクトを破壊したら得点が入る
using UnityEngine;
using Photon.Pun;
public class ObjectHP : MonoBehaviourPunCallbacks
{
public int HP;
private PhotonView pv;
// ★追加
private ScoreManager sm;
private int score;
void Start()
{
pv = GetComponent<PhotonView>();
// ★追加
// シーン内のScoreManagerを探して参照を保持
sm = FindFirstObjectByType<ScoreManager>();
// 耐久力(HP)の10倍のスコア
score = HP * 10;
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Bomb"))
{
PhotonView bombPV = collision.gameObject.GetComponent<PhotonView>();
if (!bombPV.IsMine)
{
return;
}
// ★改良
// RPCの引数に自分のActorNumber(1 or 2)を渡す
pv.RPC(nameof(ReduceHP), RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.ActorNumber);
}
}
// ★改良
[PunRPC]
void ReduceHP(int attackerActorNumber)
{
HP -= 1;
if (HP < 1)
{
// トドメを刺した本人(RPCを送った人)だけがスコア加算を実行
if (PhotonNetwork.LocalPlayer.ActorNumber == attackerActorNumber)
{
// ScoreManagerのメソッドを呼び出し(Player1なら1, Player2なら2が入る)
sm.AddScore(attackerActorNumber, score);
}
this.gameObject.SetActive(false);
}
}
}

スコアを同期させる