- 게임 결과 표시하기
- 기본 패널 만들기
- 오브젝트와 스크립트 연동하기
- 서버와 연결하기
- Split 함수를 이용한 데이터 분리
- 게임 마무리하기
- 게임 재시작 버튼 만들기
- UI 디자인 마무리하기
지금까지 UI 를 활용하여 로그인, 회원가입 기능과 간단한 게임을 제작해보았습니다.
이제 이 게임 결과를 표시하고 서버로 전송하는 결과창을 제작해보겠습니다.
결과창 & 순위창 에 해당하는 패널을 만듭니다.
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 : 게임 재시작 버튼 (로그인 화면으로 돌아감)
일반적인 단일 오브젝트 뿐 아니라 배열로 여러개의 오브젝트를 동시에 받아오기도 가능함
[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];
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())
: 서버에 결과를 업로드 하기 위해 코루틴 시작하기
- split 설명하기
- split Length 왜 1 더 큰지 설명하기
- 존재하지 않는데이터 여부 확인하기
<?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" 반환
-
유저 정보 접근에 성공시 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 함수를 사용하면 기본적으로 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");
}
}
실행 결과를 디버그 로그로 확인
게임 재시작을 위해선 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);
}
예시에서 처럼 UI를 배치하고 꾸며도 괜찮지만 원하는 방식의 배치와 이미지를 활용하여 UI를 꾸밀 수 있습니다.
사용자가 접근하기 쉽고 이해하기 쉽게 UI 를 배치하고 제작하여야 사용자가 게임을 이해하기 쉬워집니다.
필요시 안내 메세지를 제작하여 여러 곳에 배치하는것이 도움이 될 수 있습니다.