본문 바로가기
디지털노마드

챗GPT게임개발61: Unity에서 게임 상태 관리 시스템 구현 및 활용하기

by 인텔리노마드라이프 2024. 7. 10.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

이번 시간에는 Unity에서 게임 상태 관리 시스템 구현 및 활용하기에 대해 알아볼까해요.

 

[참고] Unity에 대한 경험이 없었지만 챗GPT를 활용해서 3주만에 개발했어요. 약간의 수정은 있었지만 99% 코딩은 챗GTP가 했어요. 개발에 참고하세요.

* APP Store 에서 다운로드 

https://apps.apple.com/kr/app/%EB%86%8D%EB%B6%80%EC%9D%98-%EA%BF%88/id6479183930

 

‎농부의 꿈

‎오래된 전설이 숨겨져 있는 [농부의 꿈]목장 한구석에서 ‘비밀의 문'과 '마법 책'이 발견되었어요. [변신하는 동물들] 병아리가 합쳐져 닭이 되고, 닭이 합쳐져 고슴도치로 변신하며, 점점 더

apps.apple.com

*Google Play 에서 다운로드

https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share

 

농부의 꿈 - Google Play 앱

평화로운 목장에서 신나는 동물 합치기 무료게임 (바람, 뚫어뻥, 밧줄, 무중력 등 매직 아이템 활용해 병아리를 젖소로 키워보세요.)

play.google.com

 

Unity에서 게임 상태 관리 시스템 구현 및 활용하기를 만들어줘

아래와 같이 ChatGPT에게 질문했어요.

 ChatGPT 답변 내용 중 제가 별도로 표시한 파란색 내용을 기준으로 읽으시면 좀 더 이해가 쉽게 될거예요.

[질문] 안녕 ChatGPT, Unity에서 게임 상태 관리 시스템을 구현하려고 하는데, 어떻게 하면 될까? 구체적인 예시 코드를 포함해서 설명해줄 수 있어?

[답변]

안녕하세요! Unity에서 게임 상태 관리 시스템을 구현하는 방법을 단계별로 설명해드리겠습니다. 이 시스템은 게임의 진행 상황을 저장하고 불러오는 기능을 제공합니다. 이를 통해 플레이어는 게임을 종료했다가 다시 시작할 때 이전 진행 상황을 이어갈 수 있습니다. 아래는 두 개의 주요 스크립트인 GameState와 GameStateManager의 구현 예시입니다.

1. 게임 상태 클래스 (GameState) 구현

먼저, 게임의 상태를 저장할 GameState 클래스를 만들어야 합니다. 이 클래스는 총 점수, 현재 스테이지, 스테이지 1의 객체 상태, 스테이지 1의 클리어 여부 등을 저장합니다.

using System;
using System.Collections.Generic;

namespace LightGarden.Managers
{
    [Serializable]
    public class GameState
    {
        public int totalScore;
        public string currentStage;
        public List<ObjectState> stage1ObjectStates;
        public bool stage1Cleared;

        public GameState()
        {
            totalScore = 0;
            currentStage = "Stage1";
            stage1ObjectStates = new List<ObjectState>();
            stage1Cleared = false;
        }
    }

    [Serializable]
    public class ObjectState
    {
        public string objectName;
        public bool state;

        public ObjectState(string name, bool state)
        {
            objectName = name;
            this.state = state;
        }
    }
}


이 클래스는 게임의 상태를 저장하기 위한 데이터 모델입니다. GameState 클래스는 여러 가지 게임 상태 정보를 멤버 변수로 가지며, 기본 생성자는 초기 상태를 설정합니다. ObjectState 클래스는 특정 객체의 상태를 저장합니다.

2. 게임 상태 관리자 클래스 (GameStateManager) 구현

다음으로, GameState 객체를 관리하고 파일에 저장하거나 불러오는 기능을 하는 GameStateManager 클래스를 구현해야 합니다. 이 클래스는 싱글톤 패턴을 사용하여 게임 전체에서 하나의 인스턴스만 존재하도록 합니다.

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

namespace LightGarden.Managers
{
    public class GameStateManager : MonoBehaviour
    {
        public static GameStateManager Instance { get; private set; }
        private GameState gameState;
        private string filePath;

        private void Awake()
        {
            if (Instance == null)
            {
                Instance = this;
                DontDestroyOnLoad(gameObject);
                filePath = Path.Combine(Application.persistentDataPath, "gamestate.json");
                Debug.Log($"Game state file path: {filePath}");
                LoadGameState(); // 게임 상태를 여기서 로드
            }
            else
            {
                Destroy(gameObject);
            }
        }

        public void AddScore(int points)
        {
            gameState.totalScore += points;
            SaveGameState();
        }

        public int GetTotalScore()
        {
            return gameState.totalScore;
        }

        public void SetCurrentStage(string stageName)
        {
            gameState.currentStage = stageName;
            SaveGameState();
        }

        public string GetCurrentStage()
        {
            return gameState.currentStage;
        }

        public void SetStage1ObjectState(string objectName, bool state)
        {
            Debug.Log($"Setting stage 1 object state: {objectName} -> {state}");
            ObjectState objState = gameState.stage1ObjectStates.Find(x => x.objectName == objectName);
            if (objState != null)
            {
                objState.state = state;
            }
            else
            {
                gameState.stage1ObjectStates.Add(new ObjectState(objectName, state));
            }
            SaveGameState();
        }

        public bool GetStage1ObjectState(string objectName)
        {
            ObjectState objState = gameState.stage1ObjectStates.Find(x => x.objectName == objectName);
            if (objState != null)
            {
                return objState.state;
            }
            return false;
        }

        public void SetStage1Cleared(bool cleared)
        {
            gameState.stage1Cleared = cleared;
            SaveGameState();
        }

        public bool IsStage1Cleared()
        {
            return gameState.stage1Cleared;
        }

        private void SaveGameState()
        {
            string json = JsonUtility.ToJson(gameState, true); // 인덴트를 추가하여 보기 쉽게 저장
            Debug.Log($"Saving game state: {json}");
            File.WriteAllText(filePath, json);
            PlayerPrefs.Save();
        }

        private void LoadGameState()
        {
            if (File.Exists(filePath))
            {
                string json = File.ReadAllText(filePath);
                gameState = JsonUtility.FromJson<GameState>(json);
                Debug.Log($"Loaded game state: {json}");
            }
            else
            {
                gameState = new GameState();
                Debug.Log("No saved game state found. Starting with a new game state.");
            }
        }

        private void OnApplicationQuit()
        {
            SaveGameState();
        }
    }
}

 

이 클래스는 게임 상태를 관리하고, 이를 파일에 저장하거나 불러오는 역할을 합니다.

  • Awake 메서드: 싱글톤 인스턴스를 설정하고, 게임 상태를 저장할 파일 경로를 설정한 후, 게임 상태를 로드합니다.
  • AddScore, SetCurrentStage 등의 메서드: 게임 상태를 수정하는 메서드들입니다. 각 메서드 호출 후 SaveGameState 메서드를 호출하여 변경된 상태를 저장합니다.
  • SaveGameState 메서드: 게임 상태를 JSON 형식으로 파일에 저장합니다.
  • LoadGameState 메서드: 파일에서 게임 상태를 불러오거나, 파일이 없을 경우 새로운 게임 상태를 초기화합니다.
  • OnApplicationQuit 메서드: 애플리케이션 종료 시 게임 상태를 저장합니다.

이 시스템을 통해 플레이어는 게임을 종료한 후에도 이전 진행 상황을 유지할 수 있습니다.

스크립트 사용 방법도 알아봐요

이 스크립트는 사용하는 방법에 대해서도 물어볼께요.

[질문] 이 스크립트를 Unity 프로젝트에서 어떻게 사용하면 될까?

[답변]

이 스크립트를 Unity 프로젝트에서 사용하려면 다음 단계를 따르면 됩니다.

1. 스크립트 추가

위의 GameState와 GameStateManager 스크립트를 작성한 후, Unity 프로젝트의 Scripts 폴더에 추가합니다.

2. GameStateManager를 게임 오브젝트에 추가

GameStateManager 스크립트를 씬의 게임 오브젝트에 추가해야 합니다. 새로운 Empty GameObject를 생성하고, 이 오브젝트에 GameStateManager 스크립트를 추가합니다. 예를 들어, 아래와 같이 할 수 있습니다.

  1. Unity에서 Hierarchy 창을 열고, 우클릭하여 Create Empty를 선택합니다.
  2. 새로 생성된 GameObject의 이름을 "GameStateManager"로 변경합니다.
  3. Inspector 창에서 Add Component 버튼을 클릭하고, GameStateManager를 검색하여 추가합니다.

3. 게임 상태 관리 함수 호출

게임 상태를 저장하거나 불러오는 함수들을 게임의 적절한 위치에서 호출해야 합니다. 예를 들어, 점수를 추가할 때는 GameStateManager.Instance.AddScore(points);를 호출하고, 현재 스테이지를 변경할 때는 GameStateManager.Instance.SetCurrentStage(stageName);을 호출합니다.

public class ExampleUsage : MonoBehaviour
{
    void Start()
    {
        // 게임 시작 시 초기 설정
        GameStateManager.Instance.SetCurrentStage("Stage1");
        GameStateManager.Instance.AddScore(10);
    }

    void Update()
    {
        // 특정 이벤트 발생 시 게임 상태 업데이트
        if (/* some condition */)
        {
            GameStateManager.Instance.SetStage1ObjectState("ObjectName", true);
        }
    }
}


이러한 단계를 통해 게임 상태 관리 시스템을 Unity 프로젝트에 통합하고 사용할 수 있습니다. 이를 통해 게임 상태를 효율적으로 관리하고, 플레이어의 진행 상황을 저장할 수 있습니다.

결과는 이렇게 나와요.

챗GPT 만들어 준 코드에서 한줄의 변경도 없이 사용해서 아래 상태 정보가 관리되었어요.

{
    "totalScore": 30,
    "currentStage": "Stage1",
    "stage1ObjectStates": [
        {
            "objectName": "fish_1",
            "state": true
        },
        {
            "objectName": "mal",
            "state": true
        }
    ],
    "stage1Cleared": true
}

 

오늘은 ChatGPT를 통해서 게임 상태 관리 시스템 구현 및 활용하기에 대해 알아봤어요.

단 몇줄의 요청 사항을, 바로 적용 가능한 코드로 만드는 걸 보면 매번 놀라지 않을 수가 없네요. 

 

오늘도 활기찬 하루되세요. 

 

지금까지,

언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.

감사합니다. 

728x90