본문 바로가기
AI/AI활용

[ AI로 게임 만들기 ][ GPT3.5 ] 01_프로토타이핑 - Unity 적용 1

by OhEasy 2024. 4. 2.
728x90

 

이전 글은 아래 링크 참조
프로젝트 완료 시 GitHub 주소 공개 예정

https://525easy.tistory.com/72

1. 작업 내용 - 프로토타이핑 - 모험 씬 기능 제작

GPT가 제공해 준 작업 순서는 다음과 같다. 기니까 접어둔다.
(복붙 시 번호가 안붙는 상황이 나와서 내용 복붙 후 번호만 붙임)

더보기

1. 컨셉 및 디자인 단계:
게임의 핵심 메커니즘 및 재미 요소를 결정합니다.
게임의 세계관, 스토리, 캐릭터, 백그라운드 등을 설계합니다.

2. 프로토타이핑:
기본적인 게임 메커니즘을 구현한 프로토타입을 만듭니다.
플레이어의 움직임, 환경 상호작용, 기본 적과의 전투 등을 구현합니다.

3. 2D 아트 및 애니메이션 제작:
캐릭터, 배경, 아이템 등에 필요한 2D 그래픽을 디자인합니다.
필요한 애니메이션을 만들어 캐릭터 및 게임 요소에 적용합니다.

4. 레벨 디자인:
탐험 가능한 세계를 설계합니다.
던전, 지형, 비밀 통로 등을 배치하고 연출합니다.

5. 게임 로직 구현:
플레이어의 조작, 아이템 사용, 적과의 전투, 퀘스트 시스템 등의 게임 로직을 프로그래밍합니다.

6. 생성형 AI 구현:
생성형 AI를 사용하여 매번 새로운 지형, 던전, 아이템을 생성하는 시스템을 구현합니다.

7. 사운드 및 음악 추가:
게임 플레이에 필요한 효과음과 배경 음악을 추가합니다.

8. 테스트 및 디버깅:
게임의 오류를 찾고 수정하며, 균형을 맞추기 위해 게임을 반복해서 플레이합니다.

9. 최적화 및 마무리:
게임의 성능을 최적화하고 필요한 추가 기능을 구현합니다.
게임을 출시할 준비를 마치고 마무리 작업을 진행합니다.

10. 출시 및 마케팅:
게임을 적절한 플랫폼에 출시하고, 마케팅을 통해 게임을 홍보합니다.
플레이어들의 피드백을 수집하고 게임을 업데이트하여 지속적으로 향상시킵니다.

  • 이전 글에서 AdventureScene의 스크립트를 어느정도 제작 하였다.
  • 어느정도라는 뜻은... 안돌아 갈 것이 뻔하기 때문
  • 이번 글에서는 제작해 둔 스크립트를 실제 Unity에 적용하는 과정을 다룬다.

2. 기본 적용

1) 오브젝트 생성

  • AdventureScene이라는 Scene를 만들어준다.
  • 그 뒤 AdventureScene, GameManager, UIManager를 만들어준다.
  • 스크립트를 다 만들었다고 일단 오브젝트 만들면 안된다. 스크립트 좀 봐야된다.

AdventureScene의 Start함수

  • UIManager와 GameManger를 찾는 부분이 보인다. 저래서 일단 2개는 필수로 만들어야 한다.
    • 안그러면 에러 남
  • 그 뒤 SelectDungeon 함수와 ExploreDungeon 함수를 봐봐야 한다.

  • SelectDungeon 함수는 별게 없어보이는데 ExploreDungeon의 경우 필요한 작업들이 많을 것 같다.
  • 플레이어를 일단 만들고... 던전에서 적도 생성시키고... 그러면 적은 또 플레이어를 추격 해야된다.
  • SelectDungeon 먼저 확인해본다.

GameManager의 GetDungeon

  • UIManager와 GameManager에 위와 같이 에러에 대한 처리도 되어 있다.
  • ExploreDungeon을 주석처리하고 돌려본다.

GameManager에서 출력 시킨 에러 내용

  • 에러에 대한 처리가 나오고 나머지는 에러가 없다.
  • 정상적으로 돌아가게 만들어야 한다.

2) UI 생성 및 스크립트 수정

void Start()
    {
        // 각 클래스의 인스턴스 생성
        dungeon = new Dungeon();
        player = new Player();
        uiManager = FindObjectOfType<UIManager>(); // UIManager는 Scene에 단 하나만 존재한다고 가정
        gameManager = FindObjectOfType<GameManager>(); // GameManager는 Scene에 단 하나만 존재한다고 가정

        // 던전 선택
        SelectDungeon();

        // 던전 탐색 시작
        ExploreDungeon();
    }

    // 던전 선택 기능
    private void SelectDungeon()
    {
        // 던전 선택 UI 표시 및 사용자 입력 받기
        uiManager.DisplayDungeonSelectionUI();
        int selectedDungeonIndex = uiManager.GetSelectedDungeonIndex();

        // 선택된 던전 정보를 가져와서 설정
        dungeon = gameManager.GetDungeon(selectedDungeonIndex);
    }

    // 던전 탐색 기능
    private void ExploreDungeon()
    {
        // 플레이어 위치 설정
        player.SetPosition(dungeon.GetRandomStartPosition());

        // 던전 내의 적 생성
        dungeon.SpawnEnemies();

        // 플레이어 상태 표시
        uiManager.DisplayPlayerStatus(player);

        // 플레이어가 던전을 탐험하는 동안 지속적으로 업데이트
        StartCoroutine(ExploreCoroutine());
    }
  • Start 함수를 보면...
  • 고를 틈도 없이 골랐다 하고 던전을 셋팅하고 있다. 뭔가 많이 이상하다.

고쳐라 무급 노예

  • 일단 고쳤다 한다. 복붙하고 유니티에서 시작을 돌려본다.
  • 아무것도 안나온다. 아무것도 안나와서 사진을 안넣는다. 그래서 AdventureScene 스크립트를 올린다.
더보기
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class AdventureScene : MonoBehaviour
    {
        private Dungeon dungeon;        // 던전 클래스 인스턴스
        private Player player;          // 플레이어 클래스 인스턴스
        private UIManager uiManager;    // UI 매니저 클래스 인스턴스
        private GameManager gameManager;// 게임 매니저 클래스 인스턴스

        private bool isDungeonSelected; // 던전 선택 여부를 나타내는 변수

        void Start()
        {
            // 각 클래스의 인스턴스 생성
            player = new Player();
            uiManager = FindObjectOfType<UIManager>(); // UIManager는 Scene에 단 하나만 존재한다고 가정
            gameManager = FindObjectOfType<GameManager>(); // GameManager는 Scene에 단 하나만 존재한다고 가정

            // 초기화
            isDungeonSelected = false;

            // 던전 선택 대기
            StartCoroutine(WaitForDungeonSelection());
        }

        // 던전 선택을 대기하는 코루틴
        private IEnumerator WaitForDungeonSelection()
        {
            // 던전 선택 UI 표시 및 사용자 입력 받기
            uiManager.DisplayDungeonSelectionUI();

            // 던전이 선택될 때까지 대기
            while (!isDungeonSelected)
            {
                yield return null;
            }

            // 던전 탐색 시작
            ExploreDungeon();
        }

        // 던전 선택 기능
        public void SelectDungeon(int selectedDungeonIndex)
        {
            // 선택된 던전 정보를 가져와서 설정
            dungeon = gameManager.GetDungeon(selectedDungeonIndex);
            isDungeonSelected = true;
        }

        // 던전 탐색 기능
        private void ExploreDungeon()
        {
            // 플레이어 위치 설정
            player.SetPosition(dungeon.GetRandomStartPosition());

            // 던전 내의 적 생성
            dungeon.SpawnEnemies();

            // 플레이어 상태 표시
            uiManager.DisplayPlayerStatus(player);

            // 플레이어가 던전을 탐험하는 동안 지속적으로 업데이트
            StartCoroutine(ExploreCoroutine());
        }

        // 던전 탐험 코루틴
        private IEnumerator ExploreCoroutine()
        {
            while (!gameManager.CheckDungeonCompletion())
            {
                // 전투 시스템 관리
                ManageCombatSystem();

                yield return null; // 한 프레임 대기
            }

            // 던전 완료 시 보상 제공
            ProvideReward();
        }

        // 보상 제공 기능
        private void ProvideReward()
        {
            // 보상 아이템 획득
            Item rewardItem = dungeon.GetRewardItem();
            player.AddItemToInventory(rewardItem);

            // 보상 UI 표시
            uiManager.DisplayRewardUI(rewardItem);

            // 경험치 획득
            int experienceEarned = dungeon.GetExperienceReward();
            player.AddExperience(experienceEarned);
        }

        // 플레이어 사망 처리 기능
        private void PlayerDeath()
        {
            // 플레이어 사망 시 게임 오버 처리 등을 구현합니다.
            // 예를 들어, 게임 오버 UI를 표시하거나 게임을 재시작할 수 있습니다.
        }

        // 전투 시스템 관리
        private void ManageCombatSystem()
        {
            // 적과의 전투를 관리합니다.
            // 플레이어와 적의 공격, 피격 처리 등을 수행합니다.
        }

        // 아이템 사용 기능
        private void UseItem()
        {
            // 플레이어가 아이템을 사용하는 동작을 처리합니다.
            // 사용할 아이템을 선택하고, 그에 맞는 효과를 적용합니다.
        }

        // 플레이어 상태 표시 기능
        private void DisplayPlayerStatus()
        {
            // 플레이어의 상태를 UI에 표시합니다.
            // 예를 들어, 체력, 마나, 경험치 등을 표시할 수 있습니다.
        }

        // 플레이어가 던전을 선택하고 탐험하는 동안 지속적으로 업데이트
        void Update()
        {
            // 던전이 선택되지 않았다면 업데이트하지 않습니다.
            if (!isDungeonSelected)
                return;

            // 던전이 완료되지 않았다면
            if (!gameManager.CheckDungeonCompletion())
            {
                // 던전 탐험 중이므로 플레이어 상태 표시 업데이트
                DisplayPlayerStatus();

                // 던전 탐험 중이므로 아이템 사용 가능
                if (Input.GetKeyDown(KeyCode.I))
                {
                    UseItem();
                }
            }
        }
    }
  • UIManager를 확인해 봐야 한다.

없으니 안뜨는거다.

  • UI를 만들어줘야 한다.

  • 우선 함수를 만들고

  • 뭐 하라는대로 해주긴 하겠지만
  • 함수를 보면 어떻게 선택하는지는 없음
  • 하지만 선택하지 않고 랜덤으로 가는 것도 재미지 않을까 싶어서 냅둔다.

까라는대로 까준다.

  • 하라는대로 만들어줬다.

텍스트인데 어케 고르누

  • 뭔가 뜨긴 뜨는데 10초 제한 시간인 부분도 보이면 좋을 것 같다.

멋을 모르는 녀석이다

  • 텍스트로 나타내는 것이 구리긴 하지만 디테일은 추 후에 작업 하는 쪽으로 한다.

  • 현재 남은 시간이 0초가 되더라도 아무 일도 일어나지 않는다.
  • UIManager가 선택이 완료 되면 AdventureScene에게 완료 되었다고 알려주는 부분이 누락 되어 있기 때문이다.

꼽주기

  • 꼽을 준다.
  • ChatGPT를 예전에 쓸때와 다른 점이 있다면 [ 이어서 작성하기 버튼 ]이 생겼다는 점이다.
  • AdventureScene과 UIManager 모두 수정해주었다.

시간 종료 뒤 에러

  • 뭔가 진행이 되었다 해당 에러 로그를 타고 들어가봐야 한다.

AdventureScene의 ExploreDungeon

  • 로그를 확인해보니 [ 던전 선택 ] -> [ 던전 탐색 ]으로 전이 된 것은 확인할 수 있었다.
  • [ 던전 탐색 ]의 경우 Player와 Dungeon, Enemy의 추가 작성이 필요하기 때문에 다음 글에서 이어서 작성한다.
728x90

댓글