Unet 非玩家非服务器健康同步
Unet Non-Player non-server Health syncing
我有服务器生成的敌人对象。当它们被击中时,会调用它们的函数来施加伤害。我无法移动或重命名此功能,因为它是具有许多互连部分的 Unity 资产包的一部分。出于同样的原因,我也无法施加攻击者的伤害。
我现在拥有的是我抓住本地玩家,用它们向服务器发送消息([命令]),服务器将伤害施加到所有客户端上的敌人。
这似乎是一种糟糕的方法。除了 [Command] 之外,还有其他方法可以向服务器发送消息以执行功能吗?
注意:我不能直接从敌人那里调用[Command],因为它不是玩家权限对象。这是相关代码:
敌人:
[ClientRpc]
public void RpcTakeDamage(vDamage damage)
{
base.TakeDamage(damage);
}
override public void TakeDamage(vDamage damage)
{
if (!isServer)
{
vThirdPersonController.instance.GetComponent<NetworkLocalPlayer>().CmdTakeDamage(damage, gameObject.name);
return;
}
RpcTakeDamage(damage);
}
在玩家对象上:
[Command]
public void CmdTakeDamage(vDamage damage, string ai)
{
GameObject.Find(ai).GetComponent<v_AIController>().TakeDamage(damage);
}
public void damageNetworkEnemy(vDamage damage, GameObject ai)
{
CmdTakeDamage(damage, ai.name);
}
我的问题:有没有更好的方法来做到这一点而无需查找和遍历播放器对象?一种不使用 [Command] 向服务器发送消息的方法?
命令是客户端与服务器通信的唯一方式。
但是,您可以传递该敌人的网络实例 ID,这将是一种更好的引用对象的方式。 Gameobject.find 非常慢,应始终避免。另一个改进是在敌人重生后为他的本地玩家提供参考,这样他就不必每次被击中时都去寻找他。
希望能有所帮助。
我有服务器生成的敌人对象。当它们被击中时,会调用它们的函数来施加伤害。我无法移动或重命名此功能,因为它是具有许多互连部分的 Unity 资产包的一部分。出于同样的原因,我也无法施加攻击者的伤害。
我现在拥有的是我抓住本地玩家,用它们向服务器发送消息([命令]),服务器将伤害施加到所有客户端上的敌人。
这似乎是一种糟糕的方法。除了 [Command] 之外,还有其他方法可以向服务器发送消息以执行功能吗?
注意:我不能直接从敌人那里调用[Command],因为它不是玩家权限对象。这是相关代码:
敌人:
[ClientRpc]
public void RpcTakeDamage(vDamage damage)
{
base.TakeDamage(damage);
}
override public void TakeDamage(vDamage damage)
{
if (!isServer)
{
vThirdPersonController.instance.GetComponent<NetworkLocalPlayer>().CmdTakeDamage(damage, gameObject.name);
return;
}
RpcTakeDamage(damage);
}
在玩家对象上:
[Command]
public void CmdTakeDamage(vDamage damage, string ai)
{
GameObject.Find(ai).GetComponent<v_AIController>().TakeDamage(damage);
}
public void damageNetworkEnemy(vDamage damage, GameObject ai)
{
CmdTakeDamage(damage, ai.name);
}
我的问题:有没有更好的方法来做到这一点而无需查找和遍历播放器对象?一种不使用 [Command] 向服务器发送消息的方法?
命令是客户端与服务器通信的唯一方式。 但是,您可以传递该敌人的网络实例 ID,这将是一种更好的引用对象的方式。 Gameobject.find 非常慢,应始终避免。另一个改进是在敌人重生后为他的本地玩家提供参考,这样他就不必每次被击中时都去寻找他。 希望能有所帮助。