【Unity+Python】如何通过Socket进行通信

1、Unity端创建名为UnityClient.cs脚本代码(客户端):

注意:unity的规则中类,名和脚本文件名需要相同。

using System.Net.Sockets;
using System.Text;
using UnityEngine;

public class UnityClient : MonoBehaviour
{
  TcpClient client;
  NetworkStream stream;

  public struct NPCInfo
  {
    public string Name;//名字
    public int MaxHP;//血量
    public int Attack;//攻击力
    public float AttackFrequency;//攻速
  }
  public string serverIP = "127.0.0.1";  //服务器端ip地址
  public int serverPort = 25001;         //服务器端的端口号
  public NPCInfo MyNPCInfo = new NPCInfo
  {
    Name = "UnityNPC",
    MaxHP = 20,
    Attack = 1,
    AttackFrequency = 1,
  };

  void Start()   //游戏开始时调用,仅调用一次
  {
    ConnectToServer();
  }

  void ConnectToServer()
  {
    client = new TcpClient(serverIP, serverPort);
    stream = client.GetStream();
    Debug.Log("成功连接到服务器");
  }

  void Update()    //每帧都会调用
  {
    ReceiveMessage();
    if (Input.GetKeyDown(KeyCode.U))  //判断是否按键按下u键
    {
      SendMessage(MyNPCInfo);
    }
  }

  void SendMessage(NPCInfo npcInfo)
  {
    // 将NPCInfo实例转换为JSON格式
    string json = JsonUtility.ToJson(npcInfo);
    byte[] data = Encoding.UTF8.GetBytes(json);
    stream.Write(data, 0, data.Length);
  }

  void ReceiveMessage()
  {
    if (stream.DataAvailable)
    {
      byte[] responseData = new byte[1024];
      int bytesRead = stream.Read(responseData, 0, responseData.Length);
      string response = Encoding.UTF8.GetString(responseData, 0, bytesRead);
      DecodeJSON(response);
    }
  }

  public void DecodeJSON(string json)
  {
    // 使用JsonUtility.FromJson<T>解码JSON数据
    NPCInfo npcInfo = JsonUtility.FromJson<NPCInfo>(json);
    Debug.Log("名字:"+npcInfo.Name+",血量:"+npcInfo.MaxHP+",攻击力:"+npcInfo.Attack+",攻速:"+npcInfo.AttackFrequency);
  }

  void OnDestroy()
  {
    stream.Close();
    client.Close();
  }
} 

2、服务器端的python脚本

import socket
import json
import threading
from dataclasses import dataclass

# 定义服务器的IP地址和端口号
host, port = "127.0.0.1", 25001

# 定义NPCInfo结构体
@dataclass
class NPCInfo:
    Name: str
    MaxHP: int
    Attack: int
    AttackFrequency: float

# 处理客户端连接的函数
def handle_client(client_socket):
    send_thread = threading.Thread(target=send_npc_info, args=(client_socket,))
    receive_thread = threading.Thread(target=receive_npc_info, args=(client_socket,))
    
    send_thread.start()
    receive_thread.start()
# 将NPCInfo实例转为JSON格式并发送给客户端
def send_npc_info(client_socket):
    npc_info = NPCInfo("机器人", 100, 10, 1.5)  # 示例数据
    while True:
        user_input = input("输入P发送信息")
        if user_input.lower() == 'p':
            json_data = json.dumps(npc_info.__dict__)  # 转换为JSON格式
            json_data += '\n'  # 添加换行符作为分隔符
            client_socket.sendall(json_data.encode())  # 发送JSON数据


# 从客户端接收JSON数据并解码为NPCInfo实例
def receive_npc_info(client_socket):
    while True:
        received_data = client_socket.recv(1024).decode()  # 接收数据并解码为字符串
        if not received_data:
            break
        # 解码JSON数据为NPCInfo实例
        npc_data = json.loads(received_data)
        npc_info = NPCInfo(**npc_data)
        print("收到Unity信息:", npc_info)

# 创建TCP socket并绑定IP地址和端口号
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)

print(f"正在监听 {host}:{port}")

while True:
    # 等待客户端连接
    client_socket, _ = server_socket.accept()
    print(f"成功连接到客户端 {_}")
    
    # 启动一个线程来处理客户端连接
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start() 

3、运行,先运行服务器端python程序,再运行unity上的游戏。

服务器端成功链接Unity客户端,按下P键会发送消息到Unity客户端。

代码摘自:https://www.bilibili.com/read/cv32863690/?jump_opus=1 出处:bilibili

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

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

相关文章

全景剖析SSD SLC Cache缓存设计原理-2

四、SLC缓存对SSD的寿命是否有优化&#xff1f; 当使用QLC或TLC NAND闪存并将其切换到SLC模式进行写入时&#xff0c;会对闪存的寿命产生以下影响&#xff1a; 短期寿命提升&#xff1a; SLC模式下&#xff0c;每个存储单元仅存储一个比特数据&#xff0c;相对于QLC或TLC来说…

在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者&#xff1a;来自 Elastic Iulia Feroli 是时候考虑语义搜索运营了吗&#xff1f; 无论你是一位经验丰富的搜索工程师&#xff0c;希望探索新的人工智能功能&#xff0c;还是一位机器学习专家&#xff0c;希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这…

python统计分析——用sklearn进行回归

参考资料&#xff1a;python统计分析【托马斯】 scikit-learn提供了简单而有效的数据挖掘和数据分析工具&#xff0c;包括监督和无监督学习。它提供了如下工具&#xff1a; 分类&#xff1a;辨别出新的观测值应该属于哪一组类别。 回归&#xff1a;对一个新的例子预测一个连续值…

Rust腐蚀服务器常用参数设定详解

Rust腐蚀服务器常用参数设定详解 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式&#xff0c;其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 &#xff08;注本文中xxxx…

基于 FPGA 的 DE1-SoC 功率估算器

Introduction 功耗是当今许多技术都要考虑的重要因素。例如&#xff0c;手机生产商总是谈论他们在电源管理方面的改进&#xff0c;以及如何延长电池的使用寿命。功能与功耗之间的平衡是许多人都在研究的有趣课题。然而&#xff0c;当我们做实验时&#xff0c;我们很少会考虑我…

【Godot4.2】CanvasItem绘图函数全解析 - 8.绘制点索引

概述 在示意图绘制过程中或者测试过程中&#xff0c;可能需要标记点的索引。 最常见的形式就是用一个圆圈作为背景&#xff0c;用阿拉伯数字作为索引。 实现的重点是动态计算背景圆的半径。原理是&#xff0c;获取字符串的矩形&#xff0c;取对角线长度的一半作为外接圆的半…

【JavaScript | RegExp】正则表达式

本文原创于CSDN秋说&#xff0c;未经授权&#xff0c;不得转载。 文章目录 定义特殊字符元字符字符表格汇总特殊结构标记优先级实例匹配常见的 HTTP 或 HTTPS URL匹配路径匹配URL的各个部分全局搜索邮箱正则表达式日期匹配正则表达式特殊字段匹配正则表达式匹配邮箱正则表达式用…

在Windows中用命令行编译C项目

在Windows中可以用命令行编译C项目 官方指导文档&#xff1a; 演练&#xff1a;在命令行上编译 C 程序 | Microsoft Learn 在官方文档中可以看到&#xff0c;可以只安装VS的命令行工具集&#xff0c;如下图所示

MySQL8.0.36-社区版:错误日志(2)

mysql有个错误日志&#xff0c;是专门记录错误信息的&#xff0c;这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下&#xff0c;这个错误日志文件究竟在哪 进入到mysql中&#xff0c;使用命令 show variables…

009、Python+fastapi,第一个后台管理项目走向第9步:ubutun 20.04下安装vscode+git环境配置

一、说明 git是一定要配置的&#xff0c;由于是白嫖的无影云电脑&#xff0c;东西得保存在网上&#xff0c;就继续白嫖gitee吧&#xff0c;显然国内github是不太合适的了 二、安装git 直接安装sudo apt install -y git git --version git version 2.25.1 三、配置git 在git上…

使用阿里云试用Elasticsearch学习:使用内置模型 lang_ident_model_1 创建管道并使用

文档&#xff1a;https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-deploy-model.html 部署刚刚下载好的内置模型 部署内存不够用 还得花钱&#xff0c;拉几把倒吧。就用自带的吧。 测试模型 POST _ml/trained_models/lang_ident_model_1/_infer {"doc…

MySQL-触发器:触发器概述、触发器的创建、查看删除触发器、 触发器的优缺点

触发器 触发器1. 触发器概述2. 触发器的创建2.1 创建触发器语法2.2 代码举例 3. 查看、删除触发器3.1 查看触发器3.2 删除触发器 4. 触发器的优缺点4.1 优点4.2 缺点4.3 注意点 注&#xff1a;此为笔者学习尚硅谷-宋红康MySQL的笔记&#xff0c;其中包含个人的笔记和理解&#…

HarmonyOS实战开发-横竖屏切换

介绍 本实例展示如何使用媒体查询&#xff0c;通过ohos.mediaquery 接口完成在不同设备上显示不同的界面效果。 效果预览 使用说明 1.在竖屏设备上&#xff0c;首页展示新闻列表&#xff0c;点击新闻进入详情界面。 2.在横屏设备上&#xff0c;首页左侧展示新闻列表&#x…

RT-Thread内核简介

1、RT-Thread 内核介绍 RT-Thread 内核架构图,内核处于硬件层之上,内 核部分包括内核库、实时内核实现 内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。这部分根据编译器的不 同自带 C 库的情况也会有些不同,当使用 GNU GCC 编译器时,会携带…

STM32外设配置以及一些小bug总结

USART RX的DMA配置 这里以UART串口1为例&#xff0c;首先点ADD添加RX和TX配置DMA&#xff0c;然后模式一般会选择是normal&#xff0c;这个模式是当DMA的计数器减到0的时候就不做任何动作了&#xff0c;还有一种循环模式&#xff0c;是计数器减到0之后&#xff0c;计数器自动重…

【GD32】MQ-3酒精检测传感器

2.31 MQ-3酒精检测传感器 MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时&#xff0c;传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。…

嵌入式STM32F407CET6移植OpenHarmony系统方法

第一:【实验目的】 1、STM32F407CET6开发版移植鸿蒙系统的方式 第二:【实验原理】 涉及到原理图添加原理图--普通STM32F407原理图第三:【实验步骤】 一、下载LiteOs源码,复制到到虚拟机中并解压 https://gitee.com/LiteOS/LiteOS

政安晨:【Keras机器学习实践要点】(二十九)—— 半监督图像分类使用具有SimCLR对比性预训练的方法

目录 介绍 半监督学习 对比学习 设置 超参数设置 数据集 图像增强 编码器结构 有监督基线模型 用于对比预训练的自我监督模型 对预训练编码器进行有监督微调 与基准线的比较 进一步改进 架构 超参数 相关工作 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x…

Guava里一些比较常用的工具

随着java版本的更新提供了越来越多的语法和工具来简化日常开发&#xff0c;但是我们一般用的比较早的版本所以体验不到。这时就用到了guava这个包。guava提供了很多方便的工具方法&#xff0c;solar框架就依赖了guava的16.0.1版本&#xff0c;这里稍微介绍下。 一、集合工具类…

20240413,类和对象

对象&#xff1a;一切都可为对象&#xff0c;类&#xff1a;相同特性的对象&#xff1b;面向对象特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 一&#xff0c;封装 CLASS 类名 { 访问权限 &#xff1a;属性/行为 } 实例化&#xff1a;通过一个类&#xff0c;创建一…