Node.js의 Socket.io를 사용한다면…?
소켓 통신을 통해 .mtl, .obj 파일을 받아올 수 있다.
서버에서 클라이언트에게 실시간으로 데이터를 전송하게 된다.
Java에서는 socket.io-client-java 라이브러리를 사용해서 Socket.io 서버에 연결 가능하다.
이 라이브러리를 사용하면 Node.js 서버에서 전송된 .obj와 .mtl 파일 데이터를 받아올 수 있을 것으로 예상된다.
실제로 돌려본 것이 아닌 예제를 통해 코드를 수정만 했다는 것을 알립니다.
먼저 안드로이드 스튜디오에서 socket.io-client.java를 사용하기 위해 build.gradle 파일에 다음 dependency를 추가한다.
build.gradle
dependencies {
implementation ('io.socket:socket.io-client:1.0.0') {
// excluding org.json which is provided by Android
exclude group: 'org.json', module: 'json'
}
}
그 후, 소켓을 생성하고 서버에 연결하는 코드를 작성한다.
// 액티비티 또는 다른 컨택스트
Context context = this;
IO.Options options = new IO.Options();
try {
socket = IO.socket("http://your_server_address:port", options);
} catch (URISyntaxException e) {
e.printStackTrace();
}
서버에서 데이터를 받아오기 위해 이벤트 리스너를 추가한다.
socket.on("objFileData", new Emitter.Listener() {
@Override
public void call(final Object... args) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
String objData = (String) args[0]; // assuming server sends string data
UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", objData);
}
});
}
});
socket.on("mtlFileData", new Emitter.Listener() {
@Override
public void call(final Object... args) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
String mtlData = (String) args[0]; // assuming server sends string data
UnityPlayer.UnitySendMessage("GameObjectName", "AnotherMethodName", mtlData);
}
});
}
});
마지막으로, 소켓을 사용해 서버에서 연결한다.
socket.connect();
이러한 방식으로 안드로이드 스튜디오에서 socket.io를 사용하여 Node.js 서버에서 실시간으로 데이터를 받아올 수 있을 거라고 예측된다.
이 데이터는 UnitySendMessage()를 통해 유니티로 전달될 수 있다.
실제로 돌려본 것이 아닌 예제를 통해 코드를 수정만 했다는 것을 알립니다.
웹소켓은 일단 ‘example’로 빼놨습니다.
먼저, 프로젝트 수준의 build.gradle 파일에 Socket.IO 클라이언트 라이브러리의 종속성을 추가해야 한다.
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
그리고 앱 수준의 build.gradle 파일에 다음 종속성을 추가한다.
dependencies {
...
implementation 'com.github.nkzawa:socket.io-client:0.6.0'
}
다음은 Socket.io 클라이언트를 설정하고 서버와 연결하는 코드를 작성한다.
import io.socket.client.IO;
import io.socket.client.Socket;
...
private Socket socket;
public void connectToServer() {
try {
// Create a new Socket instance and connect to the server
socket = IO.socket("http://example.com");
socket.connect();
// Listen for events from the server
socket.on(Socket.EVENT_CONNECT, args -> {
// Connected to the server
// You can now send events to the server
}).on("my_event", args -> {
// Received the "my_event" event from the server
// args is an array of objects received from the server
}).on(Socket.EVENT_DISCONNECT, args -> {
// Disconnected from the server
});
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
위의 코드는 서버와 연결하고, 서버로부터 이벤트를 받는 기본적인 코드이다.
실제로 사용하려면 이 코드를 자신의 코드에 맞게 어느정도 수정이 필요하며, 받은 데이터를 Unity로 전달하는 코드도 필요하다.
Unity로 데이터를 전달하는 방법은 Unity와 안드로이드 앱이 어떻게 통신하냐에 따라 다르다.
이에 대한 정보가 필요하다.
마지막으로 이 코드는 네트워크 연결을 사용하므로
<uses-permission android:name="android.permission.INTERNET" />
AndroidManifest.xml 파일에 인터넷 권한을 설정해야 한다.