쓰레드를 열어 통신을 하고 수신된 값으로 씬을 열다가 오류가 났다.
UnityException: @@@@ can only be called from the main thread.
유니티에서 지원하는 함수는 메인 쓰레드에서만 호출하라는 에러였다.
유니티는 단일 쓰레드로 프로세스를 처리한다. 새로운 쓰레드에서 단일 쓰레드에 끼어들 수 없다.
때문에 새로운 쓰레드에서 작업한 내용은 변수에 담아두고 메인 쓰레드에서 꺼내서 사용해야한다.
void OnReceving()
{
while (true)
{
mSocket.Receive(data);
mData = data;
mIsResponsing = true;
}
mSocket.Close();
}
// @유니티는 단일 쓰레드로 동작
// @ 통신 스레드에서 데이터가 오면 담아두고 Update에서 대기하다가 꺼내서 사용
private void Update()
{
if (mIsResponsing)
{
if (mCallback != null)
mCallback(mData);
mIsResponsing = false;
}
}
모양새가 복잡하기 때문에 Update나 코루틴을 사용하는 것을 추천한다.
통신 receive함수의 경우 Update에서 대기하면 통신을 놓칠 가능성이 있었다.
코루틴이란?!
'Programming > Unity' 카테고리의 다른 글
[Unity] Vector3는 Heap에 메모리 할당?? (0) | 2020.04.21 |
---|---|
[Unity] MonoBehaviour (0) | 2020.03.03 |
[Unity] Json 라이브러리 (0) | 2020.03.03 |