I'm trying to recreate a SpeedoMeter in unity where the RPM data is getting sent from a python Script. I used sockets to send the data to my unity app instead of request as for some reason, I keep getting an 'Invalid host - 404' Error. The data is being received by Unity but the GUI is not updating. I've declared the Image in the inspector but it still didn't update.
using UnityEngine;
using UnityEngine.UI;
using System.Net;
using System.Text;
using System.Threading;
using System.Net.Sockets;
public class Speedometer : MonoBehaviour
{
Thread thread;
public int connectionPort = 25001;
TcpListener server;
TcpClient client;
bool running;
public Image SpeedoMeter_Needle;
float currentSpeed = 0.0f;
volatile float targetSpeed = 0;
float needleSpeed = 100.0f;
void Start()
{
if (SpeedoMeter_Needle == null)
{
Debug.LogError("Speedometer Needle Image is not assigned!");
return;
}
thread = new Thread(GetData);
thread.Start();
}
void GetData()
{
server = new TcpListener(IPAddress.Any, connectionPort);
server.Start();
running = true;
while (running)
{
client = server.AcceptTcpClient();
NetworkStream nwStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
while (client.Connected)
{
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
if (bytesRead > 0)
{
string dataReceived = Encoding.UTF8.GetString(buffer, 0, bytesRead);
float parsedValue = ParseData(dataReceived);
UnityMainThreadDispatcher.Instance().Enqueue(() => targetSpeed = parsedValue);
nwStream.Write(buffer, 0, bytesRead);
}
}
client.Close();
}
server.Stop();
}
private static float ParseData(string dataString)
{
Debug.Log(dataString);
if (dataString.StartsWith("(") && dataString.EndsWith(")"))
{
dataString = dataString.Substring(1, dataString.Length - 2);
}
return float.Parse(dataString);
}
void Update()
{
if (targetSpeed != currentSpeed)
{
UpdateSpeed();
}
}
void UpdateSpeed()
{
if (targetSpeed > currentSpeed)
{
currentSpeed += Time.deltaTime * needleSpeed;
currentSpeed = Mathf.Clamp(currentSpeed, 0.0f, targetSpeed);
}
else if (targetSpeed < currentSpeed)
{
currentSpeed -= Time.deltaTime * needleSpeed;
currentSpeed = Mathf.Clamp(currentSpeed, targetSpeed, 200.0f);
}
SetNeedle();
}
void SetNeedle()
{
float rotationAngle = (currentSpeed / 200.0f * 240.0f - 120.0f) * -1.0f;
SpeedoMeter_Needle.rectTransform.localRotation = Quaternion.Euler(0, 0, rotationAngle);
}
}
import socket
import keyboard
import time
host, port = "127.0.0.1", 25001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
def key_test():
rpm_init = 0.0
try:
while True:
if keyboard.is_pressed('q'):
rpm_init += 0.1
rpm_init = min(rpm_init, 140) # Cap at 140
else:
rpm_init -= 0.005
rpm_init = max(rpm_init, 0) # Prevent going below 0
message = str(rpm_init).encode("utf-8")
sock.sendall(message)
response = sock.recv(1024).decode("utf-8")
print(response)
time.sleep(0.05)
except KeyboardInterrupt:
print("Closing connection.")
sock.close()
key_test()
I want it to update my GUI according to the data sent from the python script. Any help is appreciated.
UnityMainThreadDispatcherin the scene? Otherwise nothing will be working off the things you enqueued into the main thread queue ...floatvalue it would be enough to send4 byte.. if instead of send the value as a string e.g."32.000001"you suddenly need9 char