提问人:Jan Arend 提问时间:10/27/2023 更新时间:10/27/2023 访问量:13
通过 websocket 将实时游戏对象位置发送到网站
Sending realtime gameobject position via websockets to a website
问:
对于研究应用程序,我们需要使用 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 继承的,但我们不知道如何解决这个问题。如果有人能帮助我们,他们就会成为英雄!
答: 暂无答案
评论