진행하다 말다를 반복하는 웹빌드에서 웹소켓 사용하는 작업 메모입니다.
이것이 구현된다면 웹 브라우저로 온라인 유니티 게임을 만들 수 있습니다.
웹소켓은 실시간 통신이 된다는 것을 의미합니다.
기술적으로는 가능하며 제대로된 결과물을 이번엔 만들어야겠다고 생각했습니다.
일단 보는 문서: https://docs.unity3d.com/kr/2018.4/Manual/webgl-interactingwithbrowserscripting.html
WebGL: 브라우저 스크립트와 상호작용 - Unity 매뉴얼
웹용 콘텐츠를 빌드할 때 웹페이지의 다른 요소와 통신해야 할 수 있습니다. 또는 Unity 에디터가 현재 기본적으로 노출하지 않는 웹 API를 사용하여 기능을 구현하고 싶을 수 있습니다. 두 가지
docs.unity3d.com
이 문서는 유니티 웹 빌드가 자바스크립트 함수를 호출하는 방식을 설명하고 있습니다.
에디터에서 돌릴대는 자바스크립트는 없고 c# 으로 돌려야하지만
웹으로 빌드를 하면 c# 통신코드는 무효화되기 때문에 브라우저에서 제공하는 함수로 통신해야하는 개발환경의 제약이 있습니다.
알아야하는 기술로는
1. 유니티 웹빌드
2. 웹브라우저에서의 자바스크립트
3. 웹소켓 서버 (공개 서비스를 하려면 당연히 https 를 지원해야합니다.)
3번은 웹 서비스라 이 글에서는 다루지 않습니다.
Unity 스트립트에서 JavaScript 함수 호출
문서에 첫부분에 나오는 .jslib 라는 파일에 대한 존재 입니다.
여기에 정의된 함수는 유니티에서 호출해서 사용할 수 있습니다만
빌드한후에 사용할 수 있다는 뜻이지 에디터에서는 안됩니다.
그래서 테스트하면서 "잘되는군" 이 되는 환경은 아니라는 뜻입니다.
기술에 대한 이해가 없다면 빌드와 수정을 여러번 반복해야며 시간이 많이 걸리는 작업입니다.
모든건이 문제 없는 상황에서
1. jslib 에서 사용할 함수를 만든다.
2. 웹빌드의 index.html 에 jslib 에서 호출할 함수가 존재해야한다.
3. 브라우저에서 돌려보면서 console.log 같은걸로 로그도 찍어가며 확인해야합니다.
web.jslib 내용
mergeInto(LibraryManager.library, {
jslib_hello: function () {
window.hello();
},
jslib_call_action: function (v) {
//window.call_action(Pointer_stringify(v));
window.call_action(UTF8ToString(v));
},
});
c# 내용
class MyJavascript
{
[DllImport("__Internal")]
private static extern void jslib_hello();
[DllImport("__Internal")]
private static extern void jslib_call_action(string text);
}
외부 함수로 선언하는거라 에디터에서 호출해봐야 에러만나고 동작은 안된다.
index.html 내용 중에 <script></script> 내용
// 기본 호출
function hello() {
console.log("hello");
return "hello";
}
// 인자 있는거 호출출
function call_action(v) {
console.log("call_action", v);
}
</script>
이렇게 3개의 파일을 이용해 통신한다.
일단 초보자는 개발환경에 대한 이해가 없다면 개발하기 너무 어렵다
글쓴이도 2-3년 웹 버시스해본뒤에 자우롭게 개발이 가능했었다.
html 에서 유니티 c# 함수 호출
my_unity = unityInstance;
이후에는 SendMessage 를 이용해 무언가를 호출 할 수 있다.
이런식으로 c# 에서 javascript 함수 호출하는 코드와
javascript 에서 c# 함수 호출하는 코드있으면 웹으로 할 수 있는건 모든지 구현 가능해진다.
c# 에 ProcJS 함수 구현
public class MyCSharp : MonoBehaviour
{
void ProcJS(string text)
{
Debug.Log("ProcJS, " + text);
}
}
필요 조건
1. @NetClient 라는 GameObject 도 있어야하고
2. c# 코드에 ProcjJS 함수가 필요하고
(public 함 수 일 필요 는 없음)
3. @NetClient 안에는 MyCShap 이 있어야한다.
이후 알아야하는 것들
1. 웹브라우저에서의 javascript 코딩 / 특히 웹소켓 통신
2. 웹소켓 서버 서비스 하기
웹브라우저에서의 javascript 코딩
웹 빌드에서는 c# 에서 구현한 것들중 일부가 동작하지 않는다.
파일 읽는가 - 당연히 브라우저에서 도는거라 내 컴에 있는 파일을 읽을 수 없다.
url 로 GET / POST 방식의 호출은 c# 코드에 있는걸로 구현이 가능했는데
new WWW(url);
(최신 버전은 이 이름이 아니던데 ...)
웹소켓은 호출 할 방법이 없다.
이게 되었으면 이렇게 돌아돌아 구현할 필요가 없었는데 아쉽다.
그래서 javascript 로 웹소켓을 직접 구현해야한다.
코드가 어려운건 아니고 웹으로 뭔가 개발해본적이 업사면 환경을 이해하기 힘들 듯하다.
(시간을 녹여서 해처나가는 수밖에 없다.)
웹소켓 서버 서비스 하기
이게 제일 큰 난간이다.
월 요금을 낼 생각이라면 쉽게 끝나는 대신 돈이 나간다.
방법1. CloudType 에서 대여에서 월 2.5만언 사용한다.
테스트나 소규모 서비스에는 추천하지 않는다.
이 돈이 작은게 아니다. 한 2-3년 진지하게 해본다고 해도 거의 100만원이 나가는 방식이다.
방법2. 오라클에서 무료 vm 을 대여해준다고 한다.
해본적은 없지만 오라클에서 vm (무료 리눅스 서버)를 대여해준다고 한다.
무로이니 마구 만져봐도 될 것이다.
나는 가입할때 프리모드를 끄는 버튼을 눌러버려서 다시 해볼 방법이 없어졌다.
그래서 해볼 수가 없넹 ...
무료모드 끄는 버튼이 너무 누르고 싶게 디자인되어있어서 눌러버렸다.
방법3. 홈서버 돌린다.
집에서 라즈베리파이로 서버돌리는데 편한건 있지만 많은 경험을 필요로 한다.
라즈베리파이 기기 구입 - 10만원쯤
집에 공유기의 포트를 열어야함
- 절차만 잘 지킨다면 문제 없다.
- 보안 지식이 필요하다.
리눅스를 많이 배워야한다.
- 너무 많은 것들이 알아야하는게 아닐까 ...
엄청난 자유도와 활용성이 생기지만 리눅스 환경 적을위해 엄청난 노력도 필요로 한다.
(작성중)