[타워디펜스게임] #18. 수정사항2

치치·2025년 2월 21일
0

타워디펜스게임

목록 보기
18/18
post-thumbnail

게임 종료

  • 로비창에 게임 종료 버튼과 팝업을 만들어서 적용시키는중

  • 로비에서만 사용하는 버튼 매니저 스크립트에서 작성했다

Application.Quit() : 게임 종료 함수

유니티 에디터 내에서는 게임이 종료되었는지 확인할 수 없기 때문에, 따로 선언해주어야한다-> 에디터 모드에서 게임을 종료

 // 에디터에서 확인용
 #if UNITY_EDITOR
 UnityEditor.EditorApplication.isPlaying = false;
 #endif


문제

  • 분명 에디터 내에서 OnClick 도 제대로 적용한 상태인데, 팝업창의 버튼이 동작하지 않는다

  • 캔버스가 2개로 나누어져 있어서, 앞에 오는 우선순서 때문에 그런듯하다 Sort Order

Canvas : 버튼 (뒤로가기, 게임종료)
StageCanvas : 스테이지 버튼 (스테이지1, 스테이지1 보조 버튼, 스테이지2, 스테이지2 보조 버튼)

  • 팝업이 현재 캔버스1에 있는 상태
    -> 캔버스2에 가려져서 팝업이 클릭되지 않는다

  • 그래서 팝업을 캔버스2로 보냈다
    -> 따로 놔두고 sort order를 조정하니까 캔버스1이 앞에오면 스테이지가 안보여지고, 반대로 하면 팝업이 안보여짐



리플레이 (씬 리로드)

  • 게임씬의 ButtonManager 스크립트 쪽에서 리플레이 누르면 게임 씬 리로드

SceneManager.LoadScene("GameScene");

  • 게임 재시작 버튼을 누르거나 로비창에서 다시 스테이지를 누르려고 하면 씬이 재시작 되야함 -> 씬 다시 로드 하기
    -> 스테이지가 클리어 되었는지 확인하기 위한 PlayerPrefs 사용?? 할 필요없을지도
    -> 왜냐하면, 스테이지가 클리어 되었더라도 어차피 또 플레이할 수 있다(저장될 정보가 없기 때문에 바로 리로드 해도된다)


할당


  • 만들고 있는 게임에 UI에 저장될 만한 요소가 없기 때문에 (ex)점수, 랭킹
    그냥 씬 리로드로 씬을 초기화하는 게 제일 낫다고 생각했다
  • 다시 리로드 되고 timescale이 0이면 멈춰있는 상태기 때문에 1로 설정


스테이지 오픈

  • GameResult 스크립트에서 만약, 게임 클리어 창이 뜰 경우, 잠금 해제 하고싶다
    최초로만

  • PlayerPrefs을 사용하였다 -> 씬을 이동해도 정보가 저장되어있다

제일 하기 싫었던 실수를 해버렸다... C#의 컴파일 순서 ㅠㅠㅠㅠㅠㅠㅠ
스크립트 내에서만 계속 값을 바꾸고 에디터에서 바꾸지 않았다,,,, 에디터를 우선적으로 하기 때문에 계속 currentStage가 0으로 잡혔음

  • 맨 처음 스테이지는 0번째, 클리어 하면 1번째 스테이지가 열려야함
    save도 1번째 스테이지가 저장되야함

계속 디버그 찍으면서 확인했다 ,,



StageLock 스크립트

  • 장된 키 값을 받아오고, 그 키값을 제외한 뒤의 버튼 컴포넌트들의 상호작용을 비활성화한다

ex)
1. 현재 스테이지0
2. 플레이 하고 있는 스테이지1
3. 스테이지1을 클리어하면 PlayPrefs에 스테이지1 저장
4. 스테이지1 이후의 스테이지들은 잠금

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class StageLock : MonoBehaviour
{
    [SerializeField] Button[] buttons;

    // 현재 스테이지 번호
    public int stage = 0;

    private void Awake()
    {
 
        // 패널의 자식 게임 오브젝트들의 버튼 컴포넌트 가져오기
        // 버튼 배열
        //buttons = GetComponentsInChildren<Button>();

        // 현재 클리어 한 키값 가져오기
        stage = PlayerPrefs.GetInt("StageReached");

        Debug.Log("Loaded Stage: " + stage); // 로드된 스테이지 값 출력

        // 스테이지들의 버튼 컴포넌트 비활성화
        for (int i = stage + 1; i < buttons.Length; i++)
        {
            buttons[i].interactable = false;
        }
    }

}


GameResult 스크립트 - victory()

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameResult : MonoBehaviour
{
    [SerializeField] GameObject ClearPanel;

    [SerializeField] GameObject LosePanel;

    public int currentstage; // 현재 스테이지 번호


    // 첫 셋팅 비활성화
    private void Awake()
    {
        ClearPanel.SetActive(false);
        LosePanel.SetActive(false);

        currentstage = 1;

    }

    // 승리 패널이 나왔을 경우, 다음 스테이지 오픈
    public void Victory()
    {
        ClearPanel.SetActive(true);

        PlayerPrefs.SetInt("StageReached", currentstage); // 키값과 현재 스테이지 번호 저장
        PlayerPrefs.Save(); // 저장된 데이터를 실제 파일에 저장

        Debug.Log("Saved Stage: " + currentstage); // 현재 저장된 스테이지 출력

        // 다음 스테이지로 증가
        currentstage++;
    }

    public void Lose()
    {
        LosePanel.SetActive(true);
    }
}


PlayPrefs 주의점

  • 씬을 이동하거나, 게임을 종료해도 정보가 그대로 저장되어 있다

  • 정보를 계속 저장해둘만한 요소에 사용하면 좋을듯 ex) 점수, 랭킹, 재화

  • but, 우리 스테이지는 2개 뿐이기 때문에 게임을 종료하면 스테이지가 다시 초기화 되도록 할것이다
    -> TitleScene에서 시작할때, PlayPrefs 초기화 진행

TitleScene에서 가장 먼저 실행되는 Awake함수에 정의해둠



Particle System

TitleScene이 허전한 거 같아서 Particle System을 사용하여 눈 내리는 효과를 만들었다

참고 : 눈내리는 효과 - 파티클 시스템 https://learnandcreate.tistory.com/2648

  • 파티클 시스템은 기본적으로 3D지만, 우리는 2D기 때문에 임의로 조정해야한다

  • 나는 카메라를 조정하여 눈내리는 곳에 카메라를 맞췄다

  • 그리고 현재 카메라가 UI와 파티클 시스템을 동시에 보기 하기 위해서 캔버스에 메인 카메라 할당

profile
뉴비 개발자

0개의 댓글