在新的 Unity 网络中进行“直接”RPC 风格调用?

2023-12-10

说你有

enter image description here

使用“新”Unity 网络,您必须具备(据我所知) a NetworkManager某处。它将产生可笑的“玩家”对象。

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

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

public class Comms : NetworkBehaviour { }

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

对于每个命令(例如“Jump”)你需要一对函数在通讯类中:

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();
    }
}

So!

借助新的 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();

(注意 - 显然,您可以在那里缓存“通讯”。这只是一个示例。)

旁白:极其重要:这只是一个概要示例。

在 实践你必须这样做:

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

So!

事情是这样的:

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

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

我试图理解,

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

据我所知,只有NetworkBehaviour派生类可以做到这一点。在旧的网络中,任何类都可以进行这样的调用。

据我所知,在“新”Unity 网络中must you通过一个NetworkBehaviour派生类,如我的示例所示。

正如你所看到的,如果我“遗漏了一些东西”,而像 Jumping 这样的类可以直接做到这一点,那么我的代码就是令人发指的:)

你可以打电话吗Command直接来自 MonoBehaviour 吗?

事实上,我是否完全错误,你必须拥有可笑的自动生成的“玩家”对象等等?也许还有一种完全不同的调用方式Commands.


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

UNetWeaver 错误:脚本 XXXXXX 使用 [命令] YYYYY 但不是 NetworkBehaviour。

然而,还有其他非常接近您想要实现的目标的可能性。

  • 正如评论中所讨论的,您可以使用事件和代表来订阅您的[Command]函数到继承自的类的另一个函数MonoBehavior.
  • 我刚刚尝试并取得成功的另一个非常聪明的可能性是使用接口。

我刚刚做了一个简单的接口,没有实现任何其他接口,它只是声明一个命令。它看起来像这样:

public interface ICustomCommands
{
    [Command]
    void CmdCustomSpawn(GameObject toSpawn);
}

然后我创建了一个简单的类,它将实现这个接口(一个方法),而不使用[Command]关键词。我的自定义类继承自MonoBehavior看起来像这样:

public class CustomCommands : MonoBehaviour, ICustomCommands
{
    public void CmdCustomSpawn(GameObject toSpawn)
    {
        NetworkServer.Spawn(toSpawn);
    }
}

然后我就成功地拨打了我的电话CmdCustomSpawn函数并在服务器上生成一个玩家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在新的 Unity 网络中进行“直接”RPC 风格调用? 的相关文章

  • 本地主机:8080 是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有什么区别本地主机 网络 vs 本地主机 8080 web TCP IP 连接始终与 IP 地址建立 您可以将 IP 地址视为某台计算机的
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • IP 标志的不分段位在哪里使用?

    我很想知道 IP 标志的 不分段 DF 位在哪里使用 因为碎片对于更高层来说是不可见的 并且他们也不关心 我也在寻找一个例子 预先非常感谢 碎片并不总是对所有上层都可见 一些早期 甚至可能是当前 微控制器 TCP IP 堆栈没有实现碎片处理
  • C# 自动检测代理设置

    C 2008 SP1 我正在使用代码来检测是否已在 Internet 选项 下设置代理 如果有代理 那么我将在我的网络客户端中设置它 所以我只是检查代理的地址是否存在 如果没有 则说明 Web 客户端中没有要设置的代理 这是执行此操作的正确
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 在 Unity 中使用 MRTK 和 Vuforia - 选择什么相机?

    我是 AR 新手 最近几天在 Unity 上设置了 MRTK 和 Vuforia 两者独立运行良好 现在我想在一个项目中使用两者 但问题是两者都有相机 MRTK 有自己的 MixedRealityCamera 和 Vuforia ARCam
  • 通过 RMI 的服务器,无需注册

    我有一个可以通过 RMI 连接的服务对象 目前我正在这样做 Server Registry r LocateRegistry createRegistry 1234 r bind server UnicastRemoteObject exp
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 扭曲多种协议

    我希望为我正在从事的项目学习扭曲 该项目需要服务器响应 HTTP 请求以及通过 TCP 连接的其他协议 Twisted能够同时处理多种协议吗 我想使用 Twisted Web 来帮助处理 HTTP 但同时需要响应其他端口上的 TCP 连接
  • 无法添加脚本,因为它是编辑器脚本错误

    如何在 Unity 中解决此问题 无法添加脚本 因为它是编辑器脚本 我想将此脚本从后处理中放入 Unity 但由于这个问题我不能 Unity 有特殊的文件夹名称 其中之一是 编辑 Editor 文件夹用于放置在编辑器中执行的编辑器脚本 它不
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 如果其中一台机器死机,TCP 连接如何终止?

    如果两个主机 A 和 B 之间建立了 TCP 连接 假设主机 A 已向主机 B 发送了 5 个八位字节 然后主机 B 崩溃了 由于未知原因 主机 A 将等待确认 但如果没有收到确认 将重新发送八位字节并减小发送者窗口大小 这将重复几次 直到
  • 如何替换`qemu-system -redir`命令参数?

    我有一个使用以下选项启动 qemu 的脚本 qemu system x86 64 net nic model rtl8139 net user hostfwd tcp 5555 1522 net dump file tmp vm0 pcap
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 将 Docker 容器连接到本地主机的最简单方法

    我想知道是否可以从 Docker 容器连接到本地主机上的应用程序 我运行两个 Docker 容器 它们通过以下方式相互连接link选项 但是如何将其中一个容器连接到本地主机呢 是的 使用docker run network containe
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 使用 Unity3D 按钮执行 xcode 函数?

    是否可以在 unity 中制作一个按钮来执行 Xcode 中的功能 我正在尝试执行来自 unity3d 项目的推送消息 请帮忙 因为这让我发疯 提前致谢 是的 您可以调用具有 C 接口的本机 Objective C 代码 您甚至可以在 Un
  • HttpRequest 和 XMLHttpRequest 之间的真正区别

    阅读前注意事项 这不是重复的xmlhttprequest 和 httprequest 之间的区别是什么 https stackoverflow com questions 8499062 what are differences betwe
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • 为什么 Kademlia 使用 UDP?

    为什么Kademlia 分布式哈希表 http en wikipedia org wiki Kademlia使用 UDP 作为其网络传输协议 即使它不可靠 主要原因是您快速查询了许多以前从未建立过联系并且可能在查找过程中永远不会再看到的节点

随机推荐