我正在通过Unity Multiplayer系统学习多人游戏的实现。 因此,我遇到了为初学者编写的非常好的教程: Introduction to a Simple Multiplayer Example
在本教程中,我无法理解此页面内容: Death and Respawning
通过这段代码,在教程中,他们正在谈论我们的玩家将重生(玩家将在0位置变形,生命值将为100),并且玩家可以再次战斗。
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;
public class Health : NetworkBehaviour {
public const int maxHealth = 100;
[SyncVar(hook = "OnChangeHealth")]
public int currentHealth = maxHealth;
public RectTransform healthBar;
public void TakeDamage(int amount)
{
if (!isServer)
return;
currentHealth -= amount;
if (currentHealth <= 0)
{
currentHealth = maxHealth;
// called on the Server, but invoked on the Clients
RpcRespawn();
}
}
void OnChangeHealth (int currentHealth )
{
healthBar.sizeDelta = new Vector2(currentHealth , healthBar.sizeDelta.y);
}
[ClientRpc]
void RpcRespawn()
{
if (isLocalPlayer)
{
// move back to zero location
transform.position = Vector3.zero;
}
}
}
按照我的想法->所有客户端都在执行ClientRPC,因此本地播放器的所有设备都将在生成位置移动,并且运行状况会充满。 按照本教程->仅更新自己玩家的生成位置和生命值。
那为什么我无法理解这件事呢? 实际上,RPC在所有客户端上都被调用,然后所有客户端都应要求移动到起始位置并获得完全的运行状况。 请给我一些解释。
答案 0 :(得分:0)
您可以在该图像上看到,您需要认为网络系统不是“共享”房间,它们实际上是在您自己房间中复制其他系统的所有内容。
知道了这一点,现在您可以理解,如果从播放器1发送Rpc,则Rpc将在播放器1上执行,而播放器1将在播放器2的房间中复制。
由于您可以在文档上阅读[ClientRpc]属性,因此:
是可以放在NetworkBehaviour方法上的属性 类,以允许它们在服务器上的客户端上被调用。
因此,由于播放器1的房间是主机(服务器+客户端),而播放器2的是客户端,则它将在2个房间的主机上执行,但在第一个房间进行评估。
编辑:这意味着,例如,播放器1死亡时,它将调用RPC函数,并且(因为它是RPC)他在房间2上的副本(Player1-Copy)将执行相同的操作
。