【问题标题】:Unity3D -- Send message to other mobile phones in the same vicinityUnity3D -- 向同一附近的其他手机发送消息
【发布时间】:2013-12-02 15:07:12
【问题描述】:

假设我们有一组 10 人,彼此相距不到 20m。每个人都有一部手机(iPhone / android / Windows phone)。

然后一个人点击屏幕发送消息。

这会立即被其他人注册。同步是关键。它必须在几毫秒内击中所有目标设备。

我该怎么办?

  • web 套接字:我看不到这个工作,因为不保证有任何 Wi-Fi 网络。也许我将一部手机设置为接入点,然后其他手机连接到它?
  • 蓝牙:可能吗?
  • 音频:也许,声速可能足够接近时间分辨率。但是很乱。
  • 还有别的吗?

我在 Unity3D 中工作,但由于它允许移动插件,我可以在每个平台上单独实现。

一个仅限 iphone 的解决方案仍然很有趣。

编辑:请不要只说“使用蓝牙”

编辑:重新表述问题的一种方法:是否可以设置一堆手机,以便可以在它们之间发送 UDP 数据包? (Ad-Hoc 网络?)

编辑:链接: Transfer NSString between two devices via bluetooth in iOS Transfer data between iOS and Android via Bluetooth?

【问题讨论】:

  • 我会说蓝牙是你最好的选择。另一种选择是使用 GPS 坐标的服务器端解决方案,但我认为你不可能达到几毫秒的标记。
  • 蓝牙似乎是要走的路。
  • WiFi 直连(或有时称为 WiFi P2P)是一种选择。

标签: mobile synchronization unity3d


【解决方案1】:

对于 android,“WiFi-Direct”可以完美地做到这一点。

对于 iphone,“Multipeer Connectivity”可能是您想要的。

我是一名安卓开发者,对 iPhone 不是很熟悉。据我所知,Wifi-Direct 使用 wifi,Multipeer Connectivity 使用蓝牙。

而且,iphone可以连接到android WiFi-Direct软ap。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    使用OSC,您可以实时向同一 wifi 网络中的所有设备广播。

    有一段时间没有统一使用它,但这可能会有所帮助: https://github.com/jorgegarcia/UnityOSC

    【讨论】:

      【解决方案3】:

      这需要一些试验,但如果您可以将手机作为外围设备连接到一个设备,同时作为另一设备的主设备,您可以构建一个环形网络,将所有数据传输到所有手机.

      老实说,您应该只连接到 wifi 网络(路由器)。除非您的项目的目的是围绕网络架构构建工作。我假设在没有越狱的情况下,使用 wifi 热点功能将无法在现成的 iphone 上运行。最重要的是,执行此类操作的 API 并未出现在文档中。

      祝你好运,如果你真的想出了一个方法来做到这一点,我会很高兴听到这个消息。

      http://en.wikipedia.org/wiki/Token_ring

      【讨论】:

        【解决方案4】:

        不确定“毫秒”同步是否可行,但对于跨平台发现部分,您可以使用诸如 http://p2pkit.io 之类的 SDK,它将发现附近设备背后的所有复杂工作流程抽象出来。

        免责声明:我为 Uepaa 工作,为 iOS 和 Android 开发 p2pkit。

        【讨论】:

          【解决方案5】:

          使用 UNET 创建一个运行 UNET 的专用服务器和一个基于地理位置的位置聊天室。

          【讨论】:

            【解决方案6】:

            音频解决方案似乎是一种非常独特的技术。我不能说我听说过以这种方式去做,但似乎是合法的。唯一的问题是它可能会由于麦克风质量而失去准确性。我做了一些研究,找到了一种在 c# 中播放正弦波/方波声音的方法(假设你没有使用 javascript 来统一)。这是播放它们的示例:

                int sampRate = 10000;
                short[] buf = new short[10000];
                double ampl = 0.25 * short.MaxValue;
                double freq = 5000;
            
                for (int s = 0; s < buf.Length; s++){
            
                    buffer[s] = (short)(ampl * Math.Sin((2 * Math.PI * s * freq) / sampleRate));
            
                }
            

            至于获取声音并验证它是否匹配,我很难过,这就是我的知识结束的地方,但我知道它是可能的,但可能需要更多的工作而不是它的价值。

            要回答您的主要问题,最简单的方法是蓝牙。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-08-09
              • 1970-01-01
              • 1970-01-01
              • 2013-12-21
              • 2014-01-30
              • 1970-01-01
              相关资源
              最近更新 更多