https://mozartnt.tistory.com/74
Unity 에서 Cursor AI를 활용해 게임 기능을 쉽게 구현해 보기 (1)
오늘은 Cursor AI를 활용해서 Unity로 게임을 만드는 코드를 인공지능에게 맡겨보도록 하자. 최근 수 많은 인공지능의 발전으로 코드의 오류를 잡고 기능을 구현할 때 많은 LLM을 사용하는데
mozartnt.tistory.com
지난 글에 이어서 이번에는 Cursor AI를 설치하고 연동 한 이후 게임 내의 기능 구현 코드를 Cursor AI에게 맡겨보고 어느 정도의 퀄리티의 기능 구현이 가능한지 살펴보도록 하자.
현재 테스트 해볼 프로젝트는 테스트를 위해서 임시로 만들었고 모바일 디펜스 게임과 비슷한 형태로 만들기 위해서 잡몹들이 수시로 스폰되는 구조를 가지고 있다.
여기에 Cursor를 이용해 캐릭터의 이동과 관련된 스크립트를 구현해 보려고 한다.
보통 캐릭터의 이동을 구현할때는 캐릭터 스크립트에 Update() 쪽에서 Move()와 관련된 함수를 만들고, 해당 Move 함수 내에서 키보드의 Input 값을 입력 받아 속도와 벡터 값을 지정하고 이동시키게 된다.
혹은 최근 Unity에서 지원하는 기능인 Character Controller 컴포넌트를 활용해 이동을 구현하는 것도 가능하다.
하지만 이번 글에서는 우리가 직접 Move와 관련된 기능을 구현하지 않고 코드는 전적으로 Cursor에게 지시사항만 내려서 한번 구현해 보자.
LLM에게 지시사항을 내릴때 가장 중요한 것은 원하는 결과 값을 출력하기 위해 프롬프트*를 명확하게 작성해야 한다.
완성도 있는 프롬프트를 작성해야 한다면 고려해야 할 프롬프트 기획, 제작, 테스트의 과정이 있고 이를 프롬프트 엔지니어링 이라고 한다.
이에 관한 자세한 사항은 추후에 블로그에 프롬프트와 관련된 글을 포스팅해서 다뤄보도록 하겠다.
(프롬프트란? : AI 모델에서 출력을 생성하기 위해 입력하는 텍스트)
https://mozartnt.tistory.com/76
프롬프트 엔지니어링(Prompt Engineering)이란?
프롬프트 엔지니어링이란? 프롬프트는 AI에게 질문이나 요청을 전달하는 명령문 또는 입력 텍스트를 의미한다.프롬프트 엔지니어링은 AI나 LLM에게 최적의 결과물을 만들어 내도록 유도하는
mozartnt.tistory.com
현재 Cursor에게 플레이어 이동 관련 코드를 구현시키기 위해 프롬프트에서 중점적으로 신경써야 할 부분은 크게 세 가지로 분류된다.
- 명확한 지시사항
- 목적 지향성
- 구조화된 프롬프트
LLM에게 지시문을 줄때 초등학생도 이해할 수 있는 정도로 해야 할 일을 명확하게 지시하라는 격언이 있다.
명확한 프롬프트는 정량화 된 훌륭한 결과물을 지속적으로 LLM에게 받아낼 수 있으니 LLM을 자주 사용하는 사람이라면 프롬프트 작성에 대해서도 공부해 두면 아주 유용하다.
프롬프트를 구조화 하고 나눠주는 방법에는 여러가지 방법이 있다. (Instruction, Context, User Input, Rules, Output Examples 등)
프롬프트의 목적에 따라 구조화 하는 방법도 다르고 싱글턴과 멀티턴*인지에 따라 다르다.
현재 프롬프트에서는 이동을 "W", "A", "S", "D" 로 구현해달라고 부탁했고, 관련 변수들은 직접적인 숫자가 아니라 따로 선언해서 추후에 사용이 가능하도록 설계했다.
그 외에도 당장 생각나는 필요한 사항들을 별도의 Rules로 분류해서 지시하였다.
위와 같이 작성한 프롬프트를 Player에 오브젝트에 연결시켜 동작시켜 보자.
(싱글턴과 멀티턴 : 사용자와 LLM과의 대화 주기를 뜻한다. 싱글 턴은 단일 주기의 대화, 멀티 턴은 다중 주기, 즉 여러 번에 걸친 상호작용을 의미한다)
Cursor가 위와 같은 코드를 구현했다.
이를 내가 만든 캐릭터 관련 GameObject에 부착하고 그대로 실행해보자.
실행 후 다음과 같은 에러가 발생했다.
물론 우리는 스크립트에 작성한 Rigidbody가 참조할 Component를 GameObject에 달아주지 않아서 발생한 문제임을 알고 있지만 이러한 문제도 Cursor에게 해결 하라고 요청해보자.
이렇게 Cursor가 두 가지 해결법을 제시해 주었다.
위의 해결법은 우리가 직접 GameObject에 RigidBody Component를 추가하고 해당 RigidBody 세팅을 어떻게 하면 좋을지 까지 상세하게 알려주는 모습이다.
그리고 아래의 해결법은 만약 GameObject에 Rigidbody Component가 달려 있지 않아도 Awake문에서 Rigidbody에 해당하는 변수인 rb값이 null이라면 AddComponent 함수를 실행해서 게임 시작시 자동으로 추가시키는 방법까지 제시해 주는 모습이다.
나는 RigidBody의 특정 값을 내가 어느정도 조작하고 싶으므로 Cursor가 제시한 첫번째 방법에 따라 컴포넌트를 추가해주고 다시 실행해보자.
이동 자체는 훌륭하게 구현했지만 문제는 3D게임에서 이동에 관련해서 조금 더 자세하게 프롬프트를 작성하지 않아서 발생했다.
"W", "A", "S", "D" 키로 각각 상하좌우로 이동하는 방식을 구현해 달라고 요청했지만 3D게임에서 X 좌표와 Y 좌표, 그리고 Z 좌표중 어느 좌표를 기준으로 상하좌우로 이동할지 내가 명확하게 지시하지 않았다.
따라서 위와 같이 Y축으로 위로 솟는 느낌으로 이동이 구현되어 버렸고 이를 다시 조정할 필요성이 느껴졌다.
다음과 같이 코드를 수정할 것을 제안해 주었고, 예상한대로 Y 좌표를 이동하던 상하의 이동 방식을 Z 좌표로 변경했다.
이에 따라 Cursor가 기존에 사용하던 Vector와 RigidBody는 모두 3D로 변경해 주었고
수정 후에 아까 추가했던 RigidBody 2D 역시 일반 RigidBody로 변경해야 하는 오류가 똑같이 발생했고 이 문제 역시 질문 후 해결했다.
해당 문제까지 수정 후에 캐릭터 이동 기능이 다음과 같이 구현되었다.
이동 기능은 애니메이션이 어색하긴 하지만 그런대로 구현이 되었다.
마지막으로 몬스터와 캐릭터가 충돌하면 몬스터가 작아지면서 사라지는 코드를 Cursor에게 구현하라고 요청해보자.
현재 Monster가 Spawn 될때, 기존의 코드는 플레이어의 좌표를 실시간으로 추적해서 따라오는 것이 아니라 맵의 중앙 위치인 Vector3.Zero라는 절대 좌표쪽으로 이동하고 있다.
이 이동 방식을 플레이어를 추적하도록 변경 해주자.
플레이어의 태그만 잘 변경해 주면 큰 문제 없이 잘 작동한다.
추적 까지는 이상 없이 잘 구현 되었다, 이제 몬스터가 사라지는걸 구현 해보자.
DestroyMonster에 해당하는 코루틴*을 Cursor가 구현 했고
이 코루틴은 내가 미리 만들어 둔 몬스터가 스폰될때의 코루틴을 참고해서 어색하지 않게 비슷한 방식을 구현했다.
코루틴이란? : 시간에 따른 점진적인 변화나 지연 실행을 위해 사용하는 함수
스폰 관련 코루틴 에서는 Start를 0에서 원래의 localScale.x값까지 커지는 방식을 사용했는데
Cursor는 이 코드의 start 변수를 기존 localScale.x로, end 값을 0으로 사용해서 자연스럽게 구현했다.
위 사항을 언급하니 자연스럽게 Scale과 관련된 기능을 분리해서 리팩토링 해주었고, 생각보다 훨씬 더 훌륭하게 Cursor가 작업을 완료했다.
해당 기능이 큰 문제 없이 수행 되는 것을 확인했다.
여기까지가 Cursor를 이용해서 간단하게 플레이어의 이동 및 Monster 파괴를 구현해 보았다.
사실 이동과 Monster 파괴는 Unity를 다뤄본 사람이라면 간단하게 구현할 수 있는 부분이지만 이렇게 AI를 이용해서 구현할 수 있다면 초보자도 Unity를 사용해서 꽤나 그럴싸한 기능과 게임을 완성도 있게 구현할 수 있겠다고 생각했다.
당연히 Unity 전문가의 입장에서도 Cursor를 사용하면 코드의 기능 분리 및 리팩토링에서 시간을 상당히 절약할 수 있고, Unity 전반적인 기능을 어느 정도 학습한 상황에서 Cursor를 사용한다면 훨씬 더 효율적인 기능 구현 및 코드 작성이 가능할 거라고 생각된다.
Unity를 이용해서 게임을 만들고 싶지만 코드가 너무 어렵다면 Cursor AI의 도움을 받아서 Unity를 다뤄 보는것을 강력 추천한다!
'Unity' 카테고리의 다른 글
Unity에서 Firebase를 이용해 실시간으로 DB를 연동해보기 (1) (1) | 2025.02.04 |
---|---|
Unity 에서 Cursor AI를 활용해 게임 기능을 쉽게 구현해 보기 (1) (15) | 2024.11.01 |
Unity [디자인 패턴] - 싱글톤 패턴 (0) | 2024.08.07 |
Unity [디자인 패턴] - 디자인 패턴이란? (0) | 2024.08.07 |
Unity - 물리 엔진(RigidBody, Collider) (2) | 2024.07.22 |