8년차 모션그래픽디자이너의 고군분투
[Unity/메타버스 게임] 닉네임 수정하기 | 포톤네트워크 | MonogDB | Nickname | Hashtable 본문
코자이너/Unity
[Unity/메타버스 게임] 닉네임 수정하기 | 포톤네트워크 | MonogDB | Nickname | Hashtable
쓰리디사람3Dperson 2024. 6. 19. 16:25반응형
안녕하세요 오늘은 메타버스 게임에서 닉네임을 수정하여 모든 사람에게 닉네임이 수정된 걸 볼 수 있게 하는 코드를 공유하겠습니다.
닉네임 설정하는 글은 여기에도 올려놨습니다.
[코자이너/Unity] - [Unity] 포톤네트워크를 활용해서 닉네임 다른 사람들에게도 보이게 하기
현재 닉네임은 '닉네임테스트' 입니다. 이 닉네임을 바꿔보겠습니다.
아바타를 랜덤으로 바꿀 수 있는 선택 창과 닉네임을 설정할 수 있는 선택 창입니다. 코인을 소비하게 되어있어서 코인을 먼저 체크하고 코인 값이 없으면 경고 문구가 뜨고 코인 값이 있으면 변경 창으로 넘어갑니다.
이렇게 변경 창을 만들었습니다.
변경 할 닉네임을 입력하고
닉네임이 변경된 걸 확인 할수 있습니다.
디버그도 성공적으로 떴습니다.
몽고DB도 변경된 걸 알 수 있습니다.
스크립트를 공유해보겠습니다.
닉네임변경하는.cs
// 닉네임 변경하는 팝업 창
public void OnClickNamePopup()
{
// 현재 가지고 있는 코인 값을 확인
int coins = PersonalManager.Instance.CheckCoins();
// 내가 가지고 있는 코인이 300보다 많다면
if (player != null & coins > Coin300)
{
bool isActive = ChangingName.activeSelf;
// 새로운 활성 상태 설정
ChangingName.SetActive(!isActive);
ChoicePopup.SetActive(isActive);
}
else
{
// 코인이 없다는 경고 팝업
NoCoinAtAll.SetActive(true);
Debug.Log("돈 없음");
}
}
// 닉네임을 변경할 수 있는 변경 팝업 창
public void OnClickGetNewNickName()
{
// InputFieldNameUI가 null이 아닌지 확인하고 값 설정
if (InputFieldNameUI == null)
{
Debug.LogError("InputFieldNameUI가 null입니다.");
return;
}
// 인풋필드에 적은 이름 값 가져오기
_newName = InputFieldNameUI.text;
if (string.IsNullOrEmpty(_newName))
{
Debug.LogError("새 이름이 유효하지 않습니다.");
return;
}
// 이름을 변경하는 함수 (몽고DB, 커스텀프로퍼티 등을 변경하는 함수 밑에 자세히 기재 예정)
bool isChanged = PersonalManager.Instance.ChangingNickName(_newName);
if (isChanged) // 변경되었다면
{
// 코인을 소모하고
PersonalManager.Instance.SpendCoins(Coin300);
// 창을 닫음
ChangingName.gameObject.SetActive(false);
ChangeAvatarButton.gameObject.SetActive(false);
Debug.Log("닉네임 변경 성공");
}
else
{
Debug.LogError("닉네임 변경 실패");
}
}
반응형
PersonalManager.cs
// 닉네임을 변경하는 함수
public bool ChangingNickName(string newName)
{
// newName이 null 또는 빈 문자열인지 확인
if (string.IsNullOrEmpty(newName))
{
Debug.LogError("새 이름이 유효하지 않습니다.");
return false;
}
// 원래의 닉네임을 가져와서
string originalName = GetCachedUserName();
if (string.IsNullOrEmpty(originalName)) return false;
// 원래의 닉네임이 있는지 체크
var filter = Builders<Personal>.Filter.Eq("Name", originalName);
// 새로운 닉네임으로 교체
var update = Builders<Personal>.Update.Set("Name", newName);
var result = _personalCollection.UpdateOne(filter, update);
Debug.Log($"MongoDB Update Result: {result}");
// 변경된 값이 있다면
if (result.ModifiedCount > 0)
{
_cachedUserName = newName; // 가지고 있는 캐시를 업데이트하지만
PlayerPrefs.SetString("LoggedInId", newName);
PlayerPrefs.Save(); // 혹시 몰라서 한번 더 저장하는 확실한 코드
if (PhotonNetwork.LocalPlayer.IsLocal)
{
// 내 해시테이블 새롭게 저장
Hashtable customProperties = new Hashtable { { "Nickname", newName } };
PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties);
}
// 포톤닉네임을 새로운 값으로 저장
PhotonNetwork.NickName = newName;
Debug.Log($"Updated NickName to: {PhotonNetwork.NickName}");
return true;
}
return false;
}
// 현재 가지고 있는 닉네임 체크하는 함수
private string GetCachedUserName()
{
if (string.IsNullOrEmpty(_cachedUserName))
{
_cachedUserName = PlayerPrefs.GetString("LoggedInId");
if (string.IsNullOrEmpty(_cachedUserName))
{
Debug.LogError("사용자 이름을 찾을 수 없습니다.");
return string.Empty;
}
var filter = Builders<Personal>.Filter.Eq("Name", _cachedUserName);
if (!_personalCollection.Find(filter).Any())
{
Debug.LogError("유효하지 않은 사용자 이름입니다.");
_cachedUserName = string.Empty;
}
}
return _cachedUserName;
}
PlayerCanvasAbility.cs
// 닉네임 텍스트 보여주는 UI 코드
public void SetNickname(string nickname)
{
NicknameTextUI.text = nickname;
}
// 해시테이블이 변경되었다면 이 값을 받아 UI 닉네임을 변경하여 보여줌
public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, Hashtable changedProps)
{
if (changedProps.ContainsKey("Nickname") && targetPlayer == _owner.photonView.Owner)
{
SetNickname((string)changedProps["Nickname"]);
}
}
감사합니다.
반응형
'코자이너 > Unity' 카테고리의 다른 글
[Unity] 유니티 최적화 끝장판 | 배치, 프레임 수 개선하기 | Mesh Bake (0) | 2024.07.31 |
---|---|
[Unity/메타버스 게임] 로그인 할 때마다 캐릭터 정보 가져오기 | MongoDB | PhotonNetwork | 몽고디비 | 포톤네트워크 (0) | 2024.06.20 |
[Unity] 유니티에서 몽고DB 연결해서 사용하기 | MongoDB | 로그인 창에서 아이디 확인하기 | 자동 로그인 설정 값 | PlayerPrefs | Hashtable (2) | 2024.06.17 |
[Unity] 포톤네트워크 사용해서 씬 이동했을 때 전 씬 값 받아서 현재 씬에 로드하기 (0) | 2024.06.17 |
[Unity] 포톤네트워크를 활용해서 닉네임 다른 사람들에게도 보이게 하기 (1) | 2024.06.14 |
Comments