[Python] Unity - GUI not updating accordingly to the data a python script sent

Discussão em 'Python' iniciado por Stack, Fevereiro 8, 2025.

  1. Stack

    Stack Membro Participativo

    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.

    Continue reading...

Compartilhe esta Página