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

    }
}

运行

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鼠标不动了怎么办?鼠标不能移动解决方法

鼠标不能移动有可能是鼠标坏了&#xff0c;或者是电脑的软件和硬件有冲突等原因造成。最近有小伙伴就咨询了有关鼠标的问题&#xff0c;昨天鼠标还能使用&#xff0c;不知道为什么今天就突然不能用了。那么我们在排除鼠标坏掉了的情况下&#xff0c;试试对鼠标进行修复吧。下面…

由浅到深认识Java语言(38):I/O流

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

寄主机显示器被快递搞坏了怎么办?怎么破?

大家好&#xff0c;我是平泽裕也。 最近&#xff0c;我在社区里看到很多关于开学后弟弟寄来的电脑显示器被快递损坏的帖子。 看到它真的让我感到难过。 如果有人的数码产品被快递损坏了&#xff0c;我会伤心很久。 那么今天就跟大家聊聊寄快递的一些小技巧。 作为一名曾经的…

iptables添加端口映射,k8s主机查询不到端口但能访问。

研究原因&#xff1a;k8s内一台主机使用命令查询没有80端口。但通过浏览器访问又能访问到服务。 查询了资料是使用了hostport方式暴露pod端口。cni调用iptables增加了DNAT规则。访问时流量先经过iptables直接被NAT到具体服务去了。 链接: K8s罪魁祸首之"HostPort劫持了我…

【2024.3.28练习】砝码称重

题目描述 题目分析 动态规划解决。建立状态&#xff0c;数组元素为0或1&#xff0c;代表只用前个砝码能否称出重量。 设个砝码重量为&#xff0c;则第状态转移方程为&#xff1a; 我的代码 #include <iostream> #include <algorithm> #include <cmath> #i…

武汉星起航:五对一服务体系,引领卖家迅速适应亚马逊市场

在数字化浪潮的推动下&#xff0c;亚马逊跨境电商行业成为了众多创业者和企业家们竞相追逐的热门领域。然而&#xff0c;对于零经验的新手卖家而言&#xff0c;这个看似充满机遇的跨境电商世界实则暗藏无数挑战和未知。在这个关键时刻&#xff0c;武汉星起航公司以其专业的服务…

环信IM集成教程---消息转发合并转发的实现

前言 在发送消息体系中&#xff0c;转发消息是一个重要的环节&#xff0c;可以单条转发也可以合并转发。本文教大家在接入环信IM过程中如何实现单条转发&#xff0c;合并转发消息功能&#xff0c;同时举例一些容易踩坑的位置&#xff0c;以便大家尽快顺利的实现转发消息功能。…

Python实现猜数字游戏:一次编程旅程

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

融合创新!全局注意力+局部注意力,训练成本直降91.6%

全局注意力结合局部注意力可以让模型在处理数据时&#xff0c;既不会丢失重要的局部细节&#xff0c;也能考虑到整个数据集中的全局结构&#xff0c;从而在保持模型计算效率的同时&#xff0c;提高模型的表达能力。 这种策略相较于传统的单一注意力机制&#xff0c;能够更全面…

通用指南-营销和设计中的增强现实(AR)

原文作者&#xff1a;Superside 翻译&#xff1a;数字化营销工兵 --- 经典万字长文&#xff0c;权威解读&#xff0c;分享经典&#xff0c;预计阅读完需要30分钟&#xff0c;建议收藏&#xff01; 目录 一、引言 为什么要尝试AR AR到底是什么&#xff1f;营销人员和创意人…

巨控NET400网关:工业通讯的未来之门

描述&#xff1a;在数字化时代&#xff0c;工业通讯作为智能制造的核心&#xff0c;承载着数据交换、设备控制等关键任务。巨控NET400以其独特的优势&#xff0c;为各行各业的智能转型提供了强大的技术支持。本文深入探讨NET400的核心功能与主要优势&#xff0c;展望其在工业通…

T1 神奇苹果桶 (25分) - 小米前端笔试编程题解

考试平台&#xff1a; 赛码 题目类型&#xff1a; 20道选择 2道编程题 考试时间&#xff1a; 2024-03-23 &#xff08;两小时&#xff09; 题目描述 小希在森林冒险的时候发现一个神奇的木桶&#xff0c;某些时会凭空出现一些苹果&#xff0c;小希很解地大家分享了这一个神奇…

Markdown 编辑器使用

CSDN 在博客开头加上 [TOC](你的目录标题)就可以根据博客内容自动生成如下所示的目录&#xff1a; 你的目录标题 Markdown 编辑器功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表无序列表…

1.java openCV4.x 入门-环境搭建

专栏简介 &#x1f492;个人主页 &#x1f4d6;心灵鸡汤&#x1f4d6;大家 &#x1f4f0;专栏目录 点击上方查看更多内容 环境搭建 一、开发环境二、环境搭建1.openCV安装1.下载程序包 2.程序包安装3.搭建项目 三、非必要资源1.扩展库2.cmake 一、开发环境 开发工具 i…

structured bindings is supported from c++17

完整示例&#xff1a; #include <iostream> #include <format> #include <iomanip>void test_00(){struct Box{int width_;int height_;std::string name_;};Box box{3,4,"amazing"};auto [w, h, name]{box};//auto [w, h, name] box;std::cout …

openwrt在校园网环境下开启nat6 (ipv6 nat)

如果将路由器接入校园网&#xff0c;我们只能获得一个128位掩码的ipv6地址。这个地址仅供路由器本身使用&#xff0c;而路由器后的设备无法获取到ipv6地址&#xff0c;因此我们可以利用网络地址转换&#xff08;NAT&#xff09;为这些设备分配本地ipv6地址。 下面是openwrt开启…

TSINGSEE青犀推出县域治理视频基座数字化、智慧化解决方案

一、方案背景 县域治理方案是我国地方治理体系的重要组成部分&#xff0c;对于促进县域经济社会发展、维护社会稳定、推进全面深化改革具有重要意义。随着科技的不断进步&#xff0c;视频监管已经成为了现代社会治理的重要手段之一。县域治理视频监管方案是通过视频监控、数据…

高效 CUDA 调试:将 NVIDIA Compute Sanitizer 与 NVIDIA 工具扩展结合使用并创建自定义工具

高效 CUDA 调试&#xff1a;将 NVIDIA Compute Sanitizer 与 NVIDIA 工具扩展结合使用并创建自定义工具 NVIDIA Compute Sanitizer 是一款功能强大的工具&#xff0c;可以节省您的时间和精力&#xff0c;同时提高 CUDA 应用程序的可靠性和性能。 在 CUDA 环境中调试代码既具有挑…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

Laravel扩展包的开发

扩展包的开发 1. 创建一个新项目&#xff0c;初始化扩展包配置 首先创建一个全新的Laravel项目&#xff1a; composer create-project --prefer-dist laravel/laravel laravelPkg 接下来&#xff0c;在项目中创建目录package/{your_name}/{your_package_name} mkdir -p pa…