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
  1.  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);
    }