Unity3d 制造;直接;新Unity网络中的RPC风格调用?

Unity3d 制造;直接;新Unity网络中的RPC风格调用?,unity3d,networking,Unity3d,Networking,说你有 使用“新”Unity网络,您必须(据我所知)在某个地方有一个NetworkManager。它将产生可笑的“玩家”对象 可笑的“player”对象必须有一个继承自networkbehavior的类 大多数团队称该类为“Comms”或“AbstractPlayer”或“Junction” 因此,每个命令(如“Jump”)都必须由该“Comms”类进行调解 对于每个命令(如“Jump”)您需要Comms类中的一对函数: public class Comms : NetworkBehaviou

说你有

使用“新”Unity网络,您必须(据我所知)在某个地方有一个
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我自己也大吃一惊,你试过了吗?还没有,我一直很困惑。。。也许事实上,你不能在单一行为中使用它是那些“虚假的”统一的东西之一?因此,他们(不知何故)“阻止”了它,这不是需要
网络行为的情况。(也许它只适用于原始基类?我必须检查!)仅供参考,我为此发送了一份赏金!:)还在调查!总有一天我会回来的。。