본문 바로가기

Programming/Unity

[Unity] 유니티는 단일 쓰레드

쓰레드를 열어 통신을 하고 수신된 값으로 씬을 열다가 오류가 났다.

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