상호작용 시스템

조정원·2026년 1월 13일

상호작용 실행 흐름

1. 상호작용 오브젝트와 오버랩

2. 일정 시간마다 대상 오브젝트 판별

3. 상호작용에 필요한 데이터 전달

4. 타겟 오브젝트 동작

5. 캐릭터 동작

상호작용 핵심 기술

1. 상호작용 인터페이스

IInteractalbe

  • 상호작용 인터페이스
  • GetInteractionData
    • FInteractionData를 전달
  • Interact
    • 실제 상호작용 동작 정의
    • UFUNCTION 키워드를 BlueprintNativeEvent 로 지정하여 블루프린트 /C++ 구현 가능

FInteractionData

  • 상호작용에 필요한 데이터
  • 몽타주, 위치, 로테이터, 어빌리티 등
  • 대상 오브젝트에서 소유, 상호작용 시 캐릭터 쪽에서 전달해 사용

2. 부드러운 상호작용

UInteractionComponent

  • 상호작용 컴포먼트
  • 오버랩 Begin에서 해당 액터를 TSet에 추가, 오버랩 End에서 제거
  • 일정 시간마다 가장 각도가 작은, 거리가 작은 오브젝트 선정 → 여러 오브젝트가 겹쳤을 때 처리 가능
  • 내적을 활용하여 적절한 상호작용 각도 처리 → 원하는 상호작용 가능 위치를 지정 가능 (Ex. 오브젝트의 정면 중 일정 각도)

InteractionPoint

  • 캡슐 콜리전을 사용한 상호작용 포인트
  • 상호작용 시 해당 위치로 이동 후 상호작용
  • 뷰포트 및 에디터 인스턴스에서 위치 조정 후 Beginplay에서 해당 데이터 저장
  • 원하는 위치를 조정하여 자연스러운 연출 가능

UAbilityTask_MoveToLocation

  • Target Location으로 캐릭터를 움직이는 Ability Task
  • Ability Task 동작하기 전 캐릭터→InteractionPoint 방향 벡터로 회전
  • Ability Task 동작 후 InteractionPoint의 Rotator 로 회전
  • 목표 위치까지의 거리가 짧을 경우 두 번 연속해서 회전하기 때문에 일정 거리 이하는 두 번째 회전만 적용

3. 템플릿을 활용한 상호작용 어빌리티

유연한 구조의 상호작용 어빌리티

  • 상호작용 오브젝트마다 실행 시점, 캐릭터 동작 방식 등이 모두 다름

  • 템플릿 클래스에서 해당 동작들을 미리 정의

  • 자식 어빌리티를 생성 후 템플릿 클래스를 그대로 사용 또는 오버라이드

  • 원하는 시점에 맞게 각 함수들의 순서를 조합해서 어빌리티를 구성

  • 상호작용 마다 새로운 어빌리티를 구현할 필요 없는 유연한 구조 보장

  • 상호작용 어빌리티 템플릿 코드

    UCLASS(Abstract)
    class SK_API USK_GA_InteractionTemplate : public USK_GA_InteractionBase
    {
    	GENERATED_BODY()
    
    protected:
    	UFUNCTION()
    	virtual void OnMoveCompleted() PURE_VIRTUAL(USK_GA_InteractionTemplate::OnMoveCompleted,);
    	
    	UFUNCTION()
    	virtual float GetDistance(ASKPlayerCharacter* PlayerCharacter, FVector TargetLocation);
    	UFUNCTION()
    	virtual FRotator GetTargetRotation(ASKPlayerCharacter* PlayerCharacter, FVector TargetLocation);
    	
    	UFUNCTION()
    	virtual void SetForceMove(ASKPlayerCharacter* PlayerCharacter, const bool bForceMove, const EForceMoveMode ForceMoveMode);
    	UFUNCTION()
    	virtual void MoveToLocation(ASKPlayerCharacter* PlayerCharacter, FVector TargetLocation, const float Duration, const EForceMoveMode ForceMoveMode);
    	UFUNCTION()
    	virtual void PlayAnimMontage(UAnimMontage* InteractMontage);
    	UFUNCTION()
    	virtual void ExecuteTargetInteraction(UObject* TargetActor, AActor* Interactor);
    	UFUNCTION()
    	virtual void OnMontageCompleted();
    	UFUNCTION()
    	virtual void OnMontageCanceled();
    };

상호작용 UI

인접한 상호작용 가능 표시 위젯

상호작용 위젯

각 위젯 동작 방식

  • 각 위젯의 오버랩 판정을 위한 Sphere Collision 존재
  • 오버랩 시 해당 UI 표시
  • 상호작용 위젯 표시 O→ 인접 위젯 Off
  • 상호작용 위젯 표시 X → 인접 위젯 On

상호작용 확장

상호작용 오브젝트 목록

  • 화톳불
  • NPC
  • 상자 / 문
  • 장애물
  • 아이템

Bonfire

NPC

Openable

Traversal

Pickup

profile
게임 AI 개발자 조정원입니다.

0개의 댓글