안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.
오늘은 ChatGPT를 활용하여 타일 경로를 추가해서 씬에서 직접 경로를 추가 또는 수정할거예요.
경로를 추가 하기 전에 이전 글을 잠깐 복습해요.
"[유니티게임개발5] 챗GPT를 활용하여 내가 만든 게임에 Enemy 추가하기"에서 적을 추가했어요.
그리고 적 이동 경로도 설정했어요.
타일에 적(Enemy)를 추가했어요.
Prefabs 를 선택하고 Enemy 를 타일맵 위에 놓았고
타일에 있는 적(Enemy)를 이동시킬 수 있어요.
아래 이미지에서와 같이 PatrolPath1을 복사했고 PatrolPath1 (1)의 위치를 원하는 곳으로 이동했어요.
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에게 원본 코드를 주고 이 코드와 같이 수정해줘 라고만 하면 되요.
타일과 같이 움직이는 플레이어
다시 시간에는 움직이는 타일 방향대로 플레이어도 움직이게 해볼께요.
지금까지,
언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.
감사합니다.
'디지털노마드' 카테고리의 다른 글
[챗GPT게임개발9] ChatGPT를 활용하여 패럴랙스 스크롤링 효과 구현 (91) | 2024.05.02 |
---|---|
[챗GPT게임개발8] ChatGPT를 활용하여 플랫폼 라이딩 구현하기 (87) | 2024.05.02 |
[챗GPT게임개발6] ChatGPT를 활용하여 유니티 움직이는 타일 만들기 (92) | 2024.05.01 |
[챗GPT게임개발5] ChatGPT를 활용하여 게임에 Enemy 추가하기 (101) | 2024.04.30 |
[챗GPT게임개발4] ChatGPT를 활용하여 타일맵(무한의 계단) 추가하기 (99) | 2024.04.30 |