Skip to content

Latest commit

 

History

History
312 lines (233 loc) · 10.4 KB

L4.md

File metadata and controls

312 lines (233 loc) · 10.4 KB

게임 서버 만들기 4

수업내용

  • 게임 결과 표시하기
    • 기본 패널 만들기
    • 오브젝트와 스크립트 연동하기
    • 서버와 연결하기
    • Split 함수를 이용한 데이터 분리
  • 게임 마무리하기
    • 게임 재시작 버튼 만들기
    • UI 디자인 마무리하기

게임 결과 표시하기

지금까지 UI 를 활용하여 로그인, 회원가입 기능과 간단한 게임을 제작해보았습니다.

이제 이 게임 결과를 표시하고 서버로 전송하는 결과창을 제작해보겠습니다.

기본 패널 만들기

pan_result 만들기

결과창 & 순위창 에 해당하는 패널을 만듭니다.

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled.png

tx (text)

  • tx_result_myid : 자신의 아이디 표시할 텍스트
  • tx_result_myscore : 게임 결과 점수를 표시할 텍스트
  • tx_result_mybestscore : 자신의 최고 점수를 표시할 텍스트
  • tx_result_myrank : 자신의 등수를 표시할 텍스트
  • tx_result_rank : 서버의 순위를 불러와서 표시할 텍스트, 1~3위를 표시한다

bt (button)

  • bt_result_retry : 재시도 버튼 (게임 화면으로 돌아감)
  • bt_result_restart : 게임 재시작 버튼 (로그인 화면으로 돌아감)

대략적인 구성도

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%201.png

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%202.png

오브젝트와 스크립트 연동하기

유니티 에디터 설정하기

일반적인 단일 오브젝트 뿐 아니라 배열로 여러개의 오브젝트를 동시에 받아오기도 가능함

[Header("pan_result")]
public GameObject pan_result;
public Text tx_result_myid;
public Text tx_result_myscore;
public Text tx_result_mybestscore;
public Text tx_result_myrank;
public Text [] tx_result_rank = new Text[3];

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%203.png

스크립트 수정하기

Start()의 초기 패널 설정 수정

void Start()
{
    pan_login.SetActive(true);
    pan_signup.SetActive(false);
    pan_game0.SetActive(false);
    pan_result.SetActive(false);
}

Update()의 게임 종료시 행동을 수정

void Update()
{
    if (g0_NextTime >= 0)
    {
        if (g0_LeftTime <= 0)   //시간초과경우
        {
            //패널 이동
            pan_result.SetActive(true);
            pan_game0.SetActive(false);

						//점수 업데이트
            m_score = g0_count;
            Debug.Log("m_score : " + m_score + "\nm_bestscore : " + m_bestscore);

            //값 초기화
            g0_LeftTime = 5;
            g0_NextTime = -1;

            //결과창 업데이트
						if (m_bestscore < m_score)
            {
                m_bestscore = m_score;
            }
            StartCoroutine(co_result());
            return;
				}

		...
  • m_score = g0_count : 카운트 횟수를 점수에 반영
  • g0_LeftTime - 5, g0_NextTime = -1 : 게임이 끝났으므로 게임에 사용한 변수 초기화
  • if(m_bestscore < m_score) : 서버에 저장되어있는 점수 (최고기록) 보다 현재 점수가 큰 경우 최고 점수 갱신
  • StartCoroutine(co_result()) : 서버에 결과를 업로드 하기 위해 코루틴 시작하기

서버와 연결하기

url_result 주소 만들기 밎 co_result 제작

  • split 설명하기
  • split Length 왜 1 더 큰지 설명하기
  • 존재하지 않는데이터 여부 확인하기

서버의 php 코드

<?php
//unity import
$id = $_POST['Input_id'];
$score = $_POST['Input_score'];
$con = mysqli_connect("localhost","swhtest1","Ace14202!!");
mysqli_select_db($con,"swhtest1");
mysqli_query($con,"set names utf8");

$myrank = 0;
$result = mysqli_query($con,"UPDATE `user` SET `score`='".$score."' WHERE id='".$id."'");
$check = mysqli_query($con,"SELECT * FROM user ORDER BY score DESC");

$numrows = mysqli_num_rows($check);    
if ($numrows == 0)
{
	die("Result-Error");
}

else
{
	$cnt = 0;
	while($row = mysqli_fetch_assoc($check))
	{
		$cnt = $cnt + 1;
		if($cnt <= 3){
			echo "".$row['id'].";".$row['score'].";";
		}
		if($id == $row['id'])	
		{	
			$myrank = $cnt;
		}
	}
	echo "".$myrank.";";
}
?>
  • 입력한 id 와 score 값을 이용하여 최고 기록을 업데이트함

  • 유저 정보 접근에 실패시 "Result-Error" 반환

    %E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%204.png

  • 유저 정보 접근에 성공시 1~3 순위 유저의 id, score을 반환함. 각 id와 score 사이사이에는 ";"라는 구분자가 들어감 (1,2,3)

  • 마지막에 자신의 순위를 반환 (4)

유니티의 코드

string url_login = "swhtest1.dothome.co.kr/login.php";
string url_signup = "swhtest1.dothome.co.kr/signup.php";
string url_result = "swhtest1.dothome.co.kr/result.php";

...

IEnumerator co_result()
{
    WWWForm form = new WWWForm();

    form.AddField("Input_id", m_id);
    form.AddField("Input_score", m_bestscore);

    WWW webRequest = new WWW(url_result, form);
    yield return webRequest;
    Debug.Log(webRequest.text);
		
		//split 관련 변수 선언
    string result_webRequest = ""+ webRequest.text;
    string[] result_split;

    if (webRequest.text == "")   //인터넷에러
    {
        Debug.Log("internet Error");
    }
    else
    {
        if (webRequest.text == "Result-Error")
        {
        }
        else
        {
            result_split = result_webRequest.Split(';');

            Debug.Log("" + result_split.Length);
            tx_result_myid.text = m_id;
            tx_result_myscore.text = "" + m_score;
            tx_result_mybestscore.text = "" + m_bestscore;
            for( int i = 0; i < 3; i++)
            {
                if(result_split.Length > i * 2 + 2)
                {
                    tx_result_rank[i].text = result_split[i * 2] + "     " + result_split[i * 2 + 1];
                }
                else
                {
                    tx_result_rank[i].text = "존재하지 않는 데이터입니다.";
                }
            }
            tx_result_myrank.text = result_split[result_split.Length - 2];

        }
    }
}
  • string result_webRequest : 반환된 결과값을 문자열로 변환함
  • string[] result_split : 분리된 문자열을 저장할 문자열 배열
  • result_split = result_webRequest.Split(";") : ";"을 기준으로 문자열을 분리하여 저장함
  • for( int i = 0; i < 3; i++) : 1~3 순위를 result_rank[i] 에 표시함
  • if(result_split.Length > i*2+2) : 사용자 데이터가 충분할 경우 순위를 표시함
  • tx_result_myrank.text : 문자열 마지막에 있는 자신의 순위 데이터를 가져와 저장함

Split 함수를 이용한 데이터 분리

서버에서 문자열을 받아올 땐 하나의 긴 문자열로 받아옵니다.

따라서 하나의 문자열에서 원하는 정보를 꺼내와 활용할 수 있어야 합니다.

이를 위해 Split 함수를 이용할 예정입니다.

Split 함수

Split 함수를 사용하면 기본적으로 char 형으로 구분자를 사용하여 문장을 잘라야 합니다. 특정 단어를 구분자로 사용하기 위해서는 아래와 같이 사용하면 됩니다.

문자열배열 = 입력문자열.Split('구분자');

하나의 입력 문자열을 구분자를 기준으로 분리하여 문자열 배열에 저장합니다.

//예시
void Start()
{
		string test = "a b c d e";
		string [] split_test; 
		split_test = test.Split(' ');
		for(int i = 0; i<split_test.Length ; i++){
				Debug.Log(split_test[i]+"\n");
		}

}

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%205.png

실행 결과를 디버그 로그로 확인

게임 마무리하기

게임 재시작 버튼 만들기

게임 다시 시작 and 다시 로그인 키

게임 재시작을 위해선 SceneManager을 사용하여야 한다.

using UnityEngine.SceneManagement.SceneManager 을 이용하여 기능을 사용할 수 있다.

public void btnClick_retry()
{
    //게임 재도전
    pan_game0.SetActive(true);
    pan_result.SetActive(false);
        
}
public void btnClick_restart()
{
    //어플리케이션 자체를 재시작
    UnityEngine.SceneManagement.SceneManager.LoadScene(0);
}

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%206.png

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%207.png

UI 디자인 마무리하기

예시에서 처럼 UI를 배치하고 꾸며도 괜찮지만 원하는 방식의 배치와 이미지를 활용하여 UI를 꾸밀 수 있습니다.

사용자가 접근하기 쉽고 이해하기 쉽게 UI 를 배치하고 제작하여야 사용자가 게임을 이해하기 쉬워집니다.

필요시 안내 메세지를 제작하여 여러 곳에 배치하는것이 도움이 될 수 있습니다.

%E1%84%80%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%B7%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5%20%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5%204%20403889cf0e3b4d2d8699342b9cd30b31/Untitled%208.png