유니티와 파이썬을 연동할 수 있는 방법을 모색하였다.

  1. 파이썬 코드 자체를 연동
  2. 시리얼 통신
  3. 장고를 이용한 백엔드 서버
  4. 소켓 통신

1번은 어떤 플러그인을 사용하면 된다고 했는데 지원이 중단된 듯 하였고, 백엔드 서버를 열기엔 필자가 장고에 대한 지식이 너무 부족했다. 결론적으로 선택한 것은 소켓 통신이다. 친구가 파이썬에서 서버를 작성하고 필자가 유니티에서 클라이언트를 작성하여 통신을 시도하였다. 굉장히 성공적이었다.


유니티 클라이언트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SocketClient : MonoBehaviour
{
    Socket sock;
    byte[] receiverBuff;

    void Start()
    {
        sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var ep = new IPEndPoint(IPAddress.Parse("localhost"), 8080);
        sock.Connect(ep);

        receiverBuff = new byte[8192];
    }

    void Update()
    {
        byte[] buff = Encoding.UTF8.GetBytes("Hello");
        sock.Send(buff, SocketFlags.None);
        
        int n = sock.Receive(receiverBuff);
        string data = Encoding.UTF8.GetString(receiverBuff, 0, n);
        Debug.Log(data);
    }
}

유니티 클라이언트에서는 서버에 접속한 순간부터 Hello라는 메세지를 보내고 응답을 기다린다. 여기서 문제점은 서버로 접속이 불가한 상황이거나 서버로 부터 아무런 응답이 오지 않는 상황에서는 유니티가 먹통이 된다는 것이다. 스레딩을 사용하여 해결해야 할 것으로 보인다.


파이썬 서버

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from socket import *

serverSock = socket(AF_INET, SOCK_STREAM)
serverSock.bind(('', 8080))
serverSock.listen(0)
connectionSock, addr = serverSock.accept()
print(str(addr),'에서 접속이 확인되었습니다.')

while True:
    data = connectionSock.recv(8192)
    print('받은 데이터 : ', data.decode('utf-8'))

    connectionSock.send(data)

    if(data.decode('utf-8') == '-1'):
        print("연결 종료!")
        break

서버에서는 응답을 받고 응답받은 내용을 클라이언트에게 그대로 돌려준다.

결과

이와같이 통신이 성공적으로 진행되어 파이썬에서 생성한 값을 유니티로 보내어 유니티에서 외관적인 측면을 재구성하는 방식을 사용하였다.

WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus