Unity3d 制造;直接;新Unity网络中的RPC风格调用?
说你有 使用“新”Unity网络,您必须(据我所知)在某个地方有一个Unity3d 制造;直接;新Unity网络中的RPC风格调用?,unity3d,networking,Unity3d,Networking,说你有 使用“新”Unity网络,您必须(据我所知)在某个地方有一个NetworkManager。它将产生可笑的“玩家”对象 可笑的“player”对象必须有一个继承自networkbehavior的类 大多数团队称该类为“Comms”或“AbstractPlayer”或“Junction” 因此,每个命令(如“Jump”)都必须由该“Comms”类进行调解 对于每个命令(如“Jump”)您需要Comms类中的一对函数: public class Comms : NetworkBehaviou
NetworkManager
。它将产生可笑的“玩家”对象
可笑的“player”对象必须有一个继承自networkbehavior
的类
大多数团队称该类为“Comms”或“AbstractPlayer”或“Junction”
因此,每个命令(如“Jump”)都必须由该“Comms”类进行调解
对于每个命令(如“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();
}
}
实际上,您必须通过抽象播放器上的“comms”类发送它
public class Jumping: MonoBehavior...
// here in the client side ... we want to send "Jump"
Comms comms = Object.FindObjectOfType<Comms>();
comms.CommandClick1();
公共类跳跃:单一行为。。。
//在客户端这里。。。我们要发送“跳跃”
Comms Comms=Object.FindObjectOfType();
comms.CommandClick1();
(注意——显然,您会将“comm”缓存在那里。这只是一个示例。)
旁白:非常重要:这只是一个概要示例
在
练习你必须这样做:
所以
事情是这样的:
在“旧”Unity网络中,任何旧客户端脚本都可以直接进行网络调用(“示例中的CmdJump”)。您所需要的只是一个到NetworkView的链接
现在您必须在示例中使用这个新的“中间”类“Comms”
我试着去理解
客户端的普通脚本(如跳跃-单一行为)是否有办法直接调用命令
?
据我所知,只有networkbehavior
派生类才能做到这一点。在旧的网络中,任何班级都可以打这样的电话
在“新”Unity networking中,据我所知,您必须通过NetworkBehavior
派生类传递每个调用,如我这里的示例所示
正如您所看到的,如果我“遗漏了一些东西”,而诸如Jumping之类的类可以直接做到这一点,那么我的代码就是令人发指的:)
您能否在MonoBehavior中直接从调用命令
s
事实上,我完全错了,你必须有可笑的自动生成的“玩家”对象,等等?也许有一种完全不同的方法来调用
Command
s.您的问题的简短答案是否定的。因为在monobhavior
中使用[Command]
关键字会立即导致编辑器出错,因为代码无法编译
UNetWeaver错误:脚本XXXXXX使用[Command]
YYYY,但不是一种网络行为
然而,还有其他一些可能性非常接近你想要实现的目标
- 如注释中所述,您可以使用事件和委托将
函数从继承自[Command]
的类订阅到另一个函数monobhavior
- 另一个我刚刚尝试并成功使用的非常聪明的可能性是使用接口
public interface ICustomCommands
{
[Command]
void CmdCustomSpawn(GameObject toSpawn);
}
public class CustomCommands : MonoBehaviour, ICustomCommands
{
public void CmdCustomSpawn(GameObject toSpawn)
{
NetworkServer.Spawn(toSpawn);
}
}
然后我创建了一个简单的类,它将实现这个接口(one方法),而不使用[Command]
关键字我的自定义类继承自monobhavior
,如下所示:
public interface ICustomCommands
{
[Command]
void CmdCustomSpawn(GameObject toSpawn);
}
public class CustomCommands : MonoBehaviour, ICustomCommands
{
public void CmdCustomSpawn(GameObject toSpawn)
{
NetworkServer.Spawn(toSpawn);
}
}
然后,我成功地调用了我的
CmdCustomSpawn
函数,并在服务器上生成了一个播放器。我对“直接调用命令的MonoBehavior”的看法是否定的,但这并不意味着不能订阅将触发[命令]的Mono事件
功能。这里有大量赏金@Hristo,当然可以使用unity事件作为一种方便(我个人只使用一个简单的单例或全局来访问“逗号”类)。实际上,正如您所知,关键是您能否从非网络行为“实际”调用命令
。。。(就像你“过去能做的”!)!!接口和类不是从networkbehavior
派生的??这怎么行?!太棒了。@Fattie我自己也大吃一惊,你试过了吗?还没有,我一直很困惑。。。也许事实上,你不能在单一行为中使用它是那些“虚假的”统一的东西之一?因此,他们(不知何故)“阻止”了它,这不是需要网络行为的情况。(也许它只适用于原始基类?我必须检查!)仅供参考,我为此发送了一份赏金!:)还在调查!总有一天我会回来的。。