python数据实时传给unity工程并绘制出来

python

# 服务器端代码
import socket
import random
import struct
import time

# 创建一个服务器Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 监听的地址和端口
host = '127.0.0.1'
port = 12345

# 绑定地址和端口
server_socket.bind((host, port))

# 开始监听连接
server_socket.listen(1)

# 等待客户端连接
client_socket, addr = server_socket.accept()
print('连接来自:', addr)

try:
    # 发送和接收数据
    while True:
        data = client_socket.recv(1024).decode('utf-8')
        if not data:
            break
        print('接收到数据:', data)
        # client_socket.sendall('已收到数据'.encode('utf-8'))

        time.sleep(0.5)


        distance = random.uniform(0, 1)
        # distance = 3.1415926
        print(distance)
        strs = "Elegance is the only beauty that never fades."
        dis = "the distance is %.3f meters. " % distance
        # client_socket.send(dis.encode('utf-8') + b'\n' + strs.encode('utf-8'))

        bytes_value = struct.pack("d", distance)  # Big-endian format
        client_socket.send(bytes_value)
        print('已发送数据:', dis)
except ConnectionResetError:
    print("Unity客户端关闭连接")
finally:
    # 关闭连接
    client_socket.close()
    server_socket.close()

unity3d

RecvData.cs

// Unity 3D客户端代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;

public class RecvData : MonoBehaviour
{
    // 服务器地址和端口
    private string serverAddress = "127.0.0.1";
    private int port = 12345;

    // 与服务器的连接
    private TcpClient client;
    private NetworkStream stream;
    private bool isConnect = false;
    byte[] receiveBuffer = new byte[1024];
    public static double dis_value = -1.0f;

    // Start is called before the first frame update
    void Start()
    {
        // 连接到服务器
        ConnectToServer();


    }

    // Update is called once per frame
    void Update()
    {
        if(isConnect)
        {
            SendDataToServer("Hello Server");
            Debug.Log(ReceiveDataFromServer());            ;

        }

    }
    // 连接到服务器
    private void ConnectToServer()
    {
        try
        {
            client = new TcpClient(serverAddress, port);
            stream = client.GetStream();
            isConnect = true;

            Debug.Log("成功连接到服务器");
        }
        catch (Exception e)
        {
            Debug.Log("无法连接到服务器:" + e);
        }
    }

    // 发送数据到服务器
    public void SendDataToServer(string data)
    {
        if (stream != null)
        {
            byte[] byteData = Encoding.UTF8.GetBytes(data);
            stream.Write(byteData, 0, byteData.Length);
            Debug.Log("已发送数据到服务器:" + data);
        }
        else
        {
            Debug.Log("无法发送数据,连接未建立");
        }
    }

    // 从服务器接收数据
    public string ReceiveDataFromServer()
    {
        try
        {
            int bytesRead = stream.Read(receiveBuffer, 0, receiveBuffer.Length);
            //Debug.Log("bytesRead is " + bytesRead);
             dis_value = BitConverter.ToDouble(receiveBuffer, 0);
            print("dis_value is " + dis_value);
            return dis_value.ToString();
        }
        catch (Exception e)
        {
            Debug.Log("接收数据时发生异常:" + e);
            return null;
        }


    }

    // 关闭连接
    private void OnApplicationQuit()
    {
        if (stream != null)
        {
            stream.Close();
        }
        if (client != null)
        {
            client.Close();
        }
    }
}

需要导入xchart绘图package

ValueChat.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using XCharts.Runtime;

public class ValueChat : MonoBehaviour
{
    public double distance_gap = 0.0f;
    LineChart gap_chart = null;

    private float timeBetweenGenerations = 0.01f; // 两次生成之间的时间间隔
    private bool isShow = false; // 标记当前是否正在生成物体

    public Text gapValue_text;
    // Start is called before the first frame update
    void Start()
    {

        SetValue_Show();
        StartCoroutine("ShowData"); // 调用协程函数


    }

    // Update is called once per frame
    void Update()
    {
        if (RecvData.dis_value != -1.0f)
        {
            //distance_gap = double.Parse(HelloRequester.gap_value);
            distance_gap = RecvData.dis_value;

            string formattedNumber = distance_gap.ToString("0.000");
            gapValue_text.text = "The gap value is " + formattedNumber + " mm";
        }
        //distance_gap = double.Parse(HelloRequester.gap_value);

    }

    IEnumerator ShowData()
    {
        while (true)
        {

            if (!isShow)
            {
                yield return new WaitForSeconds(timeBetweenGenerations); // 等待指定的时间间隔后再进行下一次生成
 
                Show_Line(gap_chart);
                isShow = true; // 设置为正在生成状态
            }
            else
            {
                yield return null; // 不进行任何操作直到下一次生成
                isShow = false; // 设置为正在生成状态

            }
        }
    }


        void SetValue_Show()
    {
        var chart = gameObject.GetComponent<LineChart>();

        if (chart == null)
        {
            chart = gameObject.AddComponent<LineChart>();
            chart.Init();
        }
        gap_chart = chart;

        //设置标题:
        var title = chart.EnsureChartComponent<Title>();
        title.text = "Gap Value Line";

        //设置提示框和图例是否显示:
        var tooltip = chart.EnsureChartComponent<Tooltip>();
        tooltip.show = true;

        var legend = chart.EnsureChartComponent<Legend>();
        legend.show = false;

        //设置坐标轴:
        var xAxis = chart.EnsureChartComponent<XAxis>();
        xAxis.splitNumber = 10;
        xAxis.boundaryGap = true;
        xAxis.type = Axis.AxisType.Category;

        var yAxis = chart.EnsureChartComponent<YAxis>();
        yAxis.type = Axis.AxisType.Value;


        //清空默认数据,添加Line类型的Serie用于接收数据:

        chart.RemoveData();
        chart.AddSerie<Line>("line");

        添加10个数据:
        //for (int i = 0,  j = 1 ; i<60 ; i = i + 5, j++)
        //    {
        //        chart.AddXAxisData("T " + j);
        //    //chart.AddData(0, Random.Range(10, 20));
        //    chart.AddData(0, distance_gap);
        //    Debug.Log("-----------" + distance_gap);
        //    }
    }

    void Show_Line(LineChart _gap)
    {
        _gap.AddData(0, distance_gap);

    }
}

运行

修改图的坐标和平均数显示的小数点后位数。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D中使用Python是有一些限制的,可能是Unity3D引擎对Python做了特殊的限制。为了实现Unity3D能够远程调用Python,我们需要自己编写XML请求数据和模拟POST请求。 通过Unity3D结合Python三维姿态估计模型(如ThreeDPoseUnityBarracuda),我们可以实现一个基于三维虚拟现实的交互游戏。这个游戏的实现过程包括实时获取人体三维坐标,然后将坐标与人体模型骨骼绑定,从而实现控制3D角色的目的。同时,我们可以使用3Dmax和Blender进行绘制所需的模型。最后,我们可以设置基本的触碰逻辑,以达成我们设定的简单游戏的目的。 ThreeDPoseUnityBarracuda是通过读取Barracuda的ONNX三维姿态估计模型,在Unity上实现三维姿态估计的工具。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [unity3d远程调用python(xmlrpc)](https://blog.csdn.net/zxy13826134783/article/details/103587628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 三维姿态估计+Unity3d 实现 3D 虚拟现实交互游戏](https://blog.csdn.net/zaf0516/article/details/125552372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值