본문 바로가기
💻 programming/unity

유니티 UDP 소켓 통신 구현하기 - 파이썬 UDP 클라이언트 예제 코드 <3>

by 연구원-A 2023. 1. 13.
반응형

[이전 포스팅]

2023.01.13 - [programming] - 유니티 UDP 소켓 통신 구현하기 - 예제 프로젝트 소개 <1>

2023.01.13 - [programming] - 유니티 UDP 소켓 통신 구현하기 - 유니티 UDP 서버 C# 예제 코드 <2>

 

파이썬 UDP 클라이언트 구현은 너무 간단해서 말할 것도 없다

바로 코드를 보자

 

UnitySender, JsonMaker

UnitySender 클래스를 보면 생성자에 소켓을 정의하고, send_data 함수에서 바로 데이터를 송신한다

 

JSON 문자열을 만드는 것도 너무 쉽다

JsonMaker 클래스에 dictionary 변수를 만들고 'direction' key에 값을 넣으면 된다

import numpy as np
import json
import socket

class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

class UnitySender:
    def __init__(self, ipaddr, port):
        self.ipaddr = ipaddr
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP

    def send_data(self, data):
        json_data = json.dumps(data, cls=NumpyEncoder)
        print(json_data)
        self.sock.sendto(bytes(json_data, "utf-8"), (self.ipaddr, self.port))

class JsonMaker:
    def __init__(self):
        self.data = {}

    def get_json_with_direction(self, direction):
        self.data['direction'] = direction
        return self.data

 

KeyboardManager

키보드의 방향키를 입력받아서 JSON 데이터를 생성하고, UDP로 송신하는 기능을 담당한다

run 함수를 호출하면 키보드의 입력을 기다리고 입력이 발생할 때마다 on_press 함수를 호출한다

 

on_press 함수를 보면 방향키에 따라 direction의 문자열을 'up', 'down', 'left', 'right'로 바꾼다

self.__get_json 함수에 direction 문자열을 전달해 JSON 문자열을 반환받고

self.__send_json 함수에 JSON 문자열을 전달해 UDP 서버에 송신한다

from pynput import keyboard

class KeyboardManager:
    def __init__(self):
        self.__get_json = None
        self.__send_json = None

    def run(self):
        with keyboard.Listener(
                on_press=self.on_press,
                on_release=self.on_release) as listener:
            listener.join()

        listener = keyboard.Listener(
            on_press=self.on_press,
            on_release=self.on_release)
        listener.start()

    def set_get_json_func(self, f):
        self.__get_json = f

    def set_send_json_func(self, f):
        self.__send_json = f

    def on_press(self, key):
        direction = ''
        if key == keyboard.Key.up:
            direction = 'up'
        elif key == keyboard.Key.down:
            direction = 'down'
        elif key == keyboard.Key.left:
            direction = 'left'
        elif key == keyboard.Key.right:
            direction = 'right'
        else:
            return

        if self.__get_json is not None:
            data = self.__get_json(direction)
        if self.__send_json is not None:
            self.__send_json(data)

    def on_release(self, key):
        if key == keyboard.Key.esc:
            return False

 

Main 

UnitySender, JsonMaker, KeyboardManager의 인스턴스를 생성한다

KeyboardManager에 JSON 생성 함수와, UDP 송신 함수를 전달하고 실행한다

unity_sender = UnitySender('127.0.0.1', 50002)
json_maker = JsonMaker()
keyboard_manager = KeyboardManager()

keyboard_manager.set_get_json_func(json_maker.get_json_with_direction)
keyboard_manager.set_send_json_func(unity_sender.send_data)
keyboard_manager.run()

실행하기

해당 스크립트를 파이썬으로 실행하면 끝 (혹시 몰라 파이썬 스크립트는 첨부했다)

python3 main.py

main.py
0.00MB

 

유니티 프로젝트를 플레이하고 파이썬 스크립트를 실행하면 완성이다

 

파이썬 스크립트를 실행한 터미널에서 방향키를 누르면

유니티 씬에 있던 Sphere 오브젝트가 왼쪽, 오른쪽으로 움직이는 것을 볼 수 있다

 

 

이 포스팅에서는 파이썬으로 구현했지만

사실 Socket 형식과 JSON 문자열만 형식에 맞게 구현하면 개발 언어는 아무 상관이 없다

 

이어서 C++로 유니티 서버와 통신하는 UDP 클라이언트를 구현해본다

 

 

(계속)

2023.01.13 - [분류 전체보기] - 유니티 UDP 소켓 통신 구현하기 - C++ UDP 클라이언트 예제 코드 <4>

 

반응형

댓글