이전 시간에 애니메이션을 임포트해주었으니 이제 올바른 상황에 맞게 출력되도록 설정해주자
애니메이션 블루프린트의 Main State에 Blend Space를 사용하는 것으로 걷고 뛰는 애니메이션이 재생되도록 해주자.
이때 Blend Space는 속도와 같은 변수 값의 상태에 따라 다른 애니메이션이 재생되도록 해준다.
이를 위해 애니메이션/블랜드스페이스1D를 생성해주자.
가로축의 이름을 GroundSpeed로 바꿔주고 최소를0 최대를 300으로 해준다음 Idle Walk Run을 배치해주자
이렇게 배치해준다음 Idle State에서 애니메이션 포즈가 이 Blend Space를 통해 출력되도록 수정해주자
이렇게 해주고 이제 적의 속도를 가져와야하기 때문에 이벤트그래프에서 적캐릭터 BP를 가져오고 BP에 있는 Character Movement도 가져오도록 수정해주자.
그리고 Float로 GroundSpeed라는 변수를 선언해주고 Thread Safe Update Animation에서 이 GroundSpeed를 설정해줄 수 있도록 해주자.
그 다음, 이 변수 값을 가져와서 Blend Space 입력에 넣어주자
이렇게 해주면 움직임이 한쪽으로 치우쳐보이는데 이는 Character에서 Orient 값을 체크해주고 BP_Enemy의 컨트롤러 요 사용을 꺼주면 된다.
이를 코드로 구현해보자
AEnemy::AEnemy()
{
PrimaryActorTick.bCanEverTick = true;
GetMesh()->SetCollisionObjectType(ECollisionChannel::ECC_WorldDynamic);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
GetMesh()->SetGenerateOverlapEvents(true);
GetCapsuleComponent()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
Attributes = CreateDefaultSubobject<UAttributeComponent>(TEXT("Attributes"));
HealthBarWidget = CreateDefaultSubobject<UHealthBarComponent>(TEXT("HealthBar"));
HealthBarWidget->SetupAttachment(GetRootComponent());
GetCharacterMovement()->bOrientRotationToMovement = true;
bUseControllerRotationPitch = false;
bUseControllerRotationRoll = false;
bUseControllerRotationYaw = false;
}
걷는 모션이 생겼으니 이제 특정 포인트를 순찰하도록 만들어보자. 여러 포인트를 가진 다음 상황에 따라 특정 포인트를 선택하여 순찰하도록 구현해보자. 이를 위해 AActor값의 TArray를 만들어주자.
Enemy.h
private:
UPROPERTY(EditInstanceOnly,Category="AI Navigation")
AActor* PatrolTarget;
UPROPERTY(EditInstanceOnly, Category = "AI Navigation")
TArray<AActor*> PatrolTargets;
이를 활용하기 위해 AAIController의 MoveTo함수를 사용하자.
이를 사용하려면 모듈에 AIModule을 추가해줘야한다. 이렇게 해준 다음 순찰타켓을 지정해주고 옵션값을 지정해준 다음 OutPath를 가져와서 DebugSphere을 그려주게 하자.
Enemy.cpp
void AEnemy::BeginPlay()
{
Super::BeginPlay();
if (HealthBarWidget)
{
HealthBarWidget->SetVisibility(false);
}
EnemyController = Cast<AAIController>(GetController());
if (EnemyController && PatrolTarget)
{
FAIMoveRequest MoveRequest;
MoveRequest.SetGoalActor(PatrolTarget);
//도착이라고 생각할 거리
MoveRequest.SetAcceptanceRadius(15.f);
FNavPathSharedPtr NavPath;
EnemyController->MoveTo(MoveRequest, &NavPath);
//& : 복사x -> 참조
TArray<FNavPathPoint>& PathPoints = NavPath->GetPathPoints();
for (auto& Point : PathPoints)
{
const FVector& Location = Point.Location;
DrawDebugSphere(GetWorld(), Location, 12.f, FColor::Green, false, 10.f);
}
}
}
이렇게 해준다음 BP에서 Patrol Point를 지정해주면 된다.
이렇게 해주고 실행하면 직선이기 때문에 구가 2개만 등장하는 것을 볼 수 있다.
만약 여기서 장애물이나 벽을 추가하면 구가 늘어나게 된다.
'게임공부 > Unreal Engine' 카테고리의 다른 글
[Unreal Engine][C++]25. Patrol (0) | 2025.02.07 |
---|---|
[Unreal Engine][C++]23. Enemey Behavior (0) | 2025.01.27 |
[Unreal Engine][C++]22. Death (1) | 2025.01.26 |
[Unreal Engine][C++]21. Damage (1) | 2025.01.21 |
[Unreal Engine][C++]20. Actor Component (0) | 2025.01.16 |