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

  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

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com