본문 바로가기
유니티/탑 다운 슈팅 게임 만들기

탑다운 슈팅 게임 만들기 #5 – 플레이어와 적의 체력 및 게임 오버 구현

by 찡사랑방 2024. 11. 12.
728x90
728x90

 

 

이번 포스팅에서는 플레이어와 적의 체력 시스템을 추가하고, 플레이어의 체력이 모두 소진되면 게임이 종료되는 게임 오버 시스템을 구현하겠습니다. 이 기능을 통해 게임의 목표를 명확히 하고, 도전 과제를 부여하여 플레이어가 게임의 종료 조건을 인지하고 즐길 수 있도록 할 것입니다.


1. 플레이어 체력 시스템 구현

먼저, 플레이어의 체력 시스템을 설정하여 적이 플레이어와 충돌할 때 체력을 감소시키도록 해보겠습니다.

1.1 PlayerHealth 스크립트 작성

  1. Assets > Scripts 폴더에서 PlayerHealth.cs 스크립트를 생성하고, 다음과 같이 작성합니다:
using UnityEngine;

public class PlayerHealth : MonoBehaviour
{
    public int maxHealth = 5; // 플레이어의 최대 체력
    private int currentHealth;

    void Start()
    {
        currentHealth = maxHealth; // 시작 시 체력 설정
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;

        if (currentHealth <= 0)
        {
            Die();
        }
    }

    void Die()
    {
        // 게임 오버 처리를 위한 함수 호출
        GameManager.Instance.GameOver();
    }
}

 

2.Player 오브젝트에 PlayerHealth 스크립트 추가

  • Player 오브젝트에 PlayerHealth 스크립트를 추가합니다.
  • maxHealth 값을 적절히 설정하여 플레이어의 체력을 조절합니다(예: 5).

1.2 적과의 충돌 시 데미지 처리

  • Enemy 오브젝트가 플레이어와 충돌할 때, 플레이어가 데미지를 받도록 설정합니다.
void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Player"))
    {
        PlayerHealth playerHealth = collision.gameObject.GetComponent<PlayerHealth>();
        if (playerHealth != null)
        {
            playerHealth.TakeDamage(1); // 적과 충돌 시 1의 데미지
        }
    }
}

 

  1. EnemyMovement 또는 EnemyHealth 스크립트에 위 코드를 추가하여, 적이 플레이어와 충돌하면 TakeDamage()를 호출해 체력을 감소시킵니다.

2. 게임 매니저 및 게임 오버 시스템 구현

플레이어가 체력을 모두 잃으면 게임 오버 화면이 나타나도록 GameManager 스크립트를 작성해봅니다.

2.1 GameManager 스크립트 작성

  1. Assets > Scripts 폴더에서 GameManager.cs 스크립트를 생성하고, 다음과 같이 작성합니다
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance; // 싱글톤 설정

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void GameOver()
    {
        // 게임 오버 화면 표시
        Debug.Log("Game Over! Restarting...");

        // 임시로 2초 후 게임 재시작
        Invoke("RestartGame", 2f);
    }

    void RestartGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); // 현재 씬 재시작
    }
}

 

2. GameManager 오브젝트 생성

  • Hierarchy 창에서 빈 오브젝트를 생성하여 GameManager로 이름을 지정하고, GameManager 스크립트를 추가합니다.
  • 게임이 종료될 때 RestartGame 메서드를 호출해 2초 후 게임을 재시작하도록 합니다.

3. 게임 오버 화면 UI 추가

플레이어에게 게임 오버 상태를 시각적으로 알리기 위해 UI 텍스트를 추가합니다.

3.1 Game Over 텍스트 추가

  1. Canvas 생성:
    • Hierarchy 창에서 UI > Canvas를 선택하여 새 캔버스를 생성합니다.
  2. Text 추가:
    • Canvas의 자식으로 UI > Text를 추가하고 이름을 GameOverText로 변경합니다.
    • 텍스트 내용을 **"Game Over"**로 설정하고, Font Size Color를 조정하여 가시성을 높입니다.
    • Rect Transform의 위치를 중앙으로 조정하고, 기본적으로 비활성화합니다.

3.2 Game Over UI 활성화 코드 추가

  1. GameManager 스크립트의 GameOver() 메서드를 수정하여 GameOverText를 활성화합니다.
public GameObject gameOverUI; // 게임 오버 UI를 연결할 필드 추가

public void GameOver()
{
    Debug.Log("Game Over! Restarting...");
    gameOverUI.SetActive(true); // 게임 오버 UI 활성화
    Invoke("RestartGame", 2f); // 게임 재시작 (임시)
}

 

2.Inspector에서 gameOverUI 필드에 GameOverText를 드래그하여 연결합니다.


4. 테스트 및 조정

  1. Play 모드로 실행
    • 플레이어가 적과 충돌할 때 체력이 줄어드는지 확인합니다.
    • 체력이 모두 소진되면 Game Over UI가 나타나고, 잠시 후 게임이 재시작되는지 확인합니다.
  2. 난이도 조정
    • 플레이어의 체력과 적의 데미지 값을 조정하여 적절한 난이도로 설정합니다.

5. 정리 및 다음 단계 예고

이번 포스팅에서는 플레이어 체력 시스템 게임 오버 시스템을 구현하여, 플레이어가 체력을 모두 소진하면 게임이 종료되는 기능을 추가했습니다. 이제 게임의 주요 구조가 완성되었습니다! 다음 포스팅에서는 게임 클리어 목표 설정  UI 최종 정리를 통해 게임을 마무리해 보겠습니다.

완성까지 얼마 남지 않았으니 끝까지 함께 가봅시다!

728x90