본문 바로가기

유니티(Unity)/Unity

[Unity] Unity와 MySQL 연동(2) - phpMyAdmin 설치, 유니티와 MySQL 연결

이전 글에 이어서 이번에는 phpMyAdmin을 설치하고, 마지막엔 유니티와 MySQL을 연결해보는 시간을 가져보겠습니다.

 

이전 과정에서 이어집니다. 혹시 준비가 되지 않았다면 여기로,,,

[Unity] Unity와 MySQL 연동(1) - Apache, PHP, MySQL 설치

 


 

1. phpMyAdmin 설치

https://www.phpmyadmin.net/downloads/

 

Downloads

Your download should start soon, if not please click here. Please verify the downloaded file Please take additional steps to verify that the file you have downloaded is not corrupted, you can verify it using the following methods: phpMyAdmin needs your con

www.phpmyadmin.net

위 사이트로 가서 phpMyAdmin을 설치해줍니다(작성 기준 5.2.1 버전). phpMyAdmin-5.2.1-all-languages.zip 파일을 받아줍니다.

 

압축을 해제한 후, C 드라이브 - Apache24 - htdocs에 옮겨줍니다. 폴더 이름은 phpMyAdmin으로 변경해줍니다.

 

phpMyAdmin 폴더 안에 있는 config.sample.inc.php 파일의 이름을 config.inc.php로 바꿔줍니다.

 

그리고 이 파일을 열어서 다음과 같이 값을 지정해줍니다.

 

cfg['blowfish_secret']은 원하는 문자열로 마음대로 지정하셔도 됩니다.

 

이제 C 드라이브 - Apache24 - conf 폴더로 이동해서, httpd.conf 파일을 열어 <IfModule dir_module> 부분에 다음과 같이 작성해줍니다.

 

 

2. 데이터베이스 생성

위 과정이 모두 끝나면, 인터넷 주소에 localhost/phpMyAdmin을 입력했을 때, root로 로그인을 하면 다음과 같은 화면이 나옵니다.

 

왼쪽 위에 보이는 데이터베이스를 눌러줍니다.

 

데이터베이스명에 원하는 이름을 지정합니다. 저는 unitytest라고 지정하겠습니다. 이름을 정하고 만들기를 눌러 데이터베이스를 만들어줍니다.

 

그리고 바로 나오는 Create new table에서 테이블 이름을 지정해줍니다. 저는 test라고 했습니다. 컬럼수는 4개로 해주고 만들기를 눌러서 테이블을 생성합니다. 테이블 구성은 아래와 같이 해줍니다.

 

 

설정이 끝나면 저장을 눌러 테이블 생성을 완료합니다.

 

3. Unity와 MySQL 연결

이제 유니티와 DB를 서로 연결시켜보겠습니다. 우선, php 스크립트를 작성합니다. C 드라이브 - Apache24 - htdocs 폴더에 새로운 폴더를 만듭니다. 이름은 UnityTest로 하겠습니다.

 

UnityTest 폴더 안에 savedata.php라는 파일을 만들어줍니다. 메모장으로 스크립트를 먼저 작성하시고, 이름을 수정해주셔도 됩니다. 스크립트는 아래와 같습니다.

<?php
$host = 'localhost';
$user = 'root';
$pw = '****'; /* root의 비밀번호(이전에 수정한 비밀번호로 지정) */
$database = 'unitytest'; /* 데이터베이스 이름 */

try {
    /* 데이터베이스에 연결 */
    $dbhandle = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pw);
}
catch (PDOException $e) {
    echo '<h1>An error has occurred.</h1><pre>', $e->getMessage(), '</pre>';
}

/* SQL 명령문 뭐 쓸건지 준비하고~ */
$shandle = $dbhandle->prepare('INSERT INTO test (name, x, y, z) VALUES (:name, :x, :y, :z)');

try {
    /* 명령문 안에 인수들 값 지정해주고~ */
    $name = $_GET['name'];
    $x = (float)$_GET['x'];
    $y = (float)$_GET['y'];
    $z = (float)$_GET['z'];
    $shandle->bindParam(':name', $name);
    $shandle->bindParam(':x', $x);
    $shandle->bindParam(':y', $y);
    $shandle->bindParam(':z', $z);
    /* 명령문 실행! */
    $shandle->execute();
}
catch (Exception $e) {
    echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage(), '</pre>';
}

이제 유니티를 켜보겠습니다!

 

3D 템플릿으로 새로운 프로젝트를 하나 생성해줍니다.

 

프로젝트가 열리면, 빈 오브젝트를 생성하고 Add Component를 눌러 새로운 스크립트를 추가합니다. 스크립트 이름은 Save2DB 로 하겠습니다.

 

Save2DB의 스크립트는 다음과 같이 작성해줍니다.

using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
using System;
using System.Text.RegularExpressions;
using UnityEngine.Networking;

public class Save2DB : MonoBehaviour
{
    // "http://localhost/htdoc에 만든 폴더이름/php 파일"로 지정합니다.
    public string saveDataURL = "http://localhost/UnityTest/savedata.php";

    public void Save()
    {
        StartCoroutine(PostTest("test1", 0.01f, 0.01f, 0.01f));
    }

    IEnumerator PostTest(string name, float x, float y, float z)
    {
        // SQL문에 전달할 인수들을 &로 묶어서 지정해줍니다.
        // 이때, php문의 $_Get[]에서 사용한 변수들로 지정해줘야합니다.
        string data = "name=" + UnityWebRequest.EscapeURL(name) + "&x=" + x + "&y=" + y + "&z=" + z;
        string postURL = saveDataURL + "?" + data;
        UnityWebRequest hs_post = UnityWebRequest.Post(postURL, data);

        yield return hs_post.SendWebRequest();

        if (hs_post.error != null)
        {
            Debug.LogError("There was an error posting the data:" + hs_post.error);
        }
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

간단하게, 버튼을 누를 때 마다 ('test1', 0.01, 0.01, 0.01)의 값이 DB에 저장되도록 하겠습니다. 버튼을 하나 생성해서 해당 스크립트를 실행시키도록 해줍니다.

 

씬을 시작해서 버튼을 눌러봅니다. phpmyadmin 창에서 값이 저장되는지를 확인합니다. 저장될 값을 바꿔가면서 값들이 저장되는지도 확인해봅니다.

 

이 과정을 응용하면 유니티로 값을 불러오는 것도 가능합니다.

 

C 드라이브 - Apache24 - htdoc - UnityTest 폴더loaddata.php를 만들어주고 아래와 같이 스크립트를 작성합니다.

<?php
$host = 'localhost';
$user = 'root';
$pw = '1234'; /* root의 비밀번호 */
$database = 'unitytest'; /* 데이터베이스 이름 */

try {
    /* 데이터베이스에 연결 */
    $dbhandle = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pw);
}
catch (PDOException $e) {
    echo '<h1>An error has occurred.</h1><pre>', $e->getMessage(), '</pre>';
}

/* SQL문 실행! */
$shandle = $dbhandle->query('SELECT * FROM test');
$datas = $shandle->fetchAll();

if (count($datas) > 0) {
    foreach ($datas as $data) {
        echo $data['name'], "_";
        echo $data['x'], "_";
        echo $data['y'], "_";
        echo $data['z'], "_";
    }
}

Save2DB 스크립트에 다음 내용을 추가해줍니다.

    public void Load()
    {
        StartCoroutine(GetData());
    }

    IEnumerator GetData()
    {
        UnityWebRequest hs_get = UnityWebRequest.Get(loadDataURL);

        yield return hs_get.SendWebRequest();

        if (hs_get.error != null)
        {
            Debug.LogError("There was an error getting the data:" + hs_get.error);
        }
        else
        {
            string data = hs_get.downloadHandler.text;
            MatchCollection mc = Regex.Matches(data, @"_");
            
            if (mc.Count > 0)
            {
                string[] splitData = Regex.Split(data, @"_");
                string result = "";
                for (int i = 0; i < mc.Count; i++)
                {
                    result += splitData[i] + " ";
                    if (i % 4 == 3)
                    {
                        Debug.Log(result);
                        result = "";
                    }
                }
            }
        }
    }

버튼을 하나 더 추가해주고 load 함수를 실행시키도록 해줍니다.

 

버튼을 눌렀을 때, 콘솔창에 데이터들이 나타나는지 확인합니다.

 

 

지금까지 유니티와 MySQL을 연동하는 방법을 (긴 시간동안..) 알아봤습니다!

 

혹시, 이상한점이나 궁금한점 있으시다면 댓글로 남겨주세요!

 

감사합니다.

 


 

[Reference]

https://www.red-gate.com/simple-talk/development/dotnet-development/using-mysql-unity/

https://foreverhappiness.tistory.com/100

https://jtoday.tistory.com/entry/PDO

https://wickedmagica.tistory.com/16