8년차 모션그래픽디자이너의 고군분투

[Unity] 유니티에서 몽고DB 연결해서 사용하기 | MongoDB | 로그인 창에서 아이디 확인하기 | 자동 로그인 설정 값 | PlayerPrefs | Hashtable 본문

코자이너/Unity

[Unity] 유니티에서 몽고DB 연결해서 사용하기 | MongoDB | 로그인 창에서 아이디 확인하기 | 자동 로그인 설정 값 | PlayerPrefs | Hashtable

쓰리디사람3Dperson 2024. 6. 17. 14:22
반응형

안녕하세요 오늘은 로그인창에서 '아이디, 비밀번호를 몽고디비에서 체크하고 아이디와 비밀번호가 있다면' 의 조건문을 쓰기 위한 몽고디비 코드를 공유하고 또한 자동 로그인 하는 방법에 대한 코드도 공유해보겠습니다.

Personal.cs

using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
using System;
using System.Collections.Generic;

public enum RememberID 
{
    Remember,
    Nope
}

[Serializable]
public class Personal
{
    [BsonId]
    public ObjectId Id;
    public RememberID Remember;
    [BsonElement("Name")]
    public string Name;
    public string Password;
    public int Coins;
    public int CharacterIndex;
}
[Serializable]
public class PersonalData
{
    public List<Personal> Data;

    public PersonalData(List<Personal> data)
    {
        Data = data;
    }
}

캐릭터의 기본적으로 들어가야 하는 정보를 적은 클래스입니다.

오브젝트 아이디, 로그인 창에서 리멤버미를 체크하는 리멤버아이디 체크 이넘, 제일 중요한 캐릭터 닉네임(아이디), 패스워드, 개별로 가지고 있을 코인과 저는 이 게임에서 캐릭터를 로그인 창에서 랜덤으로 생성하여 저장하기 때문에 캐릭터 인덱스 값도 저장해두었습니다.

 

 

PersonalManager.cs

using MongoDB.Bson.Serialization.Serializers;
using MongoDB.Driver;
using System.Collections.Generic;
using UnityEngine;

public class PersonalManager : MonoBehaviour
{
    // 게시글 리스트
    private List<Personal> _personal = new List<Personal>();
    public List<Personal> Personals => _personal;
    // 콜렉션
    private IMongoCollection<Personal> _personalCollection;
    public static PersonalManager Instance { get; private set; }
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            Init();
        }
        else
        {
            Destroy(gameObject);
        }
    }
    public void Init()
    {
        // 보안 유지로 해당 정보 삭제
        string connnectionString = "mongodb+srv://****************.mongodb.net/";
        MongoClient mongoClient = new MongoClient(connnectionString);
        IMongoDatabase db = mongoClient.GetDatabase("Logins");
        // 3. 특정 콜렉션 연결
        _personalCollection = db.GetCollection<Personal>("Log");
    }
    // 새로 아이디, 비밀번호, 캐릭터 인덱스를 저장하는 함수
    public void JoinList(string name, string password, int characterIndex)
    {

        Personal personal = new Personal()
        {
            Name = name,
            Password = password,
            CharacterIndex = characterIndex
        };
        _personalCollection.InsertOne(personal);
    }
    // 몽고디비에 아이디, 비밀번호가 있는지 체크하는 함수
    public Personal Login(string name, string password)
    {
        var filter = Builders<Personal>.Filter.Eq("Name", name) & Builders<Personal>.Filter.Eq("Password", password);
        return _personalCollection.Find(filter).FirstOrDefault();
    }
    // 몽고디비에 아이디, 비밀번호가 있는지 체크하는 조건문을 위한 함수
    public bool CheckUser(string name, string password)
    {
        var filter = Builders<Personal>.Filter.Eq("Name", name) & Builders<Personal>.Filter.Eq("Password", password);
        return _personalCollection.Find(filter).Any();
    }
}

일단 쭉 가져가야 하기 때문에 돈디스트로이로 넣어주고요 (포톤매니저를 쓰면 원래 돈디스트로이, 싱글톤을 안쓰는게 좋다고 합니다. 원래 자동로그인도 해시테이블로 사용하는게 좋습니다.)

몽고디비에서 이렇게 체크하는 함수 및 추가하는 함수를 작성해둡니다.

 

이렇게 MongoDB Compass에 들어가면 뉴커넥션이 나오고 제걸 클릭하고 커넥션을 누르면 이제 몽고디비 안에 있는 리스트컬렉션들이 쭉 나옵니다. 

 

이런식으로 클래스에 제가 설정해둔대로 값이 저장되는걸 알 수 있습니다.

 

 

UI_Lobby.cs (원래는 로비씬으로 해둔 뒤에 기능만 넣고 UI 스크립트에는 버튼만 연결해야 함)

public class UI_Lobby : MonoBehaviour


    private void Start()
    {
        LoadLoginInfo();
        AutoLogin();
    }

    private void LoadLoginInfo()
    {
    	// 로그인 정보를 PlayerPrefs에 저장해두고 있다면 자동으로 채워서 불러오기
        string loggedInUser = PlayerPrefs.GetString("LoggedInId", string.Empty);
        string loggedInPassword = PlayerPrefs.GetString("LoggedInPassword", string.Empty);
        TMP_InputFieldId.text = loggedInUser;
        TMP_InputFieldPw.text = loggedInPassword;
    }

    private void AutoLogin()
    {

        string loggedInUser = PlayerPrefs.GetString("LoggedInId", string.Empty);
        string loggedInPassword = PlayerPrefs.GetString("LoggedInPassword", string.Empty);
		// 로그인 정보가 있다면
        if (!string.IsNullOrEmpty(loggedInUser) && !string.IsNullOrEmpty(loggedInPassword))
        {
        	// 퍼스널매니저에 있던 로그인 함수를 불러옴
            var user = PersonalManager.Instance.Login(loggedInUser, loggedInPassword);
            if (user != null)
            {
            	// 포톤네트워크의 닉네임은 아이디가 되고
                PhotonNetwork.NickName = loggedInUser;
                // 플레이어셀렉션스크립트(캐릭터인덱스관리하는스크립트)에서 캐릭터 인덱스를 들고 옴
                PlayerSelection.Instance.SelectedCharacterIndex = user.CharacterIndex;
				// 캐릭터 인덱스가 0이 아니라면
                if (user.CharacterIndex != 0)
                {
                	// 캐릭터인덱스에 맞는 캐릭터를 생성하고
                    PlayerSelection.Instance.ReloadCharacter();
                    // 캐릭터 선택하는 버튼들을 다 지우고 스타트 버튼만을 나타낸다
                    SelectCharacterBrowser();
                    FemaleButtonUI.gameObject.SetActive(false);
                    MaleButtonUI.gameObject.SetActive(false);
                }
    }   // 여기까지 자동 로그인 코드
    
    // ============================================
    
        public void OnClickNextButton()
    {
        string nickname = TMP_InputField.text;
        string password = TMP_InputFieldPw.text;
		// 아이디나 비밀번호 입력란이 Null이라면
        if (string.IsNullOrEmpty(nickname) || string.IsNullOrEmpty(password))
        {
            Debug.Log("아이디, 비밀번호 둘 다 입력해주세요");
            return;
        }

        if (RememberToggle.isOn)
        {
        	// 토글이 선택되었다면 해당 함수 불러오기
            RememberUserInfo(nickname, password);
        }
		// 퍼스널매니저에 있는 로그인 함수 불러오기
        var user = PersonalManager.Instance.Login(nickname, password);
        if (user != null)
        {
            PhotonNetwork.NickName = nickname;
            PlayerSelection.Instance.SelectedCharacterIndex = user.CharacterIndex;
        }
        else
        {
            Debug.Log("Login failed.");
        }
    }
    
        private void RememberUserInfo(string nickname, string password)
    {
    	// 몽고디비에서 아이디랑 비밀번호가 없다면
        if (!PersonalManager.Instance.CheckUser(nickname, password))
        {
            int index = PlayerSelection.Instance.SelectedCharacterIndex;
            // 몽고디비에 새로 저장
            PersonalManager.Instance.JoinList(nickname, password, index);
            Debug.Log("New user registered.");
        }
		// 혹시 몰라서 써놓는 해시테이블로 아이디, 비밀번호 저장하는 방법
        Hashtable loginInfo = new Hashtable
        {
            { "LoggedInId", nickname },
            { "LoggedInPassword", password }
        };

        PhotonNetwork.LocalPlayer.SetCustomProperties(loginInfo);

        Debug.Log("Login successful, user remembered.");
    }

 

이런식으로 몽고디비에서 로그인 값을 체크한 뒤에 로그인을 하는 자동로그인 및 로그인 할 때 캐릭터 인덱스 및 데려와야하는 정보를 가지고 같이 로그인 할 수 있습니다. 감사합니다.

반응형
Comments