본문 바로가기

Contents Example/1. Blueprint Input

1.2 Pixel Ship Game Controller - Shooting Game

게임을 시작하게 하는 buttton 클래스는 같지만 인스턴스가 다르다

이예제는 분석결과 하나의 슈팅게임 예제입니다.

컨트롤러가 플레이어와 적을 만들어 냅니다.

플레이어는 인풋을 참조해 이동하고 Fire Button이벤트시 총알을 발사합니다.

총알은 충돌시 데미지를 전달하고 효과와 함께 사라집니다.

플레이어와 적은 데미지를 입고 Health가 0이 되면 효과와 함께 사라집니다.

전체를 이해하고 아래 블루프린트는 구현적인 면에서 참조하시면 될것 같습니다. 

레벨의 BP_Pixel_sSHipGameController가 BP_PixeShipPlayer를 만든다. 클래스는 Pawn이다.

파티클 컴포넌트를 자식으로 붙여 화염을 표현한다.

레벨의 BP_Pixel_sSHipGameController는 플레이와 에너미의 스폰 포인터만 가지고 있다.

Buttong이 트리거 되면 CallButtonPressed 가 호출되고

레벨블루프린트에서 buttonPressed(1.2)이후의 노드에서 BP_Pixel_sSHipGameController의 StartGame Event가 Call

 BP_Pixel_sSHipGameController의 StartGame Event는 적을 만드는 이벤트를 부르고 플레이어를 만들어준다.

만들어진 플레이어를 포제스해서 입력을 전다랗고 카메라뷰가 바낀다.

적생성이벤트는  게이트를 이용해 게임으 끝날대까지 적을 생성해서 배열체 추가한다.

적당한 딜레이간격을 만들고

랜던위치를 이용해 적을 생성하고 배열에 저장해준다.

플레이어가 적과 충돌하면 플레이어를 없애준다.

 BP_Pixel_sSHipGameController 는 Player와 enemy의 spawn과 Destroy를 관리하는 컨트롤러이다. 

이제부터 Player를 관찰해보겠다.

Player는 BP_Pixel_Ship_Player이고 부모는 Pawn이고 컴포넌트는 메시와 파티클시스템이다.

 

적 피격

무기 BP부분

  • Apply Damage : 휘두르는 무기류 대미지 적용할 때 사용 (Base Damage 0이면 적용안됨)
  • ApplyPoint Damage : 총알 대미지 적용할 때 사용
  • ApplyRadial Damage: 수류탄 대미지 적용할 때 사용
  • Apply Damage 내의 Event Instigator : 무기를 사용하는 주체(캐릭터)
  • Apply Damage 내의 Damage Causer : 직접 대미지를 가하게 되는 액터(무기)

적 BP 부분

  • AnyDamage이벤트 : 대미지를 받는 이벤트
  • 타격을 받을 때마다 Apply Damage에 적용된 값으로 Health 감소
  • Clamp(float) : Min값 이하면 Min값 Max값 이상이면 Max값으로 제한하는 함수
  • AnyDamage 이벤트 내의 Instigated By : 공격자 정보
  • [출처] 2023.01.09 월요일|작성자 개발게발

Player는 BP_Pixel_Ship_Player spawn되면 Event beginPlay를 실행할꺼고 Cabinet Yaw와 Spawn Location을 저장한다

저장된 Yaw와 SpawnLocation을 이용 약간 위로 뜨면서 2바퀴도는 애니메이션을 Timeline노드와 Lerp를 이용해 만든다.

플레이어를 움직이는 부분인데 EventTick에서 처리하고 있다.

GetMoveright에서 키보드입력에서 만들어진 RightAxis데이터를 이용해 현재 속도를 보간하고 이걸 현재속도로 지정한다.

현재속도와 GameCabinetYaw를 이용해 좌우이동과 이동시 이동방향으로 살짝 로테이션 애니메이션을 구현한다.

보통 이동은 InputEvent를 사용하는데 Tick에서 구현한 이유가 애니메이션을 위해 FInterpTo, RInterpTo를 사용하기 위해서인것 같다.

총알 발사 로직이다. 입력이 들어오면 TimerEvent를 이용해 쿨타임을 만들고, 입력이 떨어지면 지운다. BP_Pixel_Property라는 총알을 스폰해준다.

적으로 부터 데미지가 들어오면 Health와 스피드를 설정해주고

폭파되는 파티클을 스폰해주고 액터를 파괴합니다.

다음은 총알인 BP_Pixel_Projectile을 분석해보겠습니다.

부모는 Actor이고 메시의 자식으로 Light를 가지고 있네요

BeginPlay에서 머터리얼과 라이트칼라를 지정해주고

Location이 아닌 AddActorLocalOffset를 사용하여 이동시키는것 같습니다. 스피드변수는 디폴트가 (0,0,250)이므로 위로 날라가네요

충돌처리입니다. 오버랩되었을경우 Owner가 아니면 ApplyDamage를 전달후 효과를 발생시키고 자신을 파괴합니다.

플레이어에서 총알을 Spawn할때 Ower를 지정했네요

마지막으로 적입니다. BP_Pixel_Ship_Enemy입니다.

BeginPlay에서 변수들을 초기화해줍니다.

플레이어처럼 시작 애니메이션을 만들어 줄 Timeline노드를 추가하고위치와 로테이션을 움직여줄 Lerp를 추가합니다.

Location과 Rotation을 이용해 적 애니메이션을 구현합니다.

MovementDirection과Speed를 이용해 이동한다.

플레이어와 적과의 거리가 120미만이면 총알을 발사하기위해 Branch 노드를 사용합니다.

총알을 스폰해줍니다. 스피드를 (0,0,-200)으로 아래로 발사합니다.

폰과 부딪친게 아니라면 방향을 반대로 바꿔주고 맞다면(플레이어) 데미지를 전달합니다.

데미지를 받았다면 Health처리를 해주고

0보다 작아지면 폭파 파티클을 스폰해주고 자신을 파괴합니다.

생각보다 예제가 복잡하고 원본을 다 설명할지 못했을수 있으니 원본을 보시면 좋을듯합니다.

 

'Contents Example > 1. Blueprint Input' 카테고리의 다른 글

1.2 Pixel Ship Shooting M_Space_Background  (0) 2024.04.23
1.3 Physics-driven movement example  (0) 2024.04.22
1.1 2D input example  (0) 2024.04.21