뒤끝 실시간 알림 과 dispatcher

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

뒤끝 서버 게임에 붙여볼려고 sdk 받고 로그인 부터…
비동기가 안전하겠지 하고 비동기로 로그인했는데 안됬어요.
그래서 어째저째 알아보다 send.que 인가? 그 방식으로 하니까 됬어요. 이 후에도 비동기는 안되서 다 동기로 로직을 짰어요. 그래도 어째저째 돌아갔어요.
그런데 실시간 알람기능에서 막히네요.
실시간 알림 핸들러 가 다 비동기로 되있네요.
비동기 써볼려고 초기화에 true붙인것도 확인하고
update함수에 Backend.AsyncPoll(); 도 넣고…별 난리는 쳐도 안되요… 그리고 뒤끝 글을 보니 …안될수도 있습니다 그럴때 dispatcher란 프로그램을 이용하세요 (링크) 하고 떡하니 한줄 있더라구요…
일단 저걸 받고 깔긴 깔았는데 도대체 어떻게 저걸 써야 실시간 알림 핸들러에 함수를 적용할 수 있는지 알 길이 없습니다.
그냥 dispatcher 를 쓰면 됩니다가 아니라 어떻게 하는지 예시라고 하나 보여주셔야죠…-0-;; 뭘 다 프로그래밍 고수들만 모이진 않았잖아요…
자 여기 실시간 알람 핸들러 하나 예시에요
Backend.Notification.OnReceivedFriendRequest = () =>
{
Debug.Log($“실시간 알림 [OnReceivedFriendRequest(친구 요청 도착)]”);
NoticeAlram(“OnReceivedFriendRequest”, “”);
};

이걸 dispatcher로 뭘 어떻게 해야하는지 한번만 보여주세요
제발요…

  • 뒤끝 SDK 버전 : 5.9.3
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

안녕하세요 개발자님.
뒤끝의 비동기 기능은 원래 비동기 쓰레드에서 호출되며
비동기 쓰레드에서는 유니티에서 UI의 접근이 불가능하도록 되어있습니다.

해당 UI의 접근이 가능해지도록
외부 쓰레드에서 받은 비동기 콜백을 저장해두었다가 Update시에 메인 쓰레드로 이동시켜 호출하는 것이
SendQueue 및 useAsyncPoll을 true로 설정한 비동기 함수 입니다.

뒤끝 실시간 알림 핸들러에서는 쓰레드의 콜백 이동 로직을 구현하지 않아 스스로 구현을 하여야 합니다.

해당 로직을 도와주는 서드 파티가 대중적으로 사용되는 Dispatcher라는 플러그인입니다.
허나 뒤끝에서 제공하는(소유하는) 서드파티가 아니므로 해당 사용법에 대해서는 자세히 다루지 못하는 점 양해 부탁드립니다.

아래 안내드리는 코드를 통해서도 기본적인 쓰레드 이동 구현이 가능하지만
코드의 이해와 최적화, 예외 상황에 대한 로직 추가는 필요하다는 점 참고하여 주시면 감사하겠습니다.

public class BackendManager : MonoBehaviour
{
    // 메인쓰레드에서 호출하도록 Action을 저장하는 queue함수
    Queue<Action> mainThreadQueue = new Queue<Action>();
    void Start()
    {
        Backend.Notification.OnReceivedFriendRequest = () =>
        {
            Debug.Log($"실시간 알림[OnReceivedFriendRequest(친구 요청 도착)]");
            
            // 바로 호출하지 않고 Queue에 Action을 저장한다.(비동기 외부 쓰레드이기 떄문)
            mainThreadQueue.Enqueue( () => {
                NoticeAlram("OnReceivedFriendRequest", "");
            });
        };
    }

    // 메인쓰레드에서 매 프레임마다 호출하는 함수
    void Update() {
        // Queue에 행동이 저장되어 있을 경우
        if(mainThreadQueue != null && mainThreadQueue.Count > 0) {
            // Dequeue를 통해 행동을 추출 후 호출한다.(메인쓰레드이기 떄문)
            mainThreadQueue.Dequeue().Invoke();
        }
    }
}