본문 바로가기
AI/AI활용

[ChatGPT][Unity] 간단한 게임 만들어보기 (3)

by OhEasy 2023. 4. 6.
728x90
 

[ChatGPT][Unity] 간단한 게임 만들어보기 (2)

[ChatGPT][Unity] 간단한 게임 만들어보기 (1) [ChatGPT][연습] ChatGPT만 가지고 Unity 게임 만들어 보기 일단 엄청 오래걸려 만들어본 결과물 배배배뱀 - Google Play 앱 배배배뱀! 로그라이크 던전에서 몬스터

525easy.tistory.com

이전 코드까지 잘 붙여 넣으면
가장 가까운 적을 타겟으로 하고
가장 가까운 적 방향으로 발사하는 총알을 구현할 수 있다.

근데 문제점이
적을 죽이면 바로 에러가 나온다는 점이다.


에러가 나오는 이유는 간단하다.

적이 죽어도 플레이어의 타겟이 갱신되지 않기 때문인데,

에러를 읽어야 된다.

위와 같이 질문해 주면 수정된 코드를 알려준다.

public PlayerMovement playerMovement;

void Start()
{
    player = GameObject.FindGameObjectWithTag("Player").transform;
    playerMovement = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerMovement>();
}

// ...

void OnDestroy()
{
    playerMovement.RemoveEnemy(transform);
}

생략해서 알려주긴 하는데 알려주긴 한다.

잘 쏘고 잘 맞고 잘 생성된다.

위의 움짤은 방금까지 완성된 내용 + a이다.

a 는 간단한건데,

카메라가 플레이어를 따라가도록 설정

카메라가 플레이어를 따라가도록 하는 거다.

이제 여기까지 되면

1. 프로젝트 설정: // 완료
	Unity를 열고 새 2D 프로젝트를 만듭니다.
	새 장면을 만들고 여기에 카메라를 추가합니다.
	카메라 위치를 (0, 0, -10)으로 설정하여 장면의 중앙에 오도록 합니다.
2. 플레이어 만들기:  // 완료
	플레이어용 스프라이트를 추가하고 여기에 Rigidbody2D 구성 요소를 추가합니다. 
	중력 스케일을 0으로 설정하고 스크립트를 추가하여 플레이어의 움직임을 제어합니다. 
	화살표 키 또는 WASD 키를 사용하여 플레이어를 왼쪽, 오른쪽, 위, 아래로 이동할 수 있습니다.
3. 적 추가:  // 완료
	적의 스프라이트를 만들고 여기에 Rigidbody2D 구성 요소를 추가합니다. 
	중력 스케일을 0으로 설정하고 스크립트를 추가하여 적의 움직임을 제어합니다. 
	무작위 이동을 사용하거나 적이 따라갈 경로를 설정할 수 있습니다. 
	스폰 스크립트를 사용하여 일정한 간격으로 적을 인스턴스화합니다.
4. 사격 추가:  // 완료
	플레이어의 총알에 대한 스프라이트를 만들고 총알의 움직임을 제어하는 스크립트를 추가합니다. 
	플레이어가 스페이스바 키를 누르면 총알을 인스턴스화합니다. 
	총알과 적의 충돌을 확인하고 충돌하면 적을 파괴하는 스크립트를 추가하십시오.
---------------------------------- 완료 -----------------------------------------------------
5. 점수 추가: 
	게임에 점수 카운터를 추가하고 플레이어가 적을 파괴하면 증가합니다. 
	텍스트 구성 요소를 사용하여 화면에 점수를 표시합니다.
6. 파워업 추가: 
	파워업 스프라이트를 만들고 스크립트를 추가하여 동작을 제어합니다. 
	생성 스크립트를 사용하여 임의의 간격으로 파워업을 인스턴스화합니다. 
	플레이어가 파워업을 수집하면 추가 포인트, 추가 생명 또는 강화된 무기를 제공할 수 있습니다.
7. 오디오 추가: 
	게임에 음향 효과와 배경 음악을 추가하여 플레이어의 경험을 향상시킵니다

4번까지 완료가 되었다.

이제 5번을 할 차례다.

영어로 대답하시오

여기서 사실 가져올 것은 없다.

내가 생각한 방법은

PlayManager를 만든다.

PlayManager를 만들고
PlayManager가 점수 저장 및 게임 진행 시간을 기록
게임 오버 시 게임을 다시 시작할 수 있는 기능을 부여
하는 것이다.

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

public class PlayManager : MonoBehaviour
{
    private int score = 0;
    private float timeElapsed = 0f;
    private bool gameRunning = false;

    public void IncrementScore(int amount)
    {
        score += amount;
    }

    public int GetScore()
    {
        return score;
    }

    public float GetTimeElapsed()
    {
        return timeElapsed;
    }

    public void StartGame()
    {
        score = 0;
        timeElapsed = 0f;
        gameRunning = true;
    }

    public void EndGame()
    {
        gameRunning = false;
    }

    public void RestartGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

    void Update()
    {
        if (gameRunning)
        {
            timeElapsed += Time.deltaTime;
        }
    }
}

이런 코드를 준다.

게임 오버가 되었는지를 판단하는 bool값인
gameRunning도 만들어 주었다.

위 코드 상에서 점수를 올리는 부분은

public void IncrementScore(int amount)
{
    score += amount;
}

여기다.
적이 죽었을 때 이 함수를 적당히 호출해주면 된다.

간단한 질문

일단 점수는 적당 10점으로 해놨다.

점점 부분만 보낸다.

파괴되는 함수만 달랑 보냈다.

이제 UI를 담당하는 오브젝트를 만들려고 한다.
( 전공자 아님 )

UIManager라는 녀석을 만들려고 한다.

ChatGPT가 보내준 코드다.

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

public class UIManager : MonoBehaviour
{
    public Text scoreText;
    public Text playTimeText;

    private void Start()
    {
        // Set initial text values
        SetScoreText(0);
        SetPlayTimeText(0f);
    }

    public void SetScoreText(int score)
    {
        scoreText.text = "Score: " + score;
    }

    public void SetPlayTimeText(float time)
    {
        playTimeText.text = "Play Time: " + time.ToString("F2") + " seconds";
    }
}

위 코드 중

public void SetScoreText(int score) // 점수 갱신
{
    scoreText.text = "Score: " + score;
}

public void SetPlayTimeText(float time) // 플레이 타임 갱신
{
    playTimeText.text = "Play Time: " + time.ToString("F2") + " seconds";
}

두 함수를 PlayManager와 연결 시켜준다.

구체적으로 어떤 함수에 어떤 변수를 전달해줄지 알려준다.

이전에도 마찬가지지만
스크립트를 연결 시키고 싶을 경우
원하는 기능과 전달하고자 하는 것을 명확히 알려줘야 한다.

UIManager가 없을 경우 추가하라고 명령

아래는 위 질문과 플레이 시간 관련 질문도 추가한 스크립트다.

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

public class PlayManager : MonoBehaviour
{
    private int score = 0;
    private float timeElapsed = 0f;
    private bool gameRunning = false;

    private UIManager uiManager;

    private void Start()
    {
        uiManager = FindObjectOfType<UIManager>();
    }

    public void IncrementScore(int amount)
    {
        score += amount;
        uiManager.SetScoreText(score);
    }

    public int GetScore()
    {
        return score;
    }

    public float GetTimeElapsed()
    {
        return timeElapsed;
    }

    public void StartGame()
    {
        score = 0;
        timeElapsed = 0f;
        gameRunning = true;
    }

    public void EndGame()
    {
        gameRunning = false;
    }

    public void RestartGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

    private void Update()
    {
        if (gameRunning)
        {
            timeElapsed += Time.deltaTime;
            uiManager.SetPlayTimeText(timeElapsed);
        }
    }
}

역시 위 코드도 제대로 동작하지 않는다.

이유는 gameRunning의 초기값이 false이기 때문이다.
바꿔달라고 요청한 뒤 다시 적용한다.

여기까지 완료 하면 아래와 같은 결과물이 나온다.

텍스트가 바뀐다.


Unity 2021 이후부터는 Text가 레거시로 빠져있다.

위 스크립트의 경우 Text를 사용하기 때문에

UI로 배치할 녀석은 TMP가 아니라 Legacy로 빠져있는 Text로 추가하자.

레거시로 가자

728x90

댓글