Unet非播放器非服务器运行状况同步

时间:2018-05-07 20:29:16

标签: unity3d unity3d-unet unet

我有服务器产生的敌人对象。当它们被击中时,它们上的一个函数被调用来施加伤害。我无法移动或重命名此功能,因为它是具有许多互连部分的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]的情况下向服务器发送消息的方法?

1 个答案:

答案 0 :(得分:1)

命令是客户端与服务器通信的唯一方式。 但是,您可以通过该敌人的networkinstanceid,这将是一种更好的引用对象的方式。 Gameobject.find非常慢,总是应该避免。另一个改进是在产生后让敌人参考他的当地玩家,这样他每次被击中都不需要找他。 希望有所帮助。