(구현한 ATM기의 모습이다.)
구현한 요구사항
필수요구사항
- ATM 화면 구성 ✅
- 입금 기능 ✅
- 출금 기능 ✅
선택요구사항
- 통화 단위 적용 ✅
- 금액 입력 시 숫자만 입력 ✅
- 로그인 기능 ✅
- 회원가입 ✅
- 송금 기능 ✅
그 외 추가로 시도한 기능
- 비밀번호 MD5로 해시해서 저장 ✅
알게된 점 & 느낀 점
어제 TIL에 작성했듯이 C#에서 해시 알고리즘을 사용하는 방법을 알아봤었다.
항상 개념으로만 인지하고 있다가 언젠가는 실사용을 꼭 해보고 싶었는데,
실제로 코드를 작성해서 내 프로젝트에 적용을 하니 원리도 이해가면서 익숙해졌다.
시도를 해본 것은 그래도 명색이 은행 ATM기를 모방한건데...
데이터베이스 하나 털어서 비밀번호를 바로 알게 된다면 그것만큼 허무한 게 없지 않을까 하는 생각 때문이었다.
그래서 간단한 보안 조치를 한 것이다.
(사진 속 Test의 비밀번호는 "1234", Test2는 "1q2w3e4r"이다. MD5로 해시된 것을 확인할 수 있다.)
아래에서 구현한 코드를 확인해 볼 수 있다.
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class Hasher : MonoBehaviour
{
byte[] tmpSource;
byte[] tmpHash;
public string HashData(string sourceData)
{
tmpSource = ASCIIEncoding.ASCII.GetBytes(sourceData);
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
return ByteArrayToString(tmpHash);
}
public string ByteArrayToString(byte[] arrInput)
{
int i;
StringBuilder sOutput = new StringBuilder(arrInput.Length);
for (i = 0; i < arrInput.Length; i++)
{
sOutput.Append(arrInput[i].ToString("X2"));
}
return sOutput.ToString();
}
}
그리고 역시나 회원 가입과 json을 이용한 저장 기능이 시간을 많이 잡아먹었는데,
정말 다행인 건(?) 저번 팀 프로젝트 때 저장 기능을 알아가는데만 하루를 까먹은 덕분에
이번에는 비교적 에러도 없이 빠르게 구현을 하게 되었다.
코드도 개인적으로 느끼기에는 저번보다 깔끔해진 것 같다.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class SaveData : MonoBehaviour
{
public SaveUserData saveUserData;
private void Awake()
{
LoadUserData();
DontDestroyOnLoad(this);
}
[ContextMenu("To Json Data")]
public void SaveUserData()
{
string jsonData = JsonUtility.ToJson(saveUserData, true);
string path = Path.Combine(Application.dataPath, "UserData.json");
File.WriteAllText(path, jsonData);
Debug.Log("데이터 저장했음");
}
[ContextMenu("From Json Data")]
public void LoadUserData()
{
string path = Path.Combine(Application.dataPath, "UserData.json");
if (!File.Exists(path))
{
Debug.Log("No File");
saveUserData = new SaveUserData();
return;
}
string jsonData = File.ReadAllText(path);
saveUserData = JsonUtility.FromJson<SaveUserData>(jsonData);
Debug.Log("데이터 불러왔음");
}
}
[System.Serializable]
public class SaveUserData
{
public List<UserData> user = new List<UserData>();
}
[System.Serializable]
public class UserData
{
public string id;
public string password;
public string name;
public int balance;
public int cash;
public bool isLogined;
}
전체적으로 아쉬운 점은, 스크립트를 좀 더 체계적으로 분류할 수 있지 않았을까 하는 것이다.
너무 GameManager 파일 하나에 많은 기능들은 전체적으로 몰아준게 아닌가... 하는 생각이 든다.
이번 개인 과제에서 굳이 '난이도[하]' 짜리를 선택했던 건,
언젠가는 ATM기 같은 보안 기능을 요구하는 UI가 주가 되는 프로젝트를 해보고 싶었는데,
이게 마침 내 니즈에 맞을 것 같아서 선택하게 되었던 것이다.
결과적으로 만족한다.
'TIL(Today I Learned)' 카테고리의 다른 글
[Unity] 코루틴(Coroutine)을 이용한 지연 실행, AudioManager 만들기 - TIL#35 (0) | 2024.02.13 |
---|---|
[Unity] 팀 프로젝트 : 3D 퍼즐 게임 기획 - TIL#34 (0) | 2024.02.08 |
[Unity] TextMeshPro 사용하기 등 - TIL#32 (0) | 2024.02.06 |
크기가 작은 부분문자열 - TIL#31 (0) | 2024.02.05 |
3D Survival 게임 만들기 - TIL#30 (0) | 2024.02.02 |