【问题标题】:Unet Non-Player non-server Health syncingUnet Non-Player 非服务器健康同步
【发布时间】:2018-05-09 15:36:32
【问题描述】:

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

【问题讨论】:

    标签: unity3d unity3d-unet unet


    【解决方案1】:

    命令是客户端与服务器通信的唯一方式。 但是,您可以传递该敌人的 networkinstanceid,这将是引用对象的更好方法。 Gameobject.find 非常慢,应始终避免使用。另一个改进是在生成后给敌人一个本地玩家的参考,这样他就不必每次被击中时都去找他。 希望对您有所帮助。

    【讨论】:

    • 很好,我该如何获取敌人的networkinstanceid,然后用它在服务器上找到敌人?
    • 回顾我的代码,vThirdPersonController.instance 是一个存储了本地网络播放器的网络单例。所以它已经在里面了,但是被混淆了。
    • 我找到了。您只需在 NetworkBehaviour 对象上使用“netID”。效果很好!
    • 请注意,您必须使用 NetworkServer.FindLocalObject() 或 ClientScene.FindLocalObject(),具体取决于您是在服务器还是客户端执行。
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2018-12-20
    • 1970-01-01
    • 2023-01-24
    • 2021-01-14
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多