Scoring and Building Game
Displaying the Score and Text
스코어를 계산하고 출력하기 위해서, 거두어들인 PickUp을 세서 더하는 툴을 Player 스크립트에 추가해 보도록 합니다.
스크립트를 열고 숫자 카운트에 사용될 count라는 int형 변수를 추가합니다.
초기값은 0이며, Start()에서 초기화하면 될 것입니다. 그리고 OnTriggerEnter 내에서 PickUp을 만나면 count를 1 추가하는 코드를 넣습니다.
여기까지의 코드는 다음과 같습니다.
public class PlayerController : MonoBehaviour
{
public float speed;
private Rigidbody rb;
private int count;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Pick Up"))
{
other.gameObject.SetActive(false);
count += 1;
}
}
}
| cs |
이 스크립트를 저장하고 다시 유니티로 돌아갑니다.
카운트를 셀 수 있게 되었지만 아직 그것을 출력할 방법이 없습니다. 그리고 게임이 끝났을때 game over 메세지도 내보내면 좋을 것입니다.
여기서 텍스트와 숫자를 출력하는 데는 유니티의 UIToolset이 사용될 것입니다. 먼저 Hierachy 메뉴를 사용하여 새 UI Text element를 생성합니다.
그러면 계층구조에 뭔가 생각지도 않았던 것들이 여러개 생성되어 있습니다.
Canvas라는 Parent 아래 Text가 들어있고, EventSystem이라는 것도 생성되었습니다. 모든 UI element는 이 Canvas의 child여야 작동됩니다. Text를 CountText로 이름 변경하고 약간 커스터마이징 합니다.
기본 칼라는 어두운 색입니다. 이 색을 클릭하고 하얀색으로 바꿔줍니다(255,255,255). 사이즈와 정렬은 건드릴 필요가 없겠고, placeholder 텍스트를 "Count Text"로 바꿔줍니다.
우리는 이 텍스트를 게임 좌상단에 나타나도록 하고 싶습니다. 지금은 UI Text가 가운데에 있는데 Text가 부모인 Canvas의 중앙에 위치하게 되어 있기 때문입니다.
UI Element의 transform은 유니티의 다른 요소들과 다르게 Rect Transform으로 되어 있어서 anchoring, positioning등을 처리할 수 있게 되어 있습니다. 우리는 화면 좌상단에 글씨가 나오도록 할 것이므로 canvas의 중간이 아닌 좌상단에 anchoring하도록 변경하는 것이 바람직합니다. Rect Transform 하방의 사각형을 클릭하면 Anchor Presets가 나타납니다.
Shift를 누르면 앵커와 함께 피벗도 변경되고, Alt까지 함께 누르면 포지션까지 바뀝니다. 우리는 그 키를 둘다 누른채 좌상단을 선택합니다.
이제 게임뷰를 보면 글씨가 너무 좌상단에 딱 붙어 있습니다. 좀 공간을 주는 것이 좋겠습니다. CountText의 x,y포지션을 약간 변경하여 10, -10으로 바꿔줍니다.
그래도 약간 이상하므로 UI Element를 코드로 수정하겠습니다. PlayerController 스크립트를 에디터로 열어줍니다. UI를 사용하기 위해 UnityEngine.UI 네임스페이스를 using문으로 포함시킵니다.
그리고 Text타입의 변수인 countText를 선언합니다.
public Text countText;
| cs |
그리고 Start() 내부에서
countText.text = "Count: " + count.ToString();
| cs |
void SetCountText()
{
countText.text = "Count: " + count.ToString();
}
| cs |
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
public float speed;
public Text countText;
private Rigidbody rb;
private int count;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Pick Up"))
{
other.gameObject.SetActive(false);
count += 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString();
}
}
| cs |
이제 저장하고 유니티로 돌아갑니다. 코드에서 public 변수를 사용했으므로 유니티 상에서 새로운 프로퍼티가 하나 등장했습니다. Player의 인스펙터를 보면 스크립트 항목에 Count Text라는 프로퍼티가 생겨났는데 앞에서 만든 CountText를 드래그해서 연결해 줍니다.
이제 씬을 저장하고 플레이해 보면 플레이어가 큐브를 만날때마다 카운트가 하나씩 올라가는 것을 확인 가능합니다.
이제 모든 큐브를 모았을 때 메세지를 출력하고 싶습니다. 이것을 위해 새로운 UI Element를 생성합니다. 똑같은 방식으로 Create>UI>Text하고, WinText라고 이름 짓습니다. 색은 역시 흰색으로 바꿔주고, 사이즈를 크게 해줍니다. 일단 24 정도로 해봅시다. 앵커와 피벗은 가운데입니다. 그리고 가운데에서 약간 상방에 나오게 하기 위해 Y 포지션은 75로 해보겠습니다.
이제 다시 스크립트 에디터로 갑니다.
역시 winText라는 Text 타입의 필드를 하나 생성해주고, Start()내에서 빈 스트링으로 초기화합니다. 그리고 SetCountText()내에서 count가 12 이상이 되면 이겼다는 출력을 하도록 해줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
public float speed;
public Text countText;
public Text winText;
private Rigidbody rb;
private int count;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
winText.text = "";
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement*speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Pick Up"))
{
other.gameObject.SetActive(false);
count += 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString();
if (count >= 12)
{
winText.text = "You Win!";
}
}
}
| cs |
저장 후 돌아가서 WinText 프로퍼티를 연결하고 플레이해보면 큐브를 모두 다 모았을 때 "You Win!" 메세지가 나오는 것을 볼 수 있습니다.
Building the Game
이제 게임을 빌드하고 배포할 차례입니다. 유니티의 장점은 여러 종류의 플랫폼 상대로 그것이 가능하다는 것입니다.
빌드 하기 전에 일단 씬을 저장하고 메뉴에서 File>Build Settings 선택하여 빌드 세팅창을 엽니다.
현재는 PC, Mac & Linux Standalone으로 세팅되어 있습니다. 플랫폼을 바꾸고 싶으면 해당 플랫폼을 클릭하고 하단의 Switch Platform을 누르면 됩니다. 여기서는 그냥 PC용으로 빌드해볼 예정입니다.
빌드할 씬을 추가하기 위해서는 Add Open Scenes 버튼을 누르거나 씬을 직접 드래그해 넣으면 됩니다.
빌드를 위해서 프로젝트의 모든 씬을 넣어야 하는 것은 아닙니다. 게임에서 원하는 씬만 추가해주면 되고, 또는 그냥 추가하지 않은 채로 빌드해도 됩니다. 그런 경우 현재 열려있는 씬이 빌드됩니다.
이제 Build 버튼을 눌러봅니다. 그러면 저장할 위치를 묻는 창이 나타나는데 프로젝트의 루트 폴더에 Builds라는 폴더를 만들고 그곳에 Roll a Ball (PC)라는 이름으로 저장하도록 하겠습니다.
그러면 폴더 내에 exe파일과 데이터 폴더가 생성 되었습니다.
exe파일을 더블클릭하여 실행해봅니다.
설정을 묻는 창이 먼저 나타나고, Play!를 누르면
게임이 실행됩니다.
이것으로 기초 중의 기초인 Roll-a-Ball 튜토리얼을 완료했습니다.
댓글 없음:
댓글 쓰기