길드 채널 관련 함수

길드원 간에 채팅을 하는 프로그램을 만들고자 합니다.

소스코드를 통해 길드를 생성하고 채팅 채널이 생성 되는걸 확인 되지만 채팅 채널에 접속이 안됩니다

  • 뒤끝 SDK 버전 : 8.18.0
    backnd Chat : 1.3.0

  • 프로젝트명 : TheHacker

  • 스테이터스 코드 :

        // 길드에 이미 가입되어 있는지 확인
        GuildItem? guildItem = BackendGuild.Instance.GetMyGuildInfoV3();
        if (guildItem!=null)// 이미 길드에 가입되어 있다면
        {
            // 길드 채팅 활성화
            guildChatCanvse.SetActive(true);
            Debug.Log("길드에 이미 가입되어 있습니다. 길드 채팅 활성화.");

            // 길드 정보 출력
            guildChatNameText.text = guildItem.guildName;
            guildChatMemberCountText.text = $"{guildItem.memberCount}/50";
            // 기본 적으로 채팅 활성화 되어 있어 버튼 비활성화
            guildChatButtonEvnet();
  • 에러 코드 :
    BackendManager.Instance.ChatClient.SendJoinOpenChannel(“guild”, guildItem.guildName);
    or
    BackendManager.Instance.ChatClient.SendJoinGuildChannel();
  • 에러 메시지 : NullReferenceException: Object reference not set to an instance of an object

안녕하세요 개발자님,
남겨주신 프로젝트 명을 통해 뒤끝의 프로젝트 정보가 확인되지 않습니다.
정확한 프로젝트 명 확인 요청드립니다.

좋아요 1

아 죄송합니다 이름을 잘 못 작성했네요
수정 했습니다.

좋아요 1

담당부서 확인 시 채팅 서버 접속 기록이 확인되지 않고 있습니다.
채팅 관련 로직을 공유 요청드립니다.

공식 문서를 참고 했고

뒤끝베이스로 로그인후
ChatClient.SendJoinOpenChannel(“global”, “server-1”);
코드로 접속을 시도 했지만
NullReferenceException: Object reference not set to an instance of an object
라고 에러가 나옵니다

// 뒤끝 SDK namespace 추가
using BackEnd;
using BackndChat;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

//[DefaultExecutionOrder(-100)] // 로그인 초기화 때문데 우선 순위 높게 설정
public class BackendManager : MonoBehaviour, IChatClientListener
{

    public MyUserData myUserData = new MyUserData();

    // ui 클릭 사운드 처리
    public AudioSource clickSound;

    // 로그인 여부 확인
    public bool isLogin = false;
    // 초기화
    private BackendReturnObject bro;
    public ChatClient ChatClient;// 채팅 초기화

    // 신글톤 구현
    public static BackendManager Instance;
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
        DontDestroyOnLoad(gameObject); // 씬이 바뀌어도 오브젝트가 파괴되지 않도록 설정
    }

    void Start()
    {
        clickSound = GetComponent<AudioSource>(); // 클릭 사운드 초기화

        OnButtonSound();

        bro = Backend.Initialize(); // 뒤끝 초기화

        // 뒤끝 초기화에 대한 응답값
        if (bro.IsSuccess())
        {
            Debug.Log("초기화 성공 : " + bro); // 성공일 경우 statusCode 204 Success
        }
        else
        {
            Debug.LogError("초기화 실패 : " + bro); // 실패일 경우 statusCode 400대 에러 발생 
        }

        // 프레임 고정
        QualitySettings.vSyncCount = 0; // VSync 끄기
        Application.targetFrameRate = 60; // 60 FPS 고정


        ChatClient = new ChatClient(this, new ChatClientArguments
        {
            Avatar = "default",
            Metadata = new Dictionary<string, string>()
            {
                { "Rank", "1" },
                { "Level", "1000" },
                { "Server", "1" }
            }
        });



        //BackendLogin.Instance.CustomSingUp("t123456789", "t123456789");
        //BackendLogin.Instance.CustomLogin("t123456789", "t123456789"); // 뒤끝 로그인
        //myUserData.nickname = "";
        //myUserData.userId = "user100";
        //GameSave();

        //GameLoad(); //기존 데이터가 없으면 에러가 나기는 하는데 게임은 작동 된다

        //BackendManager.Instance.OnBackendLogin("UserId1234567", "Username", "UserEmail");
    }

    /// <summary>
    /// 뒤끝 로그인 처리(id(pw),email)
    /// </summary>
    /// <param name="userId"></param>
    /// <param name="displayName"></param>
    /// <param name="email"></param>
    public void OnBackendLogin(string userId, string email)
    {
        BackendLogin.Instance.CustomSingUp(userId, userId); // 뒤끝 회원가입
        BackendLogin.Instance.CustomLogin(userId, userId);
        BackendLogin.Instance.InsertEmail(email); // 뒤끝 이메일 삽입
        isLogin = true; // 로그인 상태 변경
#nullable enable
        string? name = BackendLogin.Instance.GetNickname();
#nullable disable
        // 닉네임이 설정이 안되어 있다면 설정 하기
        print(name + " 이름 확인");
        if (string.IsNullOrEmpty(name))
        {
            MainMenuManager.Instantiate.OpenNicknameEditPanel();
        }


        // 기본 채널 입장 (콘솔에서 자동 생성된 채널)
        ChatClient.SendJoinOpenChannel("global", "server-1");
        //NullReferenceException: Object reference not set to an instance of an object
        //BackendManager.OnBackendLogin(System.String userId, System.String email)(at Assets / Scripts / BackendCode / BackendManager.cs:111)
    }
    /// <summary>
    /// 씬에 있는 모든 활성화,비활성화 button에 클릭 사운드를 추가합니다.
    /// </summary>
    public void OnButtonSound()
    {
        // 모든 버튼 클릭 시 사운드 재생
        foreach (var button in FindObjectsByType<Button>(FindObjectsInactive.Include, FindObjectsSortMode.None))
        {
            button.onClick.AddListener(() => clickSound.Play());
        }
    }

    // 동기 함수를 비동기에서 호출하게 해주는 함수(유니티 UI 접근 불가)
    void Test()
    {
        //test 개정 생성
        //BackendLogin.Instance.CustomSingUp("user100", "1234"); // 뒤끝 회원가입
        //BackendLogin.Instance.CustomLogin("user100", "1234"); // 뒤끝 로그인
        //BackendLogin.Instance.CustomLogin("user1", "1234"); // 뒤끝 로그인
        //BackendLogin.Instance.UpdateNickname("김철수"); // 뒤끝 닉네임 변경
        //BackendLogin.Instance.CustomSingUp("user2", "1234"); // 뒤끝 회원가입

        //for (int i = 0; i < 20; i++)
        //{
        //    BackendLogin.Instance.CustomSingUp("testuser"+i, "1234"); // 뒤끝 회원가입
        //    BackendLogin.Instance.CustomLogin("testuser" + i, "1234"); // 뒤끝 로그인
        //    // 길드 생성
        //    BackendGuild.Instance.CreateGuild("testuser" + i + "길드"); // 길드 생성
        //}

        // 게임 정보 기능 구현 로직 추가
        //BackendGameData.Instance.GameDataInsert(); // 게임 정보 삽입

        //BackendGameData.Instance.GameDataGet(); // 게임 정보 조회


        // [추가] 서버에 불러온 데이터가 존재하지 않을 경우, 데이터를 새로 생성하여 삽입
        //if (BackendGameData.userData == null)
        //{
        //    BackendGameData.Instance.GameDataInsert();
        //}

        //BackendGameData.Instance.LevelUp(); // [추가] 로컬에 저장된 데이터를 변경

        //BackendGameData.Instance.GameDataUpdate(); //[추가] 서버에 저장된 데이터를 덮어쓰기(변경된 부분만)

        //// 차트 불러오기
        //BackendChart.Instance.ChartGet("190029");


        //// 게임데이터 갱신
        //BackendGameData.Instance.GameDataGet();
        //// 우편 리스트 가지고 오기
        //BackendPost.Instance.PostListGet(PostType.Admin);// 우편 확인
        ////BackendPost.Instance.PostReceive(PostType.Admin,0); // 우편 아이템 수령(0이면 제일 윗 우편)
        //BackendPost.Instance.PostReceiveAll(PostType.Admin); // 우편 아이템 모두 수령

        //// 쿠폰 사용
        ////BackendCoupon.Instance.CouponUse("b26a606709c7f838d0");
        //// 게임 로그 삽입
        //BackendGameLog.Instance.GameLogInsert();

        //// 친추 태스트
        ////BackendFriend.Instance.SendFriendRequest("김철수철수"); // 친구 요청 보내기
        //BackendFriend.Instance.GetReceivedRequestFriend(); // 친구 요청 불러오기
        ////BackendFriend.Instance.ApplyFriend(0);// 친구요청 리스트중 가장 최신 친구 요청 수락(0이면 제일 윗 친구 요청)
        //BackendFriend.Instance.GetFriendList(); // 친구 리스트 불러오기

        //// 길드 테스트
        ////BackendGuild.Instance.CreateGuild("김철수길드");// 길드 생성
        ////BackendGuild.Instance.RequestGuildJoin("김철수길드"); // 길드 가입 요청
        ////BackendGuild.Instance.AcceptGuildJoinRequest(0); // 길드 가입 요청 수락(0이면 제일 윗 친구 요청(최근))
        //BackendGuild.Instance.ContributeGoods(); // 길드 굿즈 기부

        Debug.Log("테스트를 종료합니다.");
    }

    /// <summary>
    /// 쿠폰 사용
    /// </summary>
    /// 
    public void UseCoupon(string couponCode)
    {
        BackendCoupon.Instance.CouponUse(couponCode);
    }

    /// <summary>
    /// 길드 불러오기
    /// </summary>
    /// 
    public List<GuildItem> GetGuild()
    {
        List<GuildItem> guildItems = BackendGuild.Instance.GetGuildListV3();
        return guildItems;
    }

    public void GameSave()
    {
        // myUserData를 서버에 저장하는 로직
        Param param = new Param();
        param.Add("nickname", myUserData.nickname);
        param.Add("userid", myUserData.userId);
        param.Add("episodeProgress", myUserData.episodeProgress);
        param.Add("purchaseHistory", myUserData.purchaseHistory);
        param.Add("inGameCurrency", myUserData.inGameCurrency);

        var bro = Backend.GameData.Insert("MY_USER_DATA", param);
        if (bro.IsSuccess())
        {
            Debug.Log("게임 데이터 저장 성공: " + myUserData.nickname);
        }
        else
        {
            Debug.LogError("게임 데이터 저장 실패: " + bro);
        }
    }
    public void GameLoad()
    {
        var bro = Backend.GameData.GetMyData("MY_USER_DATA", new Where());// 서버에서 myUserData를 불러오는 로직 new Where()는 조건 없이 모든 데이터를 불러옴
        if (bro.IsSuccess())
        {
            LitJson.JsonData gameData = bro.FlattenRows(); // Json으로 리턴된 데이터를 받아옵니다.
            if (gameData.Count > 0)
            {
                myUserData.nickname = gameData[0]["nickname"].ToString();
                myUserData.userId = gameData[0]["userid"].ToString();
                myUserData.episodeProgress = int.Parse(gameData[0]["episodeProgress"].ToString());
                foreach (var item in gameData[0]["purchaseHistory"])
                {
                    myUserData.purchaseHistory.Add(item.ToString());
                }
                myUserData.inGameCurrency = ulong.Parse(gameData[0]["inGameCurrency"].ToString());
                Debug.Log("게임 데이터 불러오기 성공: " + myUserData.nickname);
                print(myUserData);
            }
            else
            {
                Debug.LogError("게임 데이터가 존재하지 않습니다.");
            }
        }
        else
        {
            Debug.LogError("게임 데이터 불러오기 실패: " + bro);
        }
    }


    #region # 뒤끝 채팅 설정

    void OnApplicationQuit() => ChatClient?.Dispose();

    public void OnChatMessage(MessageInfo messageInfo)
    {
        Debug.Log($"[수신] {messageInfo.GamerName}: {messageInfo.Message}");
    }

    private void Update()
    {
        ChatClient?.Update(); // 채팅 클라이언트 업데이트
    }

    public void OnJoinChannel(ChannelInfo channelInfo)
    {
        ChatClient.SendChatMessage(channelInfo.ChannelGroup, channelInfo.ChannelName, channelInfo.ChannelNumber, "안녕하세요!");
        //throw new System.NotImplementedException();
    }

    public void OnLeaveChannel(ChannelInfo channelInfo)
    {
        throw new System.NotImplementedException();
    }

    public void OnJoinChannelPlayer(string channelGroup, string channelName, ulong channelNumber, PlayerInfo player)
    {
        throw new System.NotImplementedException();
    }

    public void OnLeaveChannelPlayer(string channelGroup, string channelName, ulong channelNumber, PlayerInfo player)
    {
        throw new System.NotImplementedException();
    }

    public void OnUpdatePlayerInfo(string channelGroup, string channelName, ulong channelNumber, PlayerInfo player)
    {
        throw new System.NotImplementedException();
    }

    public void OnChangeGamerName(string oldGamerName, string newGamerName)
    {
        throw new System.NotImplementedException();
    }


    public void OnWhisperMessage(WhisperMessageInfo messageInfo)
    {
        throw new System.NotImplementedException();
    }

    public void OnTranslateMessage(List<MessageInfo> messages)
    {
        throw new System.NotImplementedException();
    }

    public void OnHideMessage(MessageInfo messageInfo)
    {
        throw new System.NotImplementedException();
    }

    public void OnDeleteMessage(MessageInfo messageInfo)
    {
        throw new System.NotImplementedException();
    }

    public void OnSuccess(SUCCESS_MESSAGE success, object param)
    {
        throw new System.NotImplementedException();
    }

    public void OnError(ERROR_MESSAGE error, object param)
    {
        throw new System.NotImplementedException();
    }
    #endregion
}

클라이언트 앱 아이디 또는 기타 프로젝트 정보 정보가 올바르게 적용되지 못한 상황에서 시도하신 것으로 예상되는데요,
확인 시 현재 정상 접속 및 메시지 전송을 진행하신 것으로 확인됩니다.