오늘의 목표
언리얼 마스터 과제 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):
- BTService_CheckTarget: 타겟이 아직 유효한지(살아있는지, 거리 내에 있는지) 체크
- BTTask_MoveTo: 공격 사정거리까지 이동 (Acceptance Radius 활용)
- BTTask_Attack: 구현하신 공격 수행
- 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 |