공식 문서를 참고 했고
뒤끝베이스로 로그인후
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
}