[Unreal] 12.AI_정리, 데이터테이블
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
AI
AIPawn
APawn을 상속 받는 뼈대- 멤버변수
- 캡슐컴포넌트 :
UCapsuleComponent타입의 CDO의 기본 서브객체 생성 - 메쉬컴포넌트 :
USkeletalMeshComponent타입의 CDO의 기본 서브객체 생성 - 무브먼트컴포넌트 :
UFloatingPawnMovement상속받은 클래스 생성한 후 초기화 - AI이름 :
- AI죽음 델리게이트 변수
- 패트롤 배열과 인덱스
- 캡슐컴포넌트 :
- 멤버함수로 애니메이션 변경, AI타입 변경, AI죽음 델리게이트 함수, 데미지 처리 가상 함수 가짐
- 생성자에서 AIControllerClass
DefaultAIController의 StaticClass로 초기화하여 사용 가능 - Possess를 어느 시점에 행할지도 생성자에서 초기화
DefaultAIController
AAIController를 상속 받는 AIController의 뼈대- 멤버변수
- 아래 멤버변수 사용을 위해
AIInfo.h에 전처리기 Include UAIPerceptionComponent: 지각정보UAISenseConfig_Sight: 시야정보UBehaviorTree: AI BT
- 아래 멤버변수 사용을 위해
- 멤버함수
- 가상함수
OnPossess(): 빙의 등록, 폰을 매개변수로 갖음 - 가상함수
OnUnPossess():
- 가상함수
// AIInfo.h
#include "Perception/AIPerceptionComponent.h"
#include "Perception/AIPerceptionStimuliSourceComponent.h"
#include "Perception/AIPerceptionTypes.h"
#include "Perception/AISenseConfig_Sight.h"
#include "Perception/AISenseConfig_Hearing.h"
#include "Perception/AISenseConfig_Damage.h"
데이터테이블
몬스터 데이터 매니저
FMonsterInfoData구조체를FTableRowBase상속을 받는USTRUCT(BlueprintType)프로퍼티를 붙여서 만들기[데이터 테이블] 에셋 생성한 후 각 몬스터별 정보 입력
싱글톤으로 몬스터 매니저를 만들어서 몬스터 각 생성 시에 초기화 후 사용 할 수 있다
- AIInfo에 몬스터 데이터 구조체를 만들고(
FMonsterInfo),mMonsterInfo라는 멤버변수로 잡아둔다 mMonsterInfo가 생성한 AI의 실제 Info값(체력, 공격력, 방어력, 경험치 등등)을 가지게 된다GENERATED_BODY()파일.generated.h언리얼이 제공해주는 그런 기능들의 코드를 내가 만든 오브젝트의 정보를 바탕으로 자동으로 추가해주는 것- 이런 자동 생성은 이 코드 경로처럼 UHT(Unreal Header Tool)가 프로젝트를 빌드할 때 알아서 해주는 것
AI 스킬
- 짤패턴, 기믹패턴(체력기반)
- 타겟팅 스킬, 논타겟팅 스킬(범위스킬), 자가범위 스킬
- BT에서 데코레이터를 활용하여 스킬을 사용하였을 때, 분기점을 다르게 주도록 구조를 설계할 수 있다
스킬 몽타쥬 제작
BB_Monster_UseSkill
BB_MonsterDefault를 상속받아 제작EnableUseSkill과 같은 스킬 사용가능여부를 판단할 boolean 값을 키로 가짐
BB
코드
BTTask_UseSkill.cpp
- ExecuteTask
- TickTask
- 스킬 모션이 끝난지를 파악하기 위해 BB에
SkillEndboolean 값 추가하여 사용
- 스킬 모션이 끝난지를 파악하기 위해 BB에
데코레이터
- HP기반 사용 스킬인 경우
- TakeDamage 함수에서 스킬 발동조건 지점을 잡은 이후
- BB데코레이터를 기본공격 Task에 달아 두고, 스킬을 사용 할 수 있는 지점에서 관찰자 중단 Self로 자기 자신의 Task를 중단
- 이전 분기에 존재하는 UseSkill Task가 실행된다
AIInfo.h ReasonData 변수 확인해보기!
피직스 시뮬레이트
- 랙돌 효과 연출 가능
AIPawn.cpp
void AAIPawn::DeathEnd()
{
mCapsule->SetCollisionEnabled(ECollisionEnabled::NoCollision);
mMesh->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly);
mMesh->SetSimulatePhysics(true);
}