Data base
2023 - 02 - 18 DB SQLite Unity 프로젝트 적용
Jang_^
2023. 2. 18. 23:32
https://mungto.tistory.com/253 - 이 사이트를 참고하여 만들었습니다.
1. SQLite 다운로드
SQLite Download Page
Templates (1) and (2) are used for source-code products. Template (1) is used for generic source-code products and templates (2) is used for source-code products that are generally only useful on unix-like platforms. Template (3) is used for precompiled bi
www.sqlite.org
- 홈페이지에 접속하여 자신의 버전에 맞는 SQLite 를 다운로드 받은 뒤 압축을 풀어 자신이 적용시키고 싶은 Unity 프로젝트 폴더 안 Assets/plugins 안에 넣는다.
2. Plug - in 파일 다운로드 및 적용
- 자신의 유니티 로컬 경로 ( 필자는 C:\Program Files\Unity 파일안에서 Mono.Data 를 윈도우 탐색기로 검색하였다 ) C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unityjit 에서 Mono.Data.Sqlite.dll 도 Assets/plugins 안에 넣는다.
3. DB 를 생성하고 관리할 SQLite 다운로드
- https://sqlitebrowser.org/dl/ 에서 인스톨러를 다운받아 설치한다.
- 설치가 완료되면 DB Browser 를 실행시켜 테이블을 만든다. ( 필자는 RPG 류 DB를 연동시킬 목적이라 체력 , 공격속도 , 이동속도 인 필드도 추가했다. )
4. Unity 안에 DB를 연동시킬 스크립트 구현
- Login.Mgr
- UGI 구성 과 DB랑 연동할 변수들을 선언 및 초기화
[Header("LoginPanel")] //로그인 화면 구성
public GameObject LoginPanelObj; //로그인 패널
public InputField L_id = null; //아이디를 넣을 공간
public InputField L_pw = null; //비밀번호를 "
public Button m_LoginBtn = null; //로그인 버튼
public Button m_SiginUp = null; //계정 생성버튼
[Header("SignUpPanel")] //회원가입 화면 구성
public GameObject SignUpPanelObj; //회원가입 패널
public InputField S_nick = null; //닉네임을 적을 공간
public InputField S_id = null; //아이디 "
public InputField S_pw = null; //비밀번호 "
public Button S_CreateBtn = null; //아이디 생성버튼
public Button S_CancelBtn = null; //아이디 생성취소 버튼
[Header("Message")] //에러 메시지 출력
public Text m_messageText = null; // " 를 띄울 Text
private float m_msTimer = 0.0f; // " 띄울 주기
public static List<UserInfo> User = new List<UserInfo>(); // DB의 유저들의 정보를 담아 검색하기 위한 리스트
public List<string> IDinfo = new List<string>(); // DB에서 유저들의 ID 정보를 담아 검색하기 위한 리스트
public List<string> PWinfo = new List<string>(); // " PASSWORD "
public List<string> NICKinfo = new List<string>(); // " NICK "
public int DBCount = 0; // 리스트 최신화를 위한 DB 행 카운트 변수
public int isNewCheck = 0; // 새로가입한 아이디인지 확인하는 변수
2. SQLite DB 연결을 위한 함수
IEnumerator DBCreate()
{
string filepath = string.Empty; //파일 경로
if (Application.platform == RuntimePlatform.Android)
{
filepath = Application.dataPath + "/test.db"; //경로설정
if (!File.Exists(filepath)) //파일이 없을때
{
UnityWebRequest unityWebRequest = UnityWebRequest.Get("jar:file://" + Application.dataPath + "!/assets/test.db");
unityWebRequest.downloadedBytes.ToString();
yield return unityWebRequest.SendWebRequest().isDone;
File.WriteAllBytes(filepath, unityWebRequest.downloadHandler.data);
//파일을 복사하여 옮기는 코드입니다.
//기존예시들이 www클래스로 되어있었는데 Unity에서 www클래스를 권장하지 않기때문에 변형했습니다.
//또한 코루틴을 사용하여 busy waiting을 하지않도록 코드
//기존에 참고한 예시들은 while문을 이용한 대기들이 많습니다.
}
}
else
{
filepath = Application.dataPath + "/test.db";
if (!File.Exists(filepath)) //파일이 없을때
{
File.Copy(Application.streamingAssetsPath + "/test.db", filepath);
}
}
//MessageOnOff("DB생성완료", true);
}
//파일경로 얻어오는 함수
public string GetDBFilePath()
{
string str = string.Empty;
if (Application.platform == RuntimePlatform.Android)
{
str = "URI=file:" + Application.persistentDataPath + "/test.db";
}
else
{
str = "URI=file:" + Application.dataPath + "/test.db";
}
return str; //파일경로를 반환하는 변수
}
//DB 연결상태 체크하는 함수
public void DBConnectionCheck()
{
try
{
IDbConnection dbConnection = new SqliteConnection(GetDBFilePath());
dbConnection.Open(); //DB열기
string text = null;
if (dbConnection.State == ConnectionState.Open) //디비상태가 잘열렸다면
{
text = "DB연결성공";
MessageOnOff(text, true);
}
else
{
text = "연결실패(에러)";
MessageOnOff(text, true);
}
}
catch(Exception e)
{
Debug.Log(e);
}
}
3. DB의 정보 를 가져오기 위한 스크립트
/// <summary>
/// 데이터베이스의 행과 열을 읽는 함수
/// </summary>
/// <param name="query">SQL 명령문을 받을 string 변수</param>
public void DataBaseRead(string query)
{
int m_DataCount = 0;
IDbConnection dbConnection = new SqliteConnection(GetDBFilePath());
//DB열기
dbConnection.Open();
IDbCommand dbCommand = dbConnection.CreateCommand();
//쿼리입력
dbCommand.CommandText = query;
//쿼리실행
IDataReader dataReader = dbCommand.ExecuteReader();
while (dataReader.Read())
{
switch(query)
{
case "Select ID From test":
{
var id = dataReader.GetString(0);
IDinfo.Add(id);
break;
}
case "Select PASSWORD From test":
{
var Password = dataReader.GetString(0);
PWinfo.Add(Password);
break;
}
case "Select NICK From test":
{
var Nick = dataReader.GetString(0);
NICKinfo.Add(Nick);
break;
}
}
m_DataCount++;
}
DBCount = m_DataCount;
dataReader.Dispose(); //생성순서와 반대로 닫아줍니다.
dataReader = null;
DBClose(dbCommand, dbConnection);
}
4. DB 의 정보를 유저 input 과 대조하기 위한 함수
public void RenewList()
{
IDinfo.Clear();
PWinfo.Clear();
NICKinfo.Clear();
DataBaseRead("Select ID From test");
DataBaseRead("Select PASSWORD From test");
DataBaseRead("Select NICK From test");
//HP MVSPEED ATSPEED 값도 넣어줘야하고 처음하는 사람과 기존에 했던사람의 데이터를 나눠야함
}
/// <summary>
/// 데이터베이스 명령문을 받을 함수
/// </summary>
/// <param name="query">SQL 명령문을 받을 String 매개변수</param>
public void DatabaseInsert(string query)
{
IDbConnection dbConnection = new SqliteConnection(GetDBFilePath());
dbConnection.Open(); //DB 열기
IDbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = query; //쿼리 입력
dbCommand.ExecuteNonQuery(); //쿼리 실행
DBClose(dbCommand, dbConnection);
}
//Insert 가 추가
//Delete 가 삭제
//Update 가 변경
//Select 가 찾기
/// <summary>
/// 로그인할때 마다 변경될 테이블안의 내용들을 간략화한 함수
/// </summary>
/// <param name="g_HP">DB에 저장된 유저의 HP</param>
/// <param name="g_MvSpeed"> " 이동속도</param>
/// <param name="g_AttackSpeed"> " 공격속도</param>
/// <param name="IDinfo"> " 아이디</param>
void DatabaseUpdate(int g_HP , int g_MvSpeed, int g_AttackSpeed, string IDinfo)
{
DatabaseInsert("UPDATE test SET HP =" + g_HP + "," + "MVSPEED =" + g_MvSpeed + "," + "ATSPEED =" + g_AttackSpeed +
" Where ID ='" + IDinfo + "'");
}
void DatabaseSelect(string query, string id)
{
IDbConnection dbConnection = new SqliteConnection(GetDBFilePath());
//DB열기
dbConnection.Open();
IDbCommand dbCommand = dbConnection.CreateCommand();
//쿼리입력
dbCommand.CommandText = query;
//쿼리실행
IDataReader dataReader = dbCommand.ExecuteReader();
while(dataReader.Read())
{
if(query == "Select HP From test Where id ='" + id + "'")
{
isNewCheck = dataReader.GetInt32(0);
}
}
dataReader.Dispose(); //생성순서와 반대로 닫아줍니다.
dataReader = null;
DBClose(dbCommand, dbConnection);
}