Menu
CoddyTech

하나의 스크립트로 게임 실행하기

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 12번째.

점수는 플레이어 스크립트에, 생명 수는 체력 스크립트에, 게임 종료 확인은 세 번째 스크립트에 넣으면 각 스크립트가 다른 스크립트의 숫자를 필요로 하므로, 새로운 규칙을 추가할 때마다 여러 파일을 수정해야 합니다. Unity 게임에서는 보통 그 숫자들을 비어 있는 별도의 GameObject에 있는 GameManager라는 하나의 스크립트에 맡깁니다. 이 스크립트가 점수, 생명 수, 게임을 끝내는 규칙을 관리합니다. 다른 스크립트는 무슨 일이 있었는지만 공개 메서드를 호출해 알립니다. 이 페널티 슛아웃에서는 골대가 골이 들어올 때마다 알립니다:

public class GameManager : MonoBehaviour
{
    private int goals;
    private int shotsLeft = 5;

    public void ShotTaken(bool scored)
    {
        if (shotsLeft == 0) return;
        shotsLeft--;
        if (scored) goals++;
        Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
        if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
    }
}
// Net.cs, 골의 트리거에서
public GameManager game;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Ball")) game.ShotTaken(true);
}

골대는 남은 슛 수나 게임이 언제 끝나는지 알지 못합니다. 골이 들어왔다는 사실만 알리고, 그 의미는 매니저가 결정합니다. 골키퍼 스크립트는 세이브를 game.ShotTaken(false)로 알립니다. 슛 3회로 슛아웃을 진행하려면 스크립트 하나에서 숫자 하나만 바꾸면 됩니다. ShotTaken 맨 위의 확인 코드는 정규 시간이 끝난 뒤 굴러 들어온 공이 득점으로 계산되는 것을 막습니다.

인스펙터에서 GameManager 오브젝트를 game 필드로 드래그해 넣으면 Unity가 해당 오브젝트에서 GameManager 스크립트를 찾습니다. 매니저는 HUD를 관리하는 곳이기도 합니다. 점수 텍스트와 게임 종료 패널을 보관하면 숫자를 변경하는 동일한 메서드에서 화면도 바뀌므로, 다른 스크립트는 UI를 건드리지 않습니다.

challenge icon

챌린지

쉬움

보석 찾기 게임입니다. 화살표 키로 Player를 움직입니다(스크립트는 준비되어 있습니다). 보석을 얻으면 points만큼 점수를 얻고, 폭탄을 맞으면 생명을 잃으며, 이 모든 것을 GameManager가 관리합니다. Inspector에서 각 보석과 폭탄의 game 필드는 이미 GameManager 오브젝트에 연결되어 있고, GameManager의 필드도 HUD와 Player에 연결되어 있습니다.

GameManager.cs에서:

  • AddScore(int points)는 점수에 score를 더하고 scoreText에 Score: 6과 같이 표시합니다.
  • LoseLife()는 lives에서 1을 빼고(시작 시 3) livesText에 Lives: 2와 같이 표시합니다.
  • lives가 0이 되면 게임이 끝납니다. gameOverPanel을 표시하고 Player 스크립트를 비활성화해 화살표 키가 더 이상 작동하지 않도록 합니다. 그 후에는 AddScore를 호출해도 아무것도 바뀌지 않습니다.

Gem.cs와 Bomb.cs에서: Player(Player 태그가 지정된)가 보석이나 폭탄에 닿으면 게임에 알립니다(보석이면 points만큼, 폭탄이면 생명 1개를 잃습니다). 그런 다음 해당 오브젝트를 제거합니다.

Play를 눌러 보석을 모으고 폭탄에 부딪힌 다음, Check를 누르세요.

직접 해보기

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text scoreText;
    public TMP_Text livesText;
    public GameObject gameOverPanel;
    public Player player;
    private int score;
    private int lives = 3;
    private bool gameOver;

    public void AddScore(int points)
    {
        // 게임이 끝나지 않았다면 점수를 더하고 새 점수를 표시한다
    }

    public void LoseLife()
    {
        // 목숨을 하나 줄이고 남은 목숨을 표시한다. 목숨이 0개가 되면 게임이 끝난다
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

실제 게임 만들기의 모든 레슨