我有服务器产生的敌人对象。当它们被击中时,它们上的一个函数被调用来施加伤害。我无法移动或重命名此功能,因为它是具有许多互连部分的Unity资产包的一部分。出于同样的原因,我无法对攻击者施加伤害。
我现在拥有的是我抓住本地播放器,使用它们向服务器发送消息([Command]),服务器对所有客户端的敌人施加伤害。
这似乎是一种不好的方法。是否有除[Command]以外的方法向服务器发送消息以执行函数?
注意:我不能直接从敌人那里调用[Command],因为它不是玩家的Authority对象。以下是相关代码:
敌人:
[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]的情况下向服务器发送消息的方法?
答案 0 :(得分:1)
命令是客户端与服务器通信的唯一方式。 但是,您可以通过该敌人的networkinstanceid,这将是一种更好的引用对象的方式。 Gameobject.find非常慢,总是应该避免。另一个改进是在产生后让敌人参考他的当地玩家,这样他每次被击中都不需要找他。 希望有所帮助。