【发布时间】:2018-07-17 12:56:18
【问题描述】:
说你有
使用“新”Unity 网络,您必须在某处(据我所知)NetworkManager。它会产生可笑的“玩家”对象。
荒谬的“玩家”对象必须有一个继承自NetworkBehaviour的类。
大多数团队将该类称为“Comms”或“AbstractPlayer”或“Junction”。
public class Comms : NetworkBehaviour { }
因此,每个命令(例如“Jump”)都必须由该“Comms”类进行调解。
对于每个命令(如“跳转”)您需要在 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();
(注意 - 显然,您会在此处缓存“通讯”。这只是一个示例。)
旁白:非常重要:这只是一个大纲示例。
在 练习你必须这样做:
所以!
事情是这样的:
在“旧”Unity 网络中,任何旧客户端脚本可以直接进行网络调用(示例中为“CmdJump”)。您只需要一个指向 NetworkView 的链接。
现在您必须拥有这个新的“中间”类,在示例中为“Comms”。
我正在努力理解,
有没有办法让客户端的普通脚本(例如 Jumping - a MonoBehavior)直接调用 Command?
据我所知,只有NetworkBehaviour 派生类可以做到这一点。在旧的网络中,任何班级都可以进行这样的调用。
在“新”Unity 网络中,据我所知,您必须通过NetworkBehaviour 派生类传递每个调用,就像我在此处的示例一样。
如你所见,如果我“遗漏了什么”,而像 Jumping 这样的类可以直接完成,那么我的代码是令人发指的 :)
您可以直接从 MonoBehavior 中调用 Commands 吗?
你必须拥有可笑的自动生成的“玩家”对象等等,我真的完全错了吗?也许还有另一种方式可以打电话给Commands。
【问题讨论】:
-
我对“a MonoBehavior 直接调用命令?”的看法是否定的,但这并不意味着
NetworkingBehavior不能订阅 Mono事件,这将触发[Command]函数。 -
这里有大量的赏金!
-
@Hristo,当然你可以使用统一事件作为一种方便(我个人只是使用一个微不足道的单例或全局来达到“逗号”类)。确实,正如您所知,关键是您能否“实际上”从非 NetworkBehaviour 调用
Command...(就像您“过去能够做到”..)!
标签: unity3d networking