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

[챗GPT게임개발7] ChatGPT를 활용하여 타일에 움직이는 경로 추가하기

by 인텔리노마드라이프 2024. 5. 2.
728x90

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

오늘은 ChatGPT를 활용하여 타일 경로를 추가해서 씬에서 직접 경로를 추가 또는 수정할거예요.

 

경로를 추가 하기 전에 이전 글을 잠깐 복습해요.

"[유니티게임개발5] 챗GPT를 활용하여 내가 만든 게임에 Enemy  추가하기"에서 적을 추가했어요.

 

그리고 적 이동 경로도 설정했어요.

타일에 적(Enemy)를 추가했어요.

 

Prefabs 를 선택하고 Enemy 를 타일맵 위에 놓았고

[적(Enemy) 추가]

 

타일에 있는 적(Enemy)를 이동시킬 수 있어요.

 

아래 이미지에서와 같이 PatrolPath1을 복사했고 PatrolPath1 (1)의 위치를 원하는 곳으로 이동했어요. 

[PatrolPath 를 설정해요]

 

PatrolPath1 (1)를 아래 이미지와 같이 Enemy Controller 의 Path에 추가했어요.

 

위 과정을 통해 적이 이동하는 경로를 추가할 수 있었어요.

 

잘 만들어진 Unity 예제 프로젝트를 활용해요.

이제 아래와 같이 이동 경로를 저장하는 게임오브젝트(TileMove)를 만들어요.

그리고 이 오브젝트에 Patrol Path를 추가하면 타일 이동 경로 정보 저장은 완료.

 

Enemy 를 이동시키는 스크립트를 활용해요.

지난 글에서 타일을 이동하는 스크립트를 ChatGPT를 활용해서 쉽게 만들었어요.

그리고 정상적으로 동작하는 것도 확인했어요.

using UnityEngine;

public class TileMover : MonoBehaviour
{
    public float speed = 5.0f; // 움직임의 속도
    public float distance = 10.0f; // 움직일 최대 거리

    private float startPositionX;
    private float endPositionX;
    private float leftPositionX; // Added for left movement
    private bool movingRight = true;

    void Start()
    {
        startPositionX = transform.position.x;
        endPositionX = startPositionX + distance;
        leftPositionX = startPositionX - distance; // Initialize left position
    }

    void Update()
    {
        if (movingRight)
        {
            if (transform.position.x < endPositionX)
            {
                transform.Translate(speed * Time.deltaTime, 0, 0);
            }
            else
            {
                movingRight = false;
            }
        }
        else
        {
            if (transform.position.x > leftPositionX) // Move towards the left position
            {
                transform.Translate(-speed * Time.deltaTime, 0, 0);
            }
            else
            {
                movingRight = true;
            }
        }
    }
}

 

하지만 챗GPT가 만들어준 코드는 이동 경로를 씬에서 직접 수정할 수 없으니 불편했어요.

 

그래서 Enemy 프리펩이 이동하는 것처럼 이동 경로를 지정해서 타일을 이동시키고 싶어요.

아래는 적을 이동 경로에 맞게 움직이게 하는 스크립트예요.

using System.Collections;
using System.Collections.Generic;
using Platformer.Gameplay;
using UnityEngine;
using static Platformer.Core.Simulation;

namespace Platformer.Mechanics
{
    /// <summary>
    /// A simple controller for enemies. Provides movement control over a patrol path.
    /// </summary>
    [RequireComponent(typeof(AnimationController), typeof(Collider2D))]
    public class EnemyController : MonoBehaviour
    {
        public PatrolPath path;
        public AudioClip ouch;

        internal PatrolPath.Mover mover;
        internal AnimationController control;
        internal Collider2D _collider;
        internal AudioSource _audio;
        SpriteRenderer spriteRenderer;

        public Bounds Bounds => _collider.bounds;

        void Awake()
        {
            control = GetComponent<AnimationController>();
            _collider = GetComponent<Collider2D>();
            _audio = GetComponent<AudioSource>();
            spriteRenderer = GetComponent<SpriteRenderer>();
        }

        void OnCollisionEnter2D(Collision2D collision)
        {
            var player = collision.gameObject.GetComponent<PlayerController>();
            if (player != null)
            {
                var ev = Schedule<PlayerEnemyCollision>();
                ev.player = player;
                ev.enemy = this;
            }
        }

        void Update()
        {
            if (path != null)
            {
                if (mover == null) mover = path.CreateMover(control.maxSpeed * 0.5f);
                control.move.x = Mathf.Clamp(mover.Position.x - transform.position.x, -1, 1);
            }
        }

    }
}

 

Enemy 를 움직이는 방식과 같은 스크립트로 수정해요.

원하는 형식으로 소스를 변경하고 싶어서 ChatGPT와 대화를 시작했어요.

[질문] 안녕 ChatGPT, 아래 코드(EnemyController 클래스) 를 참고해서 TileMover 클래스를 수정해줘 
using System.Collections;
using System.Collections.Generic;
using Platformer.Gameplay;
using UnityEngine;
using static Platformer.Core.Simulation;

namespace Platformer.Mechanics
{
    /// <summary>
    /// A simple controller for enemies. Provides movement control over a patrol path.
    /// </summary>
    [RequireComponent(typeof(AnimationController), typeof(Collider2D))]
    public class EnemyController : MonoBehaviour
    {
        public PatrolPath path;
        public AudioClip ouch;

        internal PatrolPath.Mover mover;
        internal AnimationController control;
        internal Collider2D _collider;
        internal AudioSource _audio;
        SpriteRenderer spriteRenderer;

        public Bounds Bounds => _collider.bounds;

        void Awake()
        {
            control = GetComponent<AnimationController>();
            _collider = GetComponent<Collider2D>();
            _audio = GetComponent<AudioSource>();
            spriteRenderer = GetComponent<SpriteRenderer>();
        }

        void OnCollisionEnter2D(Collision2D collision)
        {
            var player = collision.gameObject.GetComponent<PlayerController>();
            if (player != null)
            {
                var ev = Schedule<PlayerEnemyCollision>();
                ev.player = player;
                ev.enemy = this;
            }
        }

        void Update()
        {
            if (path != null)
            {
                if (mover == null) mover = path.CreateMover(control.maxSpeed * 0.5f);
                control.move.x = Mathf.Clamp(mover.Position.x - transform.position.x, -1, 1);
            }
        }

    }
}

[답변]
이 스크립트는 PatrolPath를 사용하여 타일이 정의된 경로를 따라 움직이도록 설정하는 것입니다. 이는 제공한 EnemyController 코드를 바탕으로 만든 것으로, 적이나 다른 오브젝트가 경로를 따라 이동하는 방식과 유사합니다.

코드 설명:

  • 컴포넌트 요구사항: 스크립트는 Collider2D 컴포넌트가 게임 오브젝트에 첨부되어 있어야 합니다. 필요한 경우 충돌 처리에 유용합니다.
  • 경로와 이동 제어: 타일은 PatrolPath를 사용하여 이동 경계를 정의합니다. PatrolPath.Mover 객체는 실제 이동 계산을 처리합니다.
  • Awake 메소드: _collider 컴포넌트를 초기화합니다.
  • Update 메소드: 매 프레임마다 path가 설정되어 있는지 확인하고, mover가 생성되지 않았다면 하나를 생성합니다(속도는 필요에 따라 조정 가능). 그리고 타일은 mover의 위치 계산에 따라 x축을 따라 이동합니다.

조정 사항:

  • 속도 조절: path.CreateMover(1.0f)에서 속도 매개변수를 조정하여 타일이 경로를 따라 이동하는 속도를 변경할 수 있습니다.
  • 수직 이동: 이 스크립트는 타일을 x축을 따라만 움직입니다. y축으로도 이동이 필요한 경우, moveX 로직을 수정하여 y축 구성 요소를 포함시킬 수 있습니다.

이 설정을 통해 타일은 지정된 경로를 따라 왕복하면서 움직일 수 있으며, 이는 순찰 패턴과 비슷합니다. 프로젝트의 구체적인 요구사항에 맞게 컴포넌트 및 값을 조정하세요.

using UnityEngine;

namespace Platformer.Mechanics
{
    /// <summary>
    /// A simple controller for moving tiles. Provides movement control over a patrol path.
    /// </summary>
    [RequireComponent(typeof(Collider2D))]
    public class TileMover : MonoBehaviour
    {
        public PatrolPath path;
        internal PatrolPath.Mover mover;
        internal Collider2D _collider;

        public Bounds Bounds => _collider.bounds;

        void Awake()
        {
            _collider = GetComponent<Collider2D>();
        }

        void Update()
        {
            if (path != null)
            {
                if (mover == null) mover = path.CreateMover(1.0f); // You can adjust the speed as necessary
                var moveX = mover.Position.x - transform.position.x;
                transform.position += new Vector3(moveX, 0, 0) * Time.deltaTime;
            }
        }
    }
}

 

 

직접 코드 한 줄 추가하지 않고 원하는 코드를 만들었어요.

 

수정된 스크립트 및 모든 변경사항을 적용했어요.

그리고 Play 버튼을 클릭하여 게임을 실행하고 타일이 제대로 작동하는지 확인했어요.

 

[움직이는 타일 수정]

원하는 결과대로 잘 적용이 되었어요.

 

챗GPT를 활용하면 원하는 코드를 쉽게 만들어요.

잘 짜여진 그리고 더 나은 방식으로 코드를 수정하는 것도 쉬워요.

챗GPT에게 원본 코드를 주고 이 코드와 같이 수정해줘 라고만 하면 되요.

 

타일과 같이 움직이는 플레이어

다시 시간에는 움직이는 타일 방향대로 플레이어도 움직이게 해볼께요.

 

[인텔리노마드라이프와 함께 행복하세요 from IntelliOneStudio ]

 

 

지금까지,

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

감사합니다.

728x90