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

news2024/12/22 14:06:22

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);

    }
}

运行

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1551403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4_官方动画内容示例1.2_动画蓝图——使用蓝图告知Actor播放动画

展示了两个示例&#xff1a;在其中一个示例中&#xff0c;使用蓝图告知Actor播放动画&#xff0c;在另外一个示例中&#xff0c;展示了告知Actor播放动画的动画蓝图&#xff08;例如&#xff0c;此示例展示了如何将变量从蓝图传递给动画蓝图&#xff0c;并演示了如何将现有姿势…

如何使用Excel创建一个物品采购表

在企业的日常运营中&#xff0c;物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资&#xff0c;还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具&#xff0c;它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

【王道训练营】第3题 判断某个年份是不是闰年,如果是闰年,请输出“yes”,否则请输出“no”

文章目录 引言闰年初始代码代码改进改进1&#xff1a;添加提示信息改进2&#xff1a;代码格式改进3&#xff1a;变量命名 其他实现方式使用if-else语句使用函数使用三元操作符 结论 引言 在公历中&#xff0c;闰年的规则如下&#xff1a;如果某个年份能被4整除但不能被100整除…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

洛谷_P3817 小A的糖果_python写法

P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 一开始有两个案例无法通过&#xff0c;然后看了一下测试案例发现其实是没有考虑到为0这个情况&#xff0c;因为如果为0那么无法吃掉任何一粒糖果&#xff0c;而按照之前的写法是到负数了&#xff0c;那后面的一个…

文献速递:基于SAM的医学图像分割---在医学图像中进行任何分割

Title 题目 Segment anything in medical images 在医学图像中进行任何分割 01 文献速递介绍 医学图像分割是临床实践中的关键组成部分&#xff0c;它促进了准确的诊断、治疗计划和疾病监测。 然而&#xff0c;现有的方法通常是针对特定的模态或疾病类型定制的&#xff0c…

穿越迷茫,寻找心中的灯塔

在人生的旅途中&#xff0c;我们有时会陷入一片迷茫的迷雾之中&#xff0c;不知道前方的路该如何走&#xff0c;每天似乎都在忙碌&#xff0c;却又感觉自己在假努力&#xff0c;仿佛一切都没有意义&#xff0c;没有目标。然而&#xff0c;正是这样的时刻&#xff0c;我们更需要…

16、OpenFeign和Sentinel集成实现fallback服务降级

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务&#xff0c;正常访问OK 2、 83 通过OpenFeign调用 …

zabbix监控vmware esxi

一、zabbix服务端配置 修改zabbix_server.conf配置文件 vim /etc/zabbix/zabbix_server.conf #######zabbix_server.conf底部第二行开始添加下面配置######## StartVMwareCollectors5 #StartVMwareCollectors - 预先启动Vmware collector收集器实例的数量。此值取决于要监控的…

阿里云CentOS7安装Hadoop3伪分布式

ECS准备 开通阿里云ECS 略 控制台设置密码 连接ECS 远程连接工具连接阿里云ECS实例&#xff0c;这里远程连接工具使用xshell 根据提示接受密钥 根据提示写用户名和密码 用户名&#xff1a;root 密码&#xff1a;在控制台设置的密码 修改主机名 将主机名从localhost改为需要…

react+vite+antD+reduce+echarts项目完整记录

reactviteantDreduceecharts项目完整记录 之前写前端项目&#xff0c;都是用的vue&#xff0c;从最开始的vue2到后来的vue3&#xff0c;断断续续写了3年&#xff0c;打包工具也从webpack转到了vite&#xff0c;全局数据管理工具从vuex转到了pinia。总体而言&#xff0c;vue3对…

msvcp100.dll是什么东西?电脑msvcp100.dll丢失的六种解决方法

最近&#xff0c;我在电脑上打开一款软件时&#xff0c;遇到了一个问题&#xff1a;找不到msvcp100.dll丢失问题&#xff0c;为了解决这个问题&#xff0c;我进行了深入的学习和研究&#xff0c;并在此分享msvcp100.dll丢失的解决方法。 一&#xff0c;msvcp100.dll是什么&…

机器学习:探索数据中的模式与智能

文章目录 导言介绍&#xff1a;机器学习的定义和重要性发展历程&#xff1a;从概念到现实应用 基础概念机器学习的基本原理监督学习、无监督学习和强化学习的区别与应用1.监督学习2.无监督学习3.强化学习 常见的机器学习任务和应用领域 结语 导言 当代科技领域中最为引人注目的…

HCIP的学习(6)

OSPF—开放式最短路径优先协议 动态路由的评判标准 1、占用资源 2、收敛速度 3、选路动态路由分类&#xff1a; IGP---内部网关协议DV型---距离矢量型---RIPLS型---链路状态型---OSPFEGP---外部网关协议OSPF---无类别的路由协议&#xff08;携带真实掩码&#xff09;组播224.0…

【C++初阶】之类和对象(下)

【C初阶】之类和对象&#xff08;下&#xff09; ✍ 再谈构造函数&#x1f3c4; 初始化列表的引入&#x1f498; 初始化列表的语法&#x1f498; 初始化列表初始化元素的顺序 &#x1f3c4; explicit关键字 ✍ Static成员&#x1f3c4; C语言中的静态变量&#x1f3c4; C中的静…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量&#xff0c;来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’&#xff0c;每 个 字典就分别表示了一个同学students …

STM32硬件I2C通信外设

文章目录 前言I2C硬件介绍10 位地址模式硬件I2C的引脚定义I2C框图主机发送序列图主机接收序列图 硬件I2C读写MPU6050总结 前言 本文主要介绍stm32自带的I2C通信外设&#xff0c;对比与软件模拟I2C&#xff0c;硬件I2C可以自动生成时序&#xff0c;时序的操作更加及时规范&…

【面试经典150 | 动态规划】三角形最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

7、鸿蒙学习-共享包概述

HarmonyOS提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;Harmony Shared Package&#xff09;动态共享包。 HAR与HSR都是为了实现代码和资源的共享&#xff0c;都可以包含代码、C库、资源和配置文件&#xf…