AI 캐릭터가 옆으로 빠르게 이동하면서 사격을 하는 내용의 블루프린트


총알은 First Person Projectile을 사용함

총알이 발사되는 시작 위치를 참조하기 위해 아래 그림처럼 캐릭터 앞에 Arrow 콤포넌트를 두고 콤포넌트 계층구조상 Mesh콤포넌트 하위에 배치했기 때문에 블루프린트에서 총알을 발사할 때는 언제든지 화살표의 위치를 참조하여 총알이 스폰되는 위치로 삼을 수 있다



AI Character의 이벤트 그래프






Enum_Game_State



BP_EnemyAnim  (애니메이션 블루프린트의 이벤트 그래프)


BP_EnemyAnim  (애니메이션 블루프린트의 애님 그래프)


Posted by cwisky
Custom Projectile2018. 10. 31. 15:47

총알로 사용할 커스텀 Projectile 만들기


레벨 위에서 마우스 우측을 누르면 커스텀 발사체가 발사되도록 한 예이다


발사체를 만들 때 핵심적인 컴포넌트는 다음과 같다

Projectile Movement : 발사속도, 반동을 설정

Sphere Collision : Collision Preset을 BlockAllDynamics, Physics Actor 등으로 설정



Actor 기반의 블루프린트 생성 > Projectile Movement, Sphere Collision, Sphere 를 콤포넌트로 추가


주의 : 컴포넌트 패널에 기본적으로 포함된 DefaultSceneRoot 컴포넌트는 Sphere Collision을 드래그하여 대치해야 설정한대로 작동하게 된다




발사속도 및 반동 설정

Projectile Movement 컴포넌트를 선택하고 디테일 뷰에서 아래와 같이 설정한다. 발사된 총알이 벽등에서 튕기는 현상을 연출하려면 아래처럼 Should Bounce 항목을 선택해야 한다



콜리전 컴포넌트의 충돌설정

콜리전 컴포넌트(여기서는 Sphere Collision)를 선택하고 Collision Presets 항목에서 Physics Actor 혹은 BlockAllDynamics 등으로 선택한다. 이벤트 그래프에서 충돌 이벤트를 구현할 생각이라면 아래처럼 Simulation Generates Hit Events 항목을 선택한다



Static Mesh 자체는 No Collision으로 설정

Sphere 컴포넌트는 총알 자체를 나타내는데 Collision Presets 항목에 NoCollision을 선택한다



Projectile Movement 컴포넌트의 이벤트를 이용하여 발사체 제거

발사체가 멈추었을 때 레벨에서 발사체를 제거하려면 Projectile Movement 컴포넌트의 On Projectile Stop 이벤트를 구현하면 된다



충돌 대상에 따라 Hit 혹은 Overlap 설정하기

발사체가 캐릭터에 명중했을 때 튕겨 나오지 않도록 하려면 아래처럼 Sphere Collision 설정시 Collision Presets을 Custom으로 하고 Pawn 항목에서 Overlap(겹침)에 선택하면 발사체가 캐릭터에 명중했을 때 그냥 관통하게 된다



마우스 우측을 누르면 발사

레벨에서 마우스 우측을 누르면 커스텀 발사체(BP_MyBullet)가 총구에서 정면으로 발사되도록 한 예

총구 앞에 화살표(Arrow)컴포넌트를 배치하고 그 위치에 발사체가 생성되도록 하면 된다


Posted by cwisky

Animation Starter Pack에 포함된 Skeletal Mesh와 애니메이션 시퀀스를 사용한 Behavior Tree예제


아래의 예제는 가급적 비헤이비어 트리에 대부분의 스크립트를 포함하는 것을 목적으로 작성한 것이므로 특정 패턴과는 견해가 다를 수 있다. 비헤이비어 트리의 기본 개념을 이해하기 위한 예제이다. 

아래와 같이 작성하고 게임을 실행하면 AI 캐릭터가 비헤이비어 트리의 로직에 따라 Idle, Patrol 상태를 반복하며 지정된 애니메이션이 실행되는 것을 확인할 수 있다


비헤이비어 트리의 내용

ASP에 포함된 캐릭터가 Patrol 상태에서는 임의의 이동가능한 장소를 정해서 이동하고 이동을 마친 후에는 Idle 상태로 전환하고 2초 동안 쉰다. 그리고 다시 Patrol 상태로 전환되어 같은 내용이 무한히 반복된다


작업절차

  1. 일인칭 템플릿을 사용한 프로젝트를 생성하고 레벨에 Nav Mesh Bound Volume 설정
  2. 마켓 플레이스에서 Animation Starter Pack을 검색하여 프로젝트에 포함한다
  3. ASP에 포함된 Ue4ASP_Character(블루프린트)를 복사하여 BP_AIEnemy 라는 이름으로 저장하고 더블클릭하여 캐릭터 뒤에 배치된 카메라와 카메라붐을 삭제하고 저장한 후 CB에서 드래그하여 레벨에 배치한다
  4. AIController를 기반으로 BP_AIController 클래스를 생성한다
  5. CB에서 마우스 우측 > 인공지능 > 비헤이비어 트리 > 이름을 BT_EnemyAI 으로 저장한다
  6. CB에서 마우스 우측 > 인공지능 > 블랙보드 > 이름을 BT_EnemyBlackboard 으로 저장한다
  7. Ue4ASP_Character 더블클릭 > 디테일뷰 > AIController 항목 : BP_AIController 설정
  8. BT_EnemyAI 더블클릭 > 블랙보드 항목 : BT_EnemyBlackboard 설정
  9. Enum_GameState : 게임상태를 저장할 열거형 블루프린트 클래스
  10. BP_EnemyAnim : 애니메이션 블루프린트(스테이트 머신을 이용한 애니메이션 실행)
  11. 비헤이비어 트리의 툴바를 통해 생성되는 3개의 Task
  • Task_GetRandomPos : AI캐릭터가 이동가능한 임의의 위치벡터 생성
  • Task_Set_Idle : 게임상태 변수를 STATE_IDLE로 설정(AIController, Blackboard)
  • Task_Set_Patrol : 게임상태 변수를 STATE_PATROL로 설정(AIController, Blackboard)



AI 캐릭터 클래스인 Ue4ASP_Character에는 아무런 스크립트도 작성하지 않았다


BP_AIController 의 이벤트 그래프에는 다음과 같이 작성한다



BT_EnemyAI 는 다음과 같이 작성



BT_EnemyBlackboard



Enum_GameState



BP_EnemyAnim(애니메이션 블루프린트, 이벤트 그래프)



BP_EnemyAnim(애니메이션 블루프린트, 애님 그래프)



Task_GetRandomPos



Task_Set_Idle



Task_Set_Patrol


Posted by cwisky