UE4 Chapter 4-1. 몬스터 AI : 데미지 처리, Material Instance

Date:     Updated:

카테고리:

태그:

인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html

몬스터 데미지 처리

몬스터 모델링은 플레이어 모델링 임포트 방법과 동일하게 임포트 해주면 된다.

🔔 몬스터 블루프린트 생성

  • “DefaultMonsterAnimBP” 몬스터 애니메이션 블루프린트
    • image
    • 상태 머신에서 애니메이션 흐름을 지정해준다 게임이 시작되면 “idle” 상태 애니메이션을 재생하도록 한다.
      • image
      • image
  • “DefaultMonsterBP” 몬스터 블루프린트
    • 이동할 수 있고 충돌 처리 가능해야 하기 때문에 Character 유형으로 만들어준다.
    • Mesh 설정 👉 Mesh 컴포넌트 누른 후 작업하기
      • 블루프린트를 열고 Mesh 를 다운받았던 Goblin 모델링 파일로 바꿔준다. Mesh 의 트랜스폼을 알맞게 만져준다. (캡슐 충돌체와 발끝 맞추고 크기 줄이고 회전시키기) 컴파일 하고 레벨에 배치하기.
        • image
      • “DefaultMonsterBP”의 Mesh의 컴포넌트인 Animation에 “DefaultMonsterAnimBP” 애니메이션 블루프린트를 사용하겠다고 설정해주어야 함
        • image


🔔 몬스터 데미지 처리

플레이어(“MoveCharBP”)가 몬스터(“DeaultMonsterBP”)를 공격하면 몬스터가 빻갛게 변하고 HP를 가지고 있어서 HP가 0 이하로 떨어지면 죽는 애니메이션이 플레이 되도록 한다. 죽이면 사라지게 했던 효과는 안쓸 것.(Destroy Actor 노드 삭제하기)

“MoveCharBP”이 칼로 공격했을 때 데미지 발생하게 하기

  • On Component Begin Overlap 👉 Branch
    • 칼에 붙어있는 Collision에 어떤 충돌이 일어나면 그 충돌한 대상이 자기 자신인지를 검사한다.
  • Branch 👉 Apply Damage
    • 충돌한 대상이 자기 자신이 아니라면 Apply Damage 실행
      • 충돌한 대상(Damaged Actor이자 충돌한 대상인 Other Actor)에게 Atk(Base Damage)만큼의 데미지를 가한다. 공격하는 대상은 자기 자신 self (Damage Causer)이다.

🚩 “MoveCharBP” 블루프린트 이벤트 그래프

image

  • 공격력을 나타내는 float Atk 변수 추가
    • 기본 값은 40
  • Apply Damage 노드
    • Damaged Actor 👉 데미지를 가할 대상. 충돌한 대상인 Other Actor
    • Base Damage 👉 데미지양 Atk
    • Damage Causer 👉 데미지를 가한 대상 Self (“MoveCharBP”)


데미지 받으면 HP 깎고 죽으면 쓰러져 있는 애니메이션 장면만 반복 재생

데미지를 받으면 데미지만큼 HP가 깎이고, 또 HP 가 0 이하로 떨어지면 죽는 애니메이션을 재생시켜야 한다. 데미지 이벤트에 따라 사망했다는 신호를 받았을 때 사망 애니메이션을 재생하며, 쓰러져 누워있는 장면을 계속 유지할 것이므로 이러한 작업은 애님 몽타주에서 해주어야 한다.

  • 몽타주 생성
    • 콘텐츠 브라우저 👉 “sword_and_shield_death” 죽는 애니메이션 모델 파일에 우클 👉 생성 👉 애님몽타주 생성
    • 이름은 “Goblin_Death_Montage”로 해주었다.
    • 그리고 몽타주 열어준 후 저장
      • Play Anim Montage에서 플레이할 몽타주 대상으로 할당할 수 있도록 저장한번 해주기

🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프

image

  • Any Damage Event 👉 Set HP
    • 나 자신인 “DeaultMonsterBP”에게 데미지를 들어오는 이벤트가 발생하면 👉 HP를 (기존 HP - 들어온 데미지 양)으로 새롭게 setting 한다.
  • Set HP 👉 Branch
    • HP를 세팅하고 나면 (HP <= 0.0) 조건을 검사한다.
  • Branch 👉 Play Anim Montage
    • (HP <= 0.0) 조건이 True 라면 “Goblin_Death_Montage” 애님 몽타주를 실행한다.

🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 애님 그래프

image

애님 몽타주를 꼭 ! ! ! 그룹으로서 추가하여 애님 그래프에 최종 애니메이션 포즈와 연결지어주어야 애니메이션이 적용된다.(이 과정 없으면 재생 안됨 ㅠ ㅠ). 상태 머신보다 오른쪽에 연결되어 있기 때문에 상태 머신 안에서 구현된 애니메이션들보다 상위에서 덮어 씌운다. 👉 공격 애니메이션은 Idle 애니메이션을 덮어 씌운다.

애님 몽타주 ‘섹션’으로 루프 재생

🚩 “Goblin_Death_Montage” 애님 몽타주

죽는 애니메이션 재생이 끝나면 다시 Idle 애니메이션으로 돌아가게 되서 죽었는데 다시 벌떡 일어나는 이상한 모습이 연출된다. 따라서 다시 Idle 애니메이션을 재생하지 않고 그냥 계속 죽는 애니메이션이 끝난 상태(쓰러진 상태)를 유지하게끔 해보자. 👉 끝 부분만 루프로 재생

image

애니메이션 가장 가장 끝부분에 우클 - 새 섹션 추가. 로 섹션을 추가해준다. 이름은 “Loop”. 섹션으로 슬롯을 애니메이션 여러 부분으로 나눌 수 있다.

image

  • 현재 섹션 2개
    • “Default” - 죽는 애니메이션 처음부터 거의 끝까지 구간
    • “Loop” - 죽는 애니메이션 아주 끝 부분에 쓰러진 구간
  • 두 번째 줄의 초록색 네모는 현재 생성된 섹션 목록을 나타낸다.
  • 세 번째 줄은 재생되는 섹션의 순서를 나타낸다.
    • 세 번째 줄의 “Default” 섹션을 누른 후, 섹션 목록을 나타내는 두 번째 줄의 “Loop” 섹션을 누르면
      • “Default” 섹션 재생 후에 “Loop” 섹션을 재생하겠다는 의미되며 세 번째 줄에서 “Default” 섹션 다음 순서로 재생될 “Loop” 섹션이 추가된다.
    • 세 번째 줄의 “Loop” 섹션을 누른 후, 섹션 목록을 나타내는 두 번째 줄의 “Loop” 섹션을 누르면
      • “Loop” 섹션 재생 후에 “Loop” 섹션을 재생하겠다는 의미되며 이는 “Loop” 섹션을 무한 루프 재생하겠다는 의미이다.
        • 루프 재생되는 섹션은 파란 색으로 나타난다. 따라서 “Loop”는 파란색인 반면, “Default”는 초록색으로 나타나는 것을 볼 수 있다.
  • 이제 죽는 애니메이션이 실행되면, 끝부분에 쓰러진 장면만 반복 재생되어 몬스터가 계속 누워있는 것을 볼 수 있다.


데미지 입을 때 몬스터를 빨간색으로 변하게 하기

image

“DeaultMonsterBP”가 플레이어로부터 데미지를 입는 짧은 순간마다 빨간색으로 변하게 할 것이다. 👉 Material이 2 개 필요 (평소 머테리얼, 공격 받을 때 적용할 빨간 버전의 머테리얼)

  • 1️⃣ “phong1” 머테리얼
    • “DeaultMonsterBP”의 Mesh를 나타내는 한 부분으로서 시각적인 표면을 표현
    • “DeaultMonsterBP” 메시의 디폴트 Material.
      • 평소 몬스터의 표면을 나타냄.
  • 2️⃣ “phong1_Inst” 머테리얼
    • “phong1” 머테리얼의 빨간색 버전으로 “phong1”를 Material Instance 로 만든 Material이다.
    • 몬스터가 데미지를 순간, “DeaultMonsterBP”의 Mesh를 이 머테리얼으로 ‘잠시 동안만’ 설정할 것이다.
      • 이내 다시 평소 Material인 “phong1”으로 되돌릴 것임


Material과 Material Innstance

  • Material
    • 유니티에서의 Material과 같다.
    • Mesh에 적용하여 시각적인 모양을 조절할 수 있는 에셋으로 “페인트”라고 보면 된다. 시각적인 표면.
      • 색깔, 광택, 재질, 투과성 등을 정의할 수 있다.
  • Material Innstance
    • 이미 존재하고 있는 다른 Material의 파라미터를 수정해서 마치 새로 생성된 Material처럼 사용할 수 있다.
      • A 머터리얼과 B 머터리얼이 오직 색깔만 다르고 다른 설정들은 전부 다 똑같다고 해보자.
        • A 머터리얼을 복사해서 붙여넣어 이를 B 머터리얼이라고 하면, 아예 새로 메모리에 생성하는 것이나 마찬가지이기 때문에 시간적, 공간적 낭비가 될 것이다.
        • B 머터리얼을 아예 새롭게 생성할 필요 없이 A 머터리얼과 동일한 부분들은 A 머터리얼의 메모리를 그대로 사용하되, A 머터리얼의 색깔 파라미터만 수정한게 B 머터리얼이라고 친다면 훨씬 효율적이다.
          • 이렇게 A 머터리얼을 상속받아 메모리를 공유하되 A 머터리얼과 다른 부분을 가지는 파라미터 값만 수정해서 마치 A 머터리얼과 별개의 새로운 머터리얼인 것 처럼 사용되는 머터리얼을 ✨머터리얼 인스턴스✨라고 한다. B 머터리얼은 A 머터리얼의 인스턴스다.👉 머터리얼 인스턴싱.
          • 머터리얼 인스턴스를 만들기 위해선 본체 머터리얼에게 인스턴스들에 따라 ✨다르게 만들 부분인 '파라미터'✨ 노드를 반드시 붙여주어야 한다.
    • “phong1” 머터리얼을 통해 “phong1_Inst” 머터리얼 인스턴스를 만들 것이다.
      • "phong1" 머터리얼에게 색깔 파라미터를 부여하고 "phong1_Inst"에서 이 파라미터만 빨간색으로 수정해서 사용할 것이다.
      • “phong1_Inst” 머터리얼은 “phong1” 머터리얼과 메모리를 공유한다. 다만 색상 파라미터 값만 다를 뿐이다. 메모리를 새롭게 차지하는 별개의 존재가 아니다.


🚩 “DeaultMonsterBP” 블루프린트

본체 Material이 될 “phong1”에게 색상 파라미터를 나타내는 Vecotr Parameter 노드를 부여하자. 인스턴스 머터리얼이 빨간색으로 값을 수정하여 사용할 수 있도록!

  • “DeaultMonsterBP”의 Mesh 컴포넌트 클릭
    • 디테일 패널 - Material 에 현재 “phong1”라는 Material이 추가되어있는 것을 볼 수 있다. 이 파일을 콘텐츠 브라우저에서 찾아 에디터로 열어보자.


🚩 “phong1”

“DeaultMonsterBP”의 Mesh에 Material로 할당 되어 있는 이 phong1을 ‘피’로 만들어보자.

image

image

윗 사진은 처음 “phong1” 상태이고, 아랫 사진은 “phong1”에게 색상 파라미터를 적용한 상태이다.

  • Texture Sample
    • 텍스처로부터 색상 값들을 출력하는 노드이다.
      • 출력 값
        • 하얀색 👉 전체적인 RGB 색상 값
        • 나머지 4개는 각각 R, G, B, A(불투명도) 를 나타낸다.
  • Vector Parameter
    • 머터리얼 인스턴스마다 다르게 색상 값을 지정할 수 있는 색상 파라미터다.
      • 파라미터를 꼭 “phong1”에 넣어주어야 “phong1”로 인스턴스를 만들 때 이 파라미터를 사용하여 다른 색상을 가진 인스턴스를 만들 수 있다. (다른 모든 설정값들은 전부 “phong1”와 동일하며 메모리도 동일)
    • 하얀색 (1, 1, 1, 1)으로 설정해준다.
  • “phong1”의 텍스처 RGB 값(Texture Sample의 출력)과 하얀색 (Vector Parameter의 출력)을 곱하면(Multiply) 그대로 뭐 변하는거 없이 “phong1”의 텍스처 RGB 값(Texture Sample의 출력)이 된다. 이를 “phong1” 머터리얼의 베이스 컬러로 연결해준다.
    • Vector Parameter를 추가한 이유는 “phong1” 자체에 변화를 주려는 것이 아니라 “phong1”의 인스턴스가 빨강색으로 설정할 수 있도록 기능을 제공하기 위해서였다. 따라서 “phong1”의 색에는 변화를 주지 않을 것이라서 변화가 없도록 하얀색으로 하고 이를 원래 값에 곱해주었다.
      • 사실 강의에선 설명해주시지 않은 부분이라 내 추측일 뿐이다 ㅠ


🚩 “phong1_Inst”

콘텐츠 브라우저에서 “phong1” - 우클 - 머터리얼 인스턴스 생성 - 이름은 “phong1_Inst”로.

image

부모가 “phong1”인 것을 확인할 수 있다. “phong1”에서 Vector Parameter를 추가해준 덕분에 “phong1_Inst”에서 색깔을 빨간색으로 지정하는 것이 가능하게 되었다. 색상 값을 (1, 0, 0, 1)으로 하여 빨간색으로 지정해주자.


🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프

image

  • Change Damage Color 👉 Set Material
    • 커스텀 이벤트로 만든 Change Damage Color 이벤트가 발생하면, “DeaultMonsterBP”의 Mesh의 Material을 빨간색 버전의 Material인 “phong1_Inst”로 세팅한다.
      • Mesh는 “DeaultMonsterBP” 컴포넌트에서 드래그 해오면 된다.
  • Set Material 👉 Delay
    • 이 Material을 0.02초동안 지속한 뒤에
  • Delay 👉 Set Material
    • 0.02초의 지연시간이 Complete 되면 “DeaultMonsterBP”의 Mesh의 Material을 원래대로 “phong1”로 세팅한다.

image

데미지를 입고 HP가 깎이고난 후에 Change Damage Color이벤트를 호출할 수 있도록 해당 자리에 함수 노드를 추가하여 실행 핀 와이어를 연결해준다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

UE4 Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기