8년차 모션그래픽디자이너의 고군분투
[Unity] 유니티에서 몽고DB 연결해서 사용하기 | MongoDB | 로그인 창에서 아이디 확인하기 | 자동 로그인 설정 값 | PlayerPrefs | Hashtable 본문
[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.");
}
이런식으로 몽고디비에서 로그인 값을 체크한 뒤에 로그인을 하는 자동로그인 및 로그인 할 때 캐릭터 인덱스 및 데려와야하는 정보를 가지고 같이 로그인 할 수 있습니다. 감사합니다.