오늘의 목표

언리얼 마스터 과제 3번 - 라인 트레이싱 총 구현, 적 캐릭터가 플레이어 캐릭터를 따라다니게 하기
팀 프로젝트
 

 


1. ABaseGun에 오버랩 설정 (C++)

 
 
// BaseGun.h
UPROPERTY(VisibleAnywhere)
class USphereComponent* PickupCollision;

UFUNCTION()
void OnPickupOverlap(UPrimitiveComponent* OverlappedComp,
    AActor* OtherActor, UPrimitiveComponent* OtherComp,
    int32 OtherBodyIndex, bool bFromSweep,
    const FHitResult& SweepResult);
 
// BaseGun.cpp — 생성자
PickupCollision = CreateDefaultSubobject<USphereComponent>(TEXT("PickupCollision"));
PickupCollision->SetupAttachment(RootComponent);
PickupCollision->SetSphereRadius(100.f);
PickupCollision->OnComponentBeginOverlap.AddDynamic(this, &ABaseGun::OnPickupOverlap);
 
// BaseGun.cpp — 오버랩 함수
void ABaseGun::OnPickupOverlap(UPrimitiveComponent* OverlappedComp,
    AActor* OtherActor, UPrimitiveComponent* OtherComp,
    int32 OtherBodyIndex, bool bFromSweep,
    const FHitResult& SweepResult)
{
    ACharacter* PickupChar = Cast<ACharacter>(OtherActor);
    if (!PickupChar) return;

    // 손 소켓에 붙이기
    AttachToComponent(
        PickupChar->GetMesh(),
        FAttachmentTransformRules::SnapToTargetNotIncludingScale,
        TEXT("hand_r"));  // 소켓 이름

    // 콜리전 끄기 (픽업 후 다시 오버랩 안 되게)
    PickupCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);

    // 물리 끄기
    if (UStaticMeshComponent* Mesh = FindComponentByClass<UStaticMeshComponent>())
    {
        Mesh->SetSimulatePhysics(false);
        Mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
    }
}

2. 캐릭터 메시에 소켓 추가

언리얼 에디터에서 캐릭터 스켈레탈 메시를 열고 hand_r 뼈대에 소켓을 추가

 
 
스켈레톤 에디터 → hand_r 우클릭 → Add Socket → 이름: hand_r
→ 프리뷰로 총 위치/회전 맞추기

3. BP 캐릭터 설정

BP_Character → 디테일 패널
→ Collision → Generate Overlap Events: true

캡슐 컴포넌트 선택
→ Collision Presets: Pawn (기본값이면 이미 OK)

흐름 요약

총 Actor가 월드에 배치
       ↓
캐릭터가 SphereComponent 반경 진입
       ↓
OnPickupOverlap 호출
       ↓
AttachToComponent("hand_r" 소켓)
       ↓
콜리전 / 물리 비활성화

 

 

1. BT 구조 보완 (Selector와 Sequence 활용)

  • 공격 시퀀스 (Sequence):
    1. BTService_CheckTarget: 타겟이 아직 유효한지(살아있는지, 거리 내에 있는지) 체크
    2. BTTask_MoveTo: 공격 사정거리까지 이동 (Acceptance Radius 활용)
    3. BTTask_Attack: 구현하신 공격 수행
    4. BTTask_Wait: (중요) 공격 후 0.5초~1초 정도 대기 시간

2. 공격 이후의 3가지 시나리오 및 로직

공격 태스크가 끝난 직후, 블랙보드 변수 상태에 따라 AI는 다음 행동을 결정

시나리오 A: 적이 아직 살아 있고 사정거리 안에 있음

  • 행동: 다시 공격 (위의 시퀀스 반복)
  • 구현: BT 상위 노드에 Decorator를 추가하여 Target이 유효한지 계속 체크

시나리오 B: 적이 죽었거나 사정거리를 벗어남

  • 행동: 새로운 적 탐색 또는 플레이어에게 복귀
  • 구현: BTTask_Attack이 끝난 후 TargetActor 블랙보드 키를 비움(ClearValue). BT는 다시 상위 Selector로 올라가 우선순위가 높은 서포트나 플레이어 추적 로직을 타게 된다.

시나리오 C: 공격 도중 플레이어의 위기 상황 발생 (우선순위 1순위)

  • 행동: 공격을 중단하고 즉시 서포트하러 이동
  • 구현: BTDecorator_Blackboard를 '서포트 필요' 조건에 걸고, Observer Aborts 설정을 Both 또는 Lower Priority로 설정합니다. 이렇게 하면 공격 중이라도 플레이어 HP가 낮아지면 공격을 즉시 취소하고 서포트 태스크로 넘어간다.

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/05/11  (0) 2026.05.11
2026/05/08 TIL  (0) 2026.05.08
2026/5/6 TIL  (0) 2026.05.06
2026/5/4 TIL  (0) 2026.05.04
2026/05/01 TIL  (0) 2026.05.01

+ Recent posts