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

[챗GPT게임개발30] GPT-4, GPT-4o 활용해서 플레이어의 총알 발사 애니메이션 적용하기(1)

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

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

오늘은 GPT-4, GPT-4o 활용해서 플레이어의 총알 발사 애니메이션 적용 중 총알을 발사할때 필요한 플레이어의 동작 애니메이션을 추가해볼께요.

[오늘의 목표] GPT-4, GPT-4o 활용해서 플레이어의 총알 발사 애니메이션 적용(1)
1. 플레이어 총알 발사 애니메이션 클립 만들기
2.플레이어 총알 발사 이벤트 스크립트 만들기
3.실행하고 확인하기

 

 ChatGPT 답변 내용 중 제가 별도로 표시한 파란색 내용을 기준으로 읽으시면 좀 더 이해가 쉽게 될거예요.

 

플레이어 총알 발사 애니메이션 클립을 만들어요

먼저 플레이어가 총알을 발사하는 애니메이션 클립을 만들어볼께요. 

만드는 방법은 아래 글을 참고해요.

2024.04.19 - [디지털노마드] - [5분개발] ChatGPT를 활용하여 캐릭터 애니메이션 만들기

 

[5분개발] ChatGPT를 활용하여 캐릭터 애니메이션 만들기

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.오늘은 ChatGPT를 활용하여 캐릭터 애니메이션을 만들어볼께요.이미지 파일을 이용해서  캐릭터 대기(Idle) 상태 애니메이션 만들기이번에는

intellinomadlife.tistory.com

 

이제 아래와 같이 PlayerShooting 애니메이션 클립을 완성했어요.

[애니메이션 클립 완성]

 

플레이어가 총알을 발사할 때 사용할 이벤트 스크립트를 만들어요

아래 스크립트를 만들기 전에 애니메이터에 2가지 변수를 만들어야해요.

 

[PlayerShooting 스크립트]

using static Platformer.Core.Simulation;
using Platformer.Core;
using Platformer.Mechanics;
using UnityEngine;

namespace Platformer.Gameplay
{
    /// <summary>
    /// Fired when the player initiates a shooting attack.
    /// </summary>
    public class PlayerShooting : Simulation.Event<PlayerShooting>
    {
        public PlayerController player;

        public override void Execute()
        {
            if (player.jumpState == PlayerController.JumpState.InFlight || 
                player.jumpState == PlayerController.JumpState.Jumping || 
                player.jumpState == PlayerController.JumpState.WallJumping)
            {
                // 점프 중인 경우
                player.animator.SetTrigger("jumpShoot");
            }
            else
            {
                // 점프 중이 아닌 경우
                player.animator.SetTrigger("shoot");
            }
            player.attackState = PlayerController.AttackState.Idle;
        }
    }
}

 

아래는 코드에 대한 설명이니 참고해요.

[코드에 대한 설명] 

PlayerShooting 클래스는 플레이어가 발사 공격을 시작할 때 발생하는 이벤트를 처리합니다. 이 클래스는 다음과 같은 기능을 수행합니다:

  • 발사 애니메이션 트리거: 플레이어가 점프 상태인지 아닌지를 확인하고, 각각의 경우에 맞는 애니메이션 트리거(jumpShoot 또는 shoot)를 설정합니다.
  • 공격 상태 업데이트: 발사 후 플레이어의 공격 상태를 Idle로 설정합니다.

주요 기능

  • 발사 애니메이션 트리거:
    • 점프 중이면 jumpShoot 애니메이션을 트리거.
    • 점프 중이 아니면 shoot 애니메이션을 트리거.
  • 공격 상태 업데이트:
    • 발사 후 플레이어의 공격 상태를 Idle로 설정.

이 클래스는 플레이어가 발사 공격을 할 때 적절한 애니메이션을 실행하고 공격 상태를 관리합니다.

 

플레이어 스크립트에서 이벤트 스크립트를 처리해요

이제 다음의 코드를 만들고 Update() 함수에 추가해요.

if (Input.GetButtonDown("Fire2") && attackState == AttackState.Idle)
                {
                    attackState = AttackState.PreparingAttack;
                    var shootEvent = Schedule<PlayerShooting>();
                    shootEvent.player = this;
                }

 

[코드에 대한 설명] 

이 코드는 플레이어가 특정 조건을 만족할 때 발사 공격을 실행하는 부분입니다. 주요 기능을 단계별로 설명하면 다음과 같습니다:

  1. 입력 감지:
    • Input.GetButtonDown("Fire2")는 사용자가 "Fire2" 버튼을 눌렀는지 확인합니다. Unity에서 "Fire2"는 기본적으로 마우스 오른쪽 버튼이나 특정 키로 매핑됩니다. ("s" 키로 매핑)
    • 이 조건이 참이면 사용자가 발사 버튼을 눌렀다는 의미입니다.
  2. 공격 상태 확인:
    • attackState == AttackState.Idle는 플레이어의 공격 상태가 Idle(공격 대기 상태)인지 확인합니다. 즉, 플레이어가 다른 공격을 수행하지 않고 있는 상태인지를 확인합니다.
    • 이 조건이 참이면 플레이어가 현재 다른 공격을 수행하고 있지 않다는 의미입니다.
  3. 공격 상태 업데이트:
    • attackState = AttackState.PreparingAttack는 플레이어의 공격 상태를 PreparingAttack으로 변경합니다. 이는 플레이어가 발사 공격을 준비 중임을 나타냅니다.
  4. 발사 이벤트 스케줄링:
    • var shootEvent = Schedule<PlayerShooting>();는 새로운 PlayerShooting 이벤트를 스케줄링합니다. 이 이벤트는 플레이어의 발사 공격을 처리합니다.
    • shootEvent.player = this;는 이 이벤트가 실행될 때 어떤 플레이어가 발사 공격을 수행하는지 지정합니다. 여기서 this는 PlayerController 인스턴스를 참조합니다.

요약

이 코드는 플레이어가 "Fire2" 버튼을 눌렀고 현재 공격 상태가 Idle인 경우, 공격 상태를 PreparingAttack으로 업데이트하고, PlayerShooting 이벤트를 스케줄링하여 발사 공격을 수행하도록 합니다.

 

PlayerController 스크립트 내 Update() 함수에 추가했어요.

protected override void Update()
        {
            if (controlEnabled)
            {
                move.x = Input.GetAxis("Horizontal");

                if ((jumpState == JumpState.Grounded || wallSliding) && Input.GetButtonDown("Jump"))
                {
                    jumpState = JumpState.PrepareToJump;
                }
                else if (Input.GetButtonUp("Jump"))
                {
                    stopJump = true;
                    Schedule<PlayerStopJump>().player = this;
                }

                if (Input.GetButtonDown("Fire1") && attackState == AttackState.Idle)
                {
                    attackState = AttackState.PreparingAttack;
                    var attackEvent = Schedule<PlayerAttack>();
                    attackEvent.player = this;
                }
                
                if (Input.GetButtonDown("Fire2") && attackState == AttackState.Idle)
                {
                    attackState = AttackState.PreparingAttack;
                    var shootEvent = Schedule<PlayerShooting>();
                    shootEvent.player = this;
                }

                CheckForPushable();

                lastMoveDirection = move.x;
            }
            else
            {
                move.x = 0;
            }

            UpdateWallSlide();
            UpdateJumpState();
            base.Update();
        }

 

이제 결과를 확인해봐요.

변경사항을 저장하고 실행해요. 

 

원하는대로 PlayerShooting 이벤트가 잘 동작하네요.

 

오늘은 GPT-4, GPT-4o 활용해서 플레이어의 총알 발사 애니메이션을 적용했어요.

다음에는 총알이 날아가는 기능을 추가할께요. 

[인텔리노마드라이프와 함께 행복하세요 : 인텔리원스튜디오]

 

지금까지,

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

감사합니다.

 

728x90