gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:12:14 25 4
gpt4 key购买 nike

说你有

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com