通过 websocket 将实时游戏对象位置发送到网站

Sending realtime gameobject position via websockets to a website

提问人:Jan Arend 提问时间:10/27/2023 更新时间:10/27/2023 访问量:13

问:

对于研究应用程序,我们需要使用 websocket 服务器将 unity 游戏对象的实时位置数据发送到可以跟踪位置的仪表板。我们使用 WebsocketSharp 和 Singleton 来收集数据,websocket 类如下所示:

using UnityEngine;
using System;
using WebSocketSharp;
using WebSocketSharp.Server;
using UnityEditor;
using System.Threading;
using TMPro;

public class ServerBehaviour : MonoBehaviour
{
    private static ServerBehaviour instance;
    [SerializeField] public GameObject cube;
    
    private ServerBehaviour()
    {
        
    }
    
    void Start()
    {
        var wssv = new WebSocketServer(System.Net.IPAddress.Loopback, 7777);

        wssv.KeepClean = true;

        wssv.AddWebSocketService<SendData>("/SendData");
        wssv.Start();

        if (!EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode)
        {
            wssv.Stop();
        }
    }

    void Update()
    {
Debug.Log(ServerBehaviour.Instance.GetCubeYPosition())
    }

    public static ServerBehaviour Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new ServerBehaviour();
            }
            return instance;
        }
    }
      public float GetCubeYPosition()
    {
        if (cube != null)
        {
            return cube.transform.position.y;
        }
        else
        {
            Debug.LogWarning("Cube is not set!");
            return 0f; // or any default value
        }
    }
}

public class SendData : WebSocketBehavior
{
    private bool wait = false;

    protected override void OnOpen()
    {
        SendToClient();
    }

    void SendToClient()
    {
        while (true)
        {
            float cubeYPosition = ServerBehaviour.Instance.GetCubeYPosition();
            Debug.Log(cubeYPosition);
            string dataStr = cubeYPosition.ToString();
            Debug.Log(dataStr);
            Send(dataStr);

            Thread waiter = new Thread(new ThreadStart(Wait));
            waiter.Start();

            while (wait == true)
            {
                // Do nothing
            }
        }
    }

    void Wait()
    {
        wait = true;
        Thread.Sleep(100);
        wait = false;
    }
}

启动 unity 时,服务器将与仪表板连接,在每次更新时将数据记录到 unity 控制台,但它不会发送任何数据,也不会继续 SendToClient 中的 while 循环。

我们尝试了多种解决方案,期望在 WebsocketBehaviour 类中接收数据,但没有任何效果。我们认为这是因为该类不是从 MonoBehaviour 继承的,但我们不知道如何解决这个问题。如果有人能帮助我们,他们就会成为英雄!

C# unity-游戏引擎 单例 websocket-sharp

评论

0赞 BugFinder 10/27/2023
你的构建目标是什么?你确定你没有在任何地方的防火墙后面,例如端口是可访问的,你确定SendToClient运行吗?
0赞 Jan Arend 10/27/2023
是的,它在发送 WebsocketBehaviour 类本身声明的静态浮点数时起作用,因此只有在接收到游戏对象数据时才不起作用

答: 暂无答案