충돌 이벤트 (Overlap, Hit) | Event Dispatcher (Bind) | 원거리 물체 판별 (Line Trace, Sweep)

김여울·2025년 5월 12일

사전캠프

목록 보기
16/24

충돌 시 이벤트 발생 방법

항목OverlapHit
발생 조건두 콜리전이 겹쳤을 때두 물체가 실제로 충돌(물리적 접촉)할 때
설명물체끼리 겹칠 때 발생하며, 물리 충돌은 없음물리 시뮬레이션이 적용된 실제 충돌 시 발생
물리 시뮬레이션필요 없음보통 한쪽 이상에서 Simulate Physics 필요
충돌 설정OverlapBlock
주 사용 예시플레이어가 트리거 존에 들어갈 때총알이 벽에 부딪히는 경우

🔻Overlap

📍 BP_OverlapActor

Overlap Actor 만들기

  • 액터 추가

  • 디테일에서 블루프린트 화

  • 큐브 컴포넌트 추가
    ▶ 콜리전 프리셋을 OverlapAll로 변경
    ▶ 오버랩 이벤트 생성 ☑

  • EventTick

    Event ActorBeginOverlap

    • 다른 액터가 이 액터와 오버랩을 시작할 때 호출됨
    • 오버랩한 액터 정보는 Other Actor 핀에 전달됨
    • (예) Event ActorBeginOverlap → Cast To [타겟 클래스] → 원하는 로직 실행

🔻Hit

  • 히트 이벤트 생성

    • 콜리전 프리셋을 BlockAll로 변경

    • Hit 이벤트 추가

      🌀 Event Hit 정보

      항목설명
      My Comp충돌한 내 쪽 컴포넌트
      Other충돌한 상대 액터 (Other Comp가 속한 액터)
      Other Comp상대 쪽의 충돌 컴포넌트
      Self Moved누가 움직였는지 확인, 이 액터가 움직여서 충돌한 경우 true
      Hit Location충돌이 발생한 정확한 월드 좌표
      Hit Normal충돌 지점에서의 표면 방향 벡터
      Normal Impulse충돌 시 전달된 충격량 (힘의 세기)
      Hit위 정보들을 포함한 구조체 (FHitResult)
      Break Hit ResultHit 구조를 개별 변수들로 분해해서 확인 가능
  • AI르탄이에게 적용시키기

    🌀 콜리전 설정 정리

    항목설명
    콜리전 프리셋Pawn, BlockAll 모두 폰끼리 충돌 조건 충족 → 어떤 걸 선택해도 무방
    시뮬레이션 중 히트 이벤트 생성체크 시, 물리 시뮬레이션 중 충돌 시 Event Hit 발생

📍BP_AICharacter

  • EventHit 오버라이드 생성
  • 르탄이 최초 타켓 포지션 정하기

Event Dispatcher

  • 레벨 블루프린트 열기

  • 이벤트 디스패치 생성

    • 나중에 특정 상황에서 실행할 수 있는 사용자 정의 이벤트 신호를 만든다

      🌀 Event Dispatcher 정리표

      단계설명비유 표현
      Event Dispatcher 생성사용자 정의 이벤트 신호를 만들어 놓는 것 (아직 실행 X)방송국 개설
      Bind이 신호를 들었을 때 어떤 함수(이벤트)가 실행될지 연결청취자 등록
      Broadcast신호를 실제로 보냄 → 바인드된 함수들이 실행됨방송 시작 → 청취자 반응

      ▶ 바인드, 호출

      🌀 이벤트 디스패처 관련 용어 정리

      용어설명
      호출 (Call)디스패처를 호출해 이벤트를 실행함 (함수처럼 Broadcast 실행)
      바인드 (Bind)특정 이벤트(함수)를 디스패처에 연결함 → 호출 시 함께 실행됨
      언바인드 (Unbind)연결된 이벤트(함수)를 해제 → 호출해도 실행되지 않음
      모두 언바인드연결된 모든 이벤트(함수)를 한 번에 해제
      이벤트 (Event)실행 가능한 동작 단위. 디스패처에 바인드되거나 단독으로도 사용 가능
      할당 (Assign)Bind와 유사하게 이벤트를 연결하는 방식 (Assign은 노드를 묶어서 한 번에 정의)

📌 참고

  • Call Dispatcher = 디스패처 호출 (Broadcast)
  • Assign 노드는 이벤트 + 바인드를 한 번에 구성할 때 사용됨
  • 언바인드된 상태에서는 디스패처를 호출해도 아무 동작도 하지 않음

원거리 물체 판별

🔻Line Trace

종류설명
Line Trace직선 라인을 발사해 처음 부딪힌 물체의 정보를 반환
광선이 통과하지 않음 – 첫 번째 충돌만 인식
🔹 출력: Hit, Return Value (부딪혔는지 여부)
Multi Line Trace직선 라인을 발사해 여러 개의 충돌체를 모두 검출
광선이 여러 물체를 통과하면서 모든 충돌 정보를 배열로 반환
🔹 출력: Hit Array (여러 Hit 결과)

🔎 활용

  • Line Trace ➡ "무기 조준", "벽 맞았는지 확인"
  • Multi Line Trace ➡ "레이저 통과", "모든 적 감지" 등 다중 판별


Multi Line Trace로 여러 물체 감지 및 이름 출력

1️⃣ Multi Line Trace by Profile
➡ 한 번에 여러 개의 라인을 발사하여, 광선이 통과하면서 부딪힌 모든 물체를 감지함
➡ Profile Name은 "Pawn" 사용 가능

2️⃣ For Each Loop with Break
➡ 충돌 결과 배열(Hit Results)을 하나씩 반복하며 처리함
➡ 중간에 조건에 따라 루프를 멈출 수도 있음 (Break 사용 가능)

3️⃣ Break Hit Result
➡ 각 충돌 결과에서 세부 정보(Actor, 위치 등)를 분해하여 꺼냄

4️⃣ Get Object Name
➡ Hit Result에서 얻은 액터의 이름을 추출

5️⃣ Print String
➡ 추출한 이름을 화면에 출력함
➡ 반복문이 도는 동안 여러 이름이 순차적으로 출력됨

6️⃣ Loop Completed
➡ 모든 요소 반복이 끝나면 완료 메시지 출력 또는 후속 동작 실행 가능


라인트레이스로 물체 감지 및 이름 출력

1️⃣ Start
➡ 르탄이(자기 자신)의 현재 위치에서 라인트레이스를 시작

2️⃣ End (100, 100, 100)
➡ 시작 위치에서 1m 거리(예: 방향 벡터 × 100)를 더한 지점까지 트레이스를 쏨

3️⃣ Actor to Ignore
➡ 트레이스 시 무시할 액터를 지정함 (자기 자신 외의 특정 액터 제외 가능)

4️⃣ Ignore Self
➡ 체크하면 자기 자신은 충돌 검사에서 제외되어 중복 감지를 막을 수 있음

5️⃣ Profile Name
➡ 충돌 판정을 위한 프로파일 이름 설정
(예: "Pawn"은 캐릭터 탐지용으로 적합)

6️⃣ Return Value
➡ 라인트레이스가 무언가에 부딪혔는지를 나타냄
true일 경우 충돌이 발생한 것

7️⃣ Out Hit
➡ 충돌한 대상의 정보를 담고 있으며, Break Hit Result로 분해하여 액터 이름 등을 확인 가능

▶ 1m 반경 내로 들어가면 이름 출력됨

▶ AI에 가까이 가기만 해도 르탄이 쓰러짐

🔻Sweep

항목설명
의미액터를 이동시키면서 중간 경로에 충돌이 있는지 확인하는 기능
설정 예시SetActorLocation(NewLocation, Sweep = true)
Sweep = false그냥 순간이동 (충돌 여부 무시)
Sweep = true이동 중 충돌 감지 시 멈춤 또는 반응
사용 위치SetActorLocation, MoveComponentTo 등 이동 관련 함수에서 사용
주요 목적충돌을 피하며 안전하게 이동
충돌 정보 확인충돌 시 Out Hit으로 HitResult 구조체 정보 획득 가능
요약🚀 Sweep = 충돌 감지 기능을 켠 채로 이동시키기

🌀 Sweep vs Line Trace

항목SweepLine Trace
기본 개념**오브젝트 전체 모양(콜리전)**을 이동시키며 충돌 감지**보이지 않는 직선(선 하나)**으로 충돌 감지
사용 방식SetActorLocation, MoveComponentTo 등에서 사용LineTraceByChannel, LineTraceByProfile 등으로 사용
형태**입체적인 콜리전 모양(박스, 캡슐 등)**으로 감지얇은 선 한 줄로 감지
감지 대상이동 중에 충돌하는 모든 물체쏜 라인과 처음 닿은 물체 (또는 여러 개)
대표 용도캐릭터 이동 시 충돌 검사, 밀기, 물리 반응 등시야 감지, 타겟 포인트 감지, 사격 판정 등
비유몸통 전체를 밀면서 부딪히는지 확인레이저 포인터로 찍어서 맞았는지 확인
요약물체 자체를 움직이며 충돌 검사 (실제 이동 포함)선을 쏴서 감지만 하고 물체는 이동하지 않음 (탐지용)

💡 시야 판정 정리

1️⃣ 라인 트레이스

  • 멀리 있는 물체도 감지 가능
  • 시야에 있는지 검사할 수 있음

2️⃣ 시야 판정 방식

  • AI와 플레이어 사이에 물체가 있으면 → 시야 차단으로 간주
  • 아무 것도 없고, 첫 번째로 Player Pawn에 부딪히면 → 시야 확보로 판단

3️⃣ Behavior Tree Decorator
📍 BTD_IsNearPlayer

  • Perform Condition Check AI 함수 사용
  • 이 데코레이터는 AI와 플레이어가 겹쳐있는 경우만 검사하도록 설정되어 있었음

4️⃣ 개선 조건 추가

  • Trace로 가장 먼저 부딪힌 물체가 Player Pawn인지 확인하는 조건 추가
  • 이를 통해 정확한 시야 확보 판정 가능
    ▶ 시작점 추가 (자기 위치)
    ▶ 끝점 : Player Pawn의 위치


1️⃣ 시작점과 끝점 연결

  • Start: AI의 위치 (Controlled Pawn)
  • End: 플레이어의 위치 (Get Player Pawn)

2️⃣ Actors to Ignore

  • 트레이스에서 무시할 액터들 설정
  • Controlled Pawn(나)와 Get Player Pawn(상대) 모두 추가

3️⃣ Ignore Self

  • 컨트롤러 기준이므로 체크 해제 (false)
  • 그렇지 않으면 자기 자신을 무시하지 않음

4️⃣ 트레이스 결과 판단

  • Return Value가 True면 → 무언가에 부딪힘
  • 따라서 시야를 가리는 물체가 있음 → 실패 처리

5️⃣ Branch 조건 연결

  • Return Value를 Branch의 Condition에 연결
  • True일 경우 = 시야 차단 감지됨 → 실패 처리

6️⃣ "왜 True가 실패인가?"

  • True = 충돌 발생함
    → 시야를 가리는 장애물이 있어서 실패로 처리하는 것

🧠 요약
Line Trace가 무언가에 부딪히면 시야를 차단한 것이므로, True인 경우 조건 실패로 판단한다

➡ 중간에 물체가 막으면 AI르탄이가 따라오지 못함

0개의 댓글