사실 GameSparks라는 게임 백엔드 솔루션을 사용하면 편하지만, GameSparks는 NoSQL인 MongoDB를 사용해서 SQL 공부를 하기 위해 Hnetwork와 MySQL을 사용하기로 결정했다. (Unity: C# / Hnetwork: C++ / MySQL: SQL)
클라이언트에서 바로 데이터베이스에 접근하여 데이터를 사용할 수 있지만, 이러한 방식은 보안상 좋지 않기 때문에 데이터베이스는 서버에서만 접근할 수 있게 하는 것이 좋다.
Hnetwork 카페에 MySQL 연동 및 데이터 송수신 방법이 나와있다. 해당 게시물을 참고하여서 로그인/회원가입 시스템을 만들었다.
UGUI를 이용한 로그인/회원가입 UI
간단하게 InputField와 Button을 이용하여 로그인/회원가입 UI를 만들었다.
MySQL에 User 테이블 생성
데이터베이스의 User 테이블을 생성하여 플레이어의 닉네임과 비밀번호 등의 정보를 저장한다.
System.EventHandler를 이용하여 변수가 변경될 때 정해진 이벤트를 호출하게 설정할 수 있다.
해당 기능은 어떤 변수가 변경되면 연쇄적으로 다양한 이벤트가 발생되어야 할 때 효과적으로 활용할 수 있다.
using System;
public event EventHandler OnLevelChanged;
private int _level;
public int level
{
get => _level;
set
{
_level = value;
OnLevelChanged?.Invoke(this, EventArgs.Empty);
}
}
위 코드를 통해 플레이어의 레벨이 바뀔 때 OnLevelChanged에 등록된 이벤트들을 호출할 수 있다.
private void Awake()
{
Player.instance.OnLevelChanged += Instance_OnLevelChanged;
}
private void Instance_OnLevelChanged(object sender, System.EventArgs e)
{
// 플레이어의 레벨이 바뀔 때 실행하고 싶은 내용
}
위의 코드는 Player가 Singleton일 때의 경우이다. 이처럼 EventHandler에 원하는 함수를 추가해주면 된다.
public class DontDestroy<T> : MonoBehaviour where T : DontDestroy<T>
{
private static T instance;
private void Awake()
{
if (instance == null)
instance = this as T;
else
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
}
}
public abstract class GenericSingleTon<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
public static T instance
{
get
{
if (_instance == null)
{
T[] objectList = Resources.FindObjectsOfTypeAll<T>();
if (objectList.Length > 0)
(objectList[0] as GenericSingleTon<T>).Awake();
}
return _instance;
}
}
private void Awake()
{
if (_instance == null)
_instance = this as T;
}
}