【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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity中使用Python进行TCP通信,可以通过以下步骤实现: 1. 编写Python脚本实现TCP服务器或客户端功能。 2. 在Unity项目中添加Python脚本,并使用Python.NET库将Python脚本导入到Unity中。 3. 在Unity中调用Python脚本,实现TCP通信功能。 下面是一个简单的示例,演示了如何在Unity中使用Python实现TCP客户端通信: 1. 编写Python脚本 ``` import socket TCP_IP = '127.0.0.1' TCP_PORT = 5005 BUFFER_SIZE = 1024 MESSAGE = "Hello, World!" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) s.send(MESSAGE.encode()) data = s.recv(BUFFER_SIZE) s.close() print("received data:", data.decode()) ``` 这个脚本会连接到一个指定的IP地址和端口,发送一条消息并接收回复。 2. 导入Python脚本到Unity中 在Unity项目中,需要使用Python.NET库将Python脚本导入到C#脚本中。可以从NuGet包管理器中安装Python.NET,也可以手动下载并添加到项目中。 在C#脚本中,可以使用以下代码导入Python脚本: ``` using System; using Python.Runtime; public class PythonClient : MonoBehaviour { void Start() { // Initialize Python runtime PythonEngine.Initialize(); // Import Python script using (Py.GIL()) { dynamic client = Py.Import("tcp_client"); client.main(); } // Shutdown Python runtime PythonEngine.Shutdown(); } } ``` 这个脚本会初始化Python运行时,导入Python脚本并调用其中的`main`函数。 3. 在Unity中调用Python脚本 在需要使用TCP通信的地方,可以使用以下代码调用Python脚本: ``` using System; using Python.Runtime; public class MyComponent : MonoBehaviour { void Start() { using (Py.GIL()) { dynamic client = Py.Import("tcp_client"); client.main(); } } } ``` 这个脚本会在Unity中调用Python脚本的`main`函数,实现TCP通信功能。 需要注意的是,在Unity中使用Python进行TCP通信时,需要确保Python脚本和Unity项目使用的Python版本一致,否则可能会出现错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋上钢琴的虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值