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"]);
        }
    }

 

감사합니다.

반응형
Comments