unity3d - 在新的 Unity 网络中进行 "direct"RPC 样式调用?

标签 unity3d networking

说你有

enter image description here

使用"new"的 Unity 网络,您必须(据我所知)拥有一个 NetworkManager某处。它将产生可笑的“玩家”对象。

可笑的“玩家”对象必须有一个继承自 NetworkBehaviour 的类。 .

大多数团队将该类称为“Comms”或“AbstractPlayer”或“Junction”。

public class Comms : NetworkBehaviour { }

因此,每个命令(如“Jump”)都必须由“Comms”类进行调解。

对于每个命令(如“跳转”)你需要一对函数在通讯类中:
public class Comms : NetworkBehaviour {

    // for every command (say, "Jump") you need THIS PAIR of functions:

    public void CommandJump() {
        Debug.Log("this is comms - client, do a Jump");
        CmdJump();
    }

    [Command]
    void CmdJump() {
        Debug.Log("this is comms - server. a Jump arrived");
        // simply pass on that command to the correct script on a server...
        s = Object.FindObjectOfType<Some Class On The Server>();
        s.ClientJumped();
    }
}

所以!

使用新的 Unity 网络,在客户端,每次您想要
send to server Jump()

实际上,您必须通过抽象播放器上的“comms”类发送它。
public class Jumping: MonoBehavior...

    // here in the client side ... we want to send "Jump"
    Comms comms = Object.FindObjectOfType<Comms>();
    comms.CommandClick1();

(注意 - 显然,你会在那里缓存“通讯”。这只是一个例子。)

Aside: extremely important: that is just a outline example.

In practice you must do this:

https://stackoverflow.com/a/51759299/294884



所以!

事情是这样的:

在“旧”Unity 网络中,任何旧客户端脚本 可以直接调用网络电话 (示例中的“CmdJump”)。您只需要一个指向 NetworkView 的链接。

现在,您必须拥有这个新的“中间”类,即示例中的“Comms”。

我试图理解,

有没有办法让客户端的普通脚本(比如 Jumping - a MonoBehavior)直接调用 Command ?

据我所知,只有NetworkBehaviour派生类可以做到这一点。在旧的网络中,任何类(class)都可以发出这样的电话。

在"new"Unity 网络中,据我所知你必须要通过 NetworkBehaviour 传递每个调用派生类,就像我在这里的例子一样。

如您所见,如果我“遗漏了什么”,而诸如 Jumping 之类的类可以直接做到这一点,那么我的代码是令人发指的 :)

可以调用Command s 直接来自 MonoBehavior?

你必须拥有可笑的自动生成的“玩家”对象等等,我真的完全错了吗?也许有完全不同的方式来调用 Command s。

最佳答案

您的问题的简短回答是否定的。仅仅因为使用 [Command] MonoBehavior 中的关键字将立即导致您的编辑器出错,因为无法编译代码。

UNetWeaver error: Script XXXXXX uses [Command] YYYYY but is not a NetworkBehaviour.



但是,还有其他可能非常接近您想要实现的目标。
  • 正如评论中所讨论的,您可以使用事件和代表来订阅您的 [Command]。函数从继承自 MonoBehavior 的类中的另一个函数.
  • 我刚刚尝试并取得成功的另一个非常聪明的可能性是使用接口(interface)。

  • 我刚刚做了一个简单的接口(interface),它没有实现任何其他接口(interface),它只是声明了一个命令。它看起来像这样:
    public interface ICustomCommands
    {
        [Command]
        void CmdCustomSpawn(GameObject toSpawn);
    }
    

    然后我做了一个简单的类来实现这个接口(interface)(一个方法)而不使用[Command]。关键词。 我的自定义类继承自 MonoBehavior 看起来像这样:
    public class CustomCommands : MonoBehaviour, ICustomCommands
    {
        public void CmdCustomSpawn(GameObject toSpawn)
        {
            NetworkServer.Spawn(toSpawn);
        }
    }
    

    然后我成功地调用了我的CmdCustomSpawn在服务器上运行并生成玩家。

    关于unity3d - 在新的 Unity 网络中进行 "direct"RPC 样式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381964/

    相关文章:

    c# - 如何在 Unity 中更改游戏对象的纹理?

    android - 无法将事件从 Unity 传回 android 库 jar

    c# - 无法重新实例化/重生我在 Unity3D 中销毁的对象

    c++ - 'inet_pton' : identifier not found

    c - 如何识别TCP 3次握手中的初始数据包?

    windows - 通过cmd获取网速(Windows)

    networking - Vagrant 崩溃取决于物理网络

    c# - 如何将 Roslyn 代码分析器添加到 Unity 项目? (适用于 2020 以下的 Unity 版本)

    c# - Unity - 加载栏通常在加载时直接从 0% 变为 100% (C#)

    java - 使用数据报 channel 时无法访问端口