1. 오늘 학습 키워드
json, 입출금 로직 생성, 해시
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
우선 어제 데이터를 SO에서 클래스로 바꿔줬다.
그리고 로그인 기능을 넣어줄것이기에, password도 같이 유저 데이터에 넣었다.
[System.Serializable]
public class UsersData
{
public string userName;
public int money;
public int balance;
public string hashedPassword;
public string userId;
public UsersData()
{
userId = "";
userName = "DefaultUser";
money = 0;
balance = 0;
hashedPassword = "";
}
public UsersData(string userName, int money, int balance, string userId, string hashedPassword)
{
this.userName = userName;
this.money = money;
this.balance = balance;
this.hashedPassword = hashedPassword;
}
}
그리고 유저가 한 명이 아니기에, 리스트를 만들어서 해당 유저를 관리했고,
해당 리스트를 json에 연결했다.
public void SaveUserData(List<UsersData> users)
{
UsersDataListWrapper wrapper = new UsersDataListWrapper();
wrapper.usersDatalist = users;
string jsonString = JsonUtility.ToJson(users);
string filePath = Path.Combine(Application.persistentDataPath, "usersData.json");
try
{
File.WriteAllText(filePath, jsonString);
}
catch (Exception ex)
{
Debug.LogError("Fail" + ex.Message);
}
}
public List<UsersData> LoadUserData()
{
string filePath = Path.Combine(Application.persistentDataPath, "usersData.json");
if (File.Exists(filePath))
{
string jsonString = File.ReadAllText(filePath);
UsersDataListWrapper wrapper = JsonUtility.FromJson<UsersDataListWrapper>(jsonString);
return wrapper.usersDatalist;
}
return null;
현재 단일 유저로 작업을 했을때엔 리스트가 저장이 되었으나, 리스트로 설정을 해주니 유저 데이터가 저장이 되지 않는 오류가 있다.
이 부분은 월요일에 수정하려고 한다.
그리고 SaveUserData()를 통해 매개 변수를 저장하고, LoadUserData를 통해 유저 데이터를 불러와서, 불러오기 기능을 구상했다.
Application.persistentDataPath는 작업하는 환경에 따라 저장 공간이 바뀐다.
윈도우 : C:\Users\<사용자 이름>\AppData\LocalLow\<회사 이름>\<프로젝트 이름> 에 저장이 되고
맥 : ~/Library/Application Support/<회사 이름>/<프로젝트 이름>
Android OS : /storage/emulated/0/Android/data/<패키지 이름>/files
Ios : /var/mobile/Containers/Data/Application/<UUID>/Documents
와 같다.
그리고 InputField를 통해 어제 입 출금 금액을 입력할 수 있게 제작했는데,
오늘은 이 인풋필드를 사용해서 로그인 및 회원가입 기능을 제작했다.
회원 가입부터 보자면 아이디 및 이름 그리고 패스워드와 패스워드 확인키를 인풋 필드를 선언 및 변수에 연결해주었다.
추후 시간이 된다면 팝업 매니저를 제작해서 팝업을 관리 해주려고 한다.
public class Register : Singleton<Register>
{
[Header("InputField")]
[SerializeField] private TMP_InputField userId;
[SerializeField] private TMP_InputField userName;
[SerializeField] private TMP_InputField userPassword;
[SerializeField] private TMP_InputField passwordConfirm;
[Header("Popup")]
[SerializeField] private GameObject failPopup;
[SerializeField] private TextMeshProUGUI failText;
public delegate void PopupDelegate(string message);
public PopupDelegate ShowPopup;
그리고 해당 메서드를 통해 계정을 생성한다.
인풋필드로 받은 텍스트를 string에 저장하고, 해당 값을 비교하여, 오류를 failText로 반환한다.
return이 있기에, 오류로 빠져나갈시에 해당 메서드가 종료가 되고, 오류 반환 및 계정 생성이 되질 않는다.
이제 오류가 없을 시에, new User를 접촉하여 새로운 데이터를 생성하고, 그 데이터를 UsersData 리스트에 추가해주는 방식이다.
public void RegisterUser()
{
string userid = userId.text;
string username = userName.text;
string userpassword = userPassword.text;
string confirmpassword = passwordConfirm.text;
List<UsersData> userlist = GameManager.instance.usersDataList;
if (userpassword != confirmpassword)
{
failText.text = "비밀번호가 다릅니다";
return;
}
if (userlist.Exists(user => user.userId == userid))
{
failText.text = "이미 존재하는 아이디입니다";
return;
}
string hashedPassword = LoginManager.instance.HashedPassword(confirmpassword);
UsersData newUser = new UsersData();
newUser.userId = userid;
newUser.userName = username;
newUser.hashedPassword = hashedPassword;
userlist.Add(newUser);
GameManager.instance.SaveUserData(userlist);
LoginManager.instance.InitPanel();
}
그리고 마지막으로 로그인 기능인데
이 부분에서 애를 좀 많이 먹었다..
우선 인풋 필드를 통해 적힌 값을 받아오고, 유저 데이터가 기록되어있는 리스트에서 유저의 id를 찾아온다.
이때, 대문자는 무시하고, 소문자인 값으로만 가져온다.
만약 유저의 데이터가 없다면, 즉 아이디가 리스트에 존재하지 않는다면 오류를 반환한다.
계정 등록과 비슷하게 오류를 만났을땐 return을 통해 하위 구문까지 닿지 못해 로그인이 불가하다.
그리고 만약 로그인이 성공하면, 해당 id를 SetCurrentUserID 메서드를 통해 ID를 저장한다.
LoginUI는 패널 false, true 및 UIText에 있는 UpdateUI가 함께 들어있다.
public void Login()
{
string username = idInputField.text;
string password = pwInputField.text;
if (GameManager.instance.usersDataList == null)
{
statusText.text = "Loading data...";
return;
}
UsersData usersData = GameManager.instance.usersDataList.Find(user =>
user.userId.Equals(username, StringComparison.OrdinalIgnoreCase));
if (usersData == null)
{
statusText.text = "존재하지 않는 아이디입니다.";
return;
}
if (!VerifyPassword(password, usersData.hashedPassword))
{
statusText.text = "비밀번호가 틀렸습니다.";
return;
}
UIManager.instance.SetCurrentUserId(usersData.userId);
UIManager.instance.LoginUI();
statusText.text = "로그인 성공!";
}
3. 학습하며 겪었던 문제점 & 에러
로그인이 우선 되지않았던 점이 있었고, json이 리스트를 저장 및 불러오기를 하질 못했다.
4. 내일 학습 할 것은 무엇인지
3번에서 적은 오류 부분을 수정하고, 내일은 송금 및 전반적인 코드를 수정할 예정이다.
'TIL' 카테고리의 다른 글
25.03.25 TIL (0) | 2025.03.25 |
---|---|
25.03.24 TIL (0) | 2025.03.24 |
25.03.20 TIL (0) | 2025.03.20 |
25.03.13 TIL (0) | 2025.03.13 |
25.03.11 TIL (0) | 2025.03.11 |