6. Unity 엔진 기본 작동법(3)

이규성·2023년 10월 17일
0

TIL

목록 보기
8/106

10/17 UI 제작과 마무리

UI (user interface)

사람과 사물 또는 시스템, 기계, 컴퓨터 프로그램 등 사이에서 의사소통을 할 수 있도록 일시적 또는 영구적인 접근을 목적으로 만들어진 물리적, 가상적 매개체를 뜻한다. 사용자 인터페이스는 사람들이 컴퓨터와 상호 작용하는 시스템이다.

점수 올라가게 하기

  • Assets-Fonts 폴더를 생성 후 사용할 폰트를 넣어준다.
  • Hierarchy-GameObject-UI-Text 추가 후 Canvas로 이름 변경
  • 필요한 텍스트들을 생성 후 Inspector에서 속성 편집
public static gameManager I;

void Awake()
{
    I = this;
}

gameManager의 싱글톤 화

rain 오브젝트와 rtan 오브젝트를 충돌시켜야하니 tag, collider를 추가

void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "ground")
    {
        Destroy(gameObject);
    }
    if (coll.gameObject.tag == "rtan")
    {
        Destroy(gameObject);
        gameManager.I.addscore(score);
    }
}

rain 스트립트에 rtan 오브젝트와 충돌 시 실행할 함수를 설정
gameManager.I.addscore(score); = gameManager의 addscore함수를 호출한다.

using UnityEngine;
using UnityEngine.UI; // text를 사용할 수 있게 해주는 유니티의 기능

public class gameManager : MonoBehaviour
{
    public GameObject rain;
    public static gameManager I;
    public Text scoreText; // UI 중 score를 계속해서 번화시키기 위해 선언
    int totalscore;

    void Awake()
    {
        I = this;
    }

    // Start is called before the first frame update
    void Start()
    {
        InvokeRepeating("makeRain", 0, 0.1f);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    void makeRain()
    {
        Instantiate(rain);
    }

    public void addscore(int score)
    {
        totalscore += score; // rain, rtan 오브젝트가 충돌하면 score를 계속해서 덧셈해준다.
        scoreText.text = totalscore.ToString(); // totalscore 값을 문자화 시켜서 UI의 score에 출력
                                                   ???.text = text를 수정함
    }
}

public Text scoreText;와 UI의 Score를 연결
Score의 텍스트가 실시간으로 수정이 된다 !

재도전 UI 만들기

  • Canvas 추가 후 Panel로 이름 변경
  • Panel 하위에 image, text 생성 후 inspector에서 속성을 편집
  • 태그 위 체크박스를 클릭하여 inactive 상태로 만들기
  • Panel에 Button 컴포넌트를 추가
float limit = 5f; // 게임 진행 시간을 5초로 초기화

void Update()
{
    limit -= Time.deltaTime; // 게임의 시간이 점점 줄어들게 한다.   
    if (limit < 0)           // 게임의 진행 시간이 0초가 된다면,
    {
        Time.timeScale = 0.0f; // 게임을 정지시킨다.
        limit = 0.0f;          // UI에 표시되는 시간을 0초로 초기화
    }
    timeText.text=limit.ToString("N2"); // UI에 표시되는 시간의 소수점 자릿수를 0.01까지
}
  • 게임 시작 시간은 5초이며 0초가 되었을 때 정지한다.
public GameObject panel; // gameManager에서 panel 오브젝트를 사용하겠다.
float limit = 5f;

void Update()
{
    limit -= Time.deltaTime;

    if (limit < 0)
    {
        limit = 0.0f;
        panel.SetActive(true); // inactive 시켰던 panel을 active 시킨다.
        Time.timeScale = 0.0f;
    }

    timeText.text = limit.ToString("N2");
}
  • 게임이 정지되면 panel 오브젝트를 화면에 띄운다.
using UnityEngine.SceneManagement;

public void retry()
{
    SceneManager.LoadScene("MainScene"); // MainScene을 로드한다.
}
  • panel을 클릭하여 게임을 재실행하기 위해 gameManager에 retry 함수를 선언
public void retry()
{
    gameManager.I.retry();
}
  • panel 스트립트를 생성 후 retry 함수를 gameManager에서 호출한다.
void Start()
{
    InvokeRepeating("makeRain", 0, 0.5f);
    initGame();
}
void initGame() // 게임 재실행 시 초기화시킬 요소들
{
    Time.timeScale = 1.0f; // 0.0f;로 정지시킨 게임을 다시 실행
    totalScore = 0; // Score를 0점으로 초기화
	  limit = 5.0f; // 시간을 5초로 초기화
}
  • 마지막으로 게임이 재실행되었을 떄 초기화가 되어야할 요소들을 초기화 시켜준다.

  • 완성 !

Feedback

역시나 많은 개념들이 한 번에 쏟아졌다.. 하지만 처음 다뤄보는 프로그램이지만 사용자의 편의성을 굉장히 중시하였다는 것이 느껴졌다. 대부분이 드래그 앤 드랍으로 작동하였고 C#에 기본적으로 제공하는 기능들 또한 굉장히 편리했다.

0개의 댓글