我正在使用PUN2制作射击游戏,但是遇到了一个玩家没有消失的问题。实现了播放器移动,使用PunRPC的外壳移动,项目符号处理等。
我使用以下代码在播放器的生命值变为0时执行Destroy()播放器。
Player.cs:
GameObject Player; // player object attached
int HP = 100;
//If hit
public void Damaged(int damage)
{
photonView.RPC(nameof(UpdateHP), RpcTarget.All, damage)
}
[PunRPC]
void UpdateHP(int damage)
{
HP -= damage;
if(HP <= 0)
photonView.RPC(nameof(RemovePlayer), RpcTarget.All);
var hashtable = new Hashtable();
hashtable["HP"] = HP;
PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);
}
[PunRPC]
void RemovePlayer()
{
Destroy(Player)
}
Flow:从shell脚本中在Player.cs中执行Damaged(int),用PunRPC计算物理强度,如果它小于0,则执行RemovePlayer( )和PunRPC。
调用photonView.RPC(nameof(RemovePlayer),RpcTarget.All);会产生错误。
NullReferenceException:对象引用未设置为对象的实例
而且,当我在不使用PunRPC的情况下使用Destroy()时,它只会从他的设备中消失,并且对其他玩家仍然可见。
不带PunRPC的Destroy():
GameObject Player; // player object attached
int HP = 100;
//If hit
public void Damaged(int damage)
{
photonView.RPC(nameof(UpdateHP), RpcTarget.All, damage)
}
[PunRPC]
void UpdateHP(int damage)
{
HP -= damage;
if(HP <= 0)
RemovePlayer();
var hashtable = new Hashtable();
hashtable["HP"] = HP;
PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable);
}
void RemovePlayer()
{
Destroy(Player)
}
正如mrPhilipp所说,通过执行PhotonNetwork.Destroy(),我能够完全删除该对象。在[PunRPC]之外,这是可能的。