언리얼 팀프로젝트

언리얼 팀프로젝트최종 팀 프로젝트 Interact 캐릭터에 적용

Turtle_Jun 2025. 11. 27. 21:40

[이전 시간에 구현한 Interface] (https://unrealstudyhome.tistory.com/109)

┌─────────────────┐
│ ILNIInteractable │ ← 인터페이스
└────────┬────────┘
│ implements
┌────┴─────┬──────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│Character │ │ 기믹1 │ │ 기믹2 │
└───────┘ └───────┘ └────────┘

각 기믹들과 캐릭터에 한해서 상호작용 인터페이스를 상속 받아 구현을 한 후

캐릭터의 입력을 받아서 각자에 맞는 상호작용 로직을 호출하는 형식으로 구현함

캐릭터에서 액터 상호작용 입력흐름 구조는 아래와 같다.

에디터 테스트 방법


void ALNCharacter::LeftClickInteract(AActor* Interactor)
{
    // 서버에서만 실행
    if (!HasAuthority())
    {
        UE_LOG(LogTemplateCharacter, Warning, TEXT("LeftClickInteract called on client"));
        return;
    }

    if (!Interactor)
    {
        UE_LOG(LogTemplateCharacter, Warning, TEXT("Interactor is null"));
        return;
    }

    // 캐릭터를 잡는 로직
    ALNCharacter* InteractorChar = Cast<ALNCharacter>(Interactor);
    if (!InteractorChar || !InteractorChar->GrabComponent)
    {
        UE_LOG(LogTemplateCharacter, Warning, TEXT("Invalid Interactor or GrabComponent"));
        return;
    }

    // GrabComponent를 통해 잡기 시도
    InteractorChar->GrabComponent->HandleGrabRequest(this);

    UE_LOG(LogTemplateCharacter, Log, TEXT("[Server] %s grabbed by %s"),
           *GetName(), *Interactor->GetName());
}

void ALNCharacter::RightClickInteract(AActor* Interactor)
{
    // 서버에서만 실행
    if (!HasAuthority())
    {
        UE_LOG(LogTemplateCharacter, Warning, TEXT("RightClickInteract called on client"));
        return;
    }

    if (!Interactor || !GetCharacterMovement())
    {
        return;
    }

    ALNCharacter* InteractorChar = Cast<ALNCharacter>(Interactor);
    if (!InteractorChar)
    {
        return;
    }

    // 상호작용시전한 캐릭터의 밀기 애니메이션 동작
    InteractorChar->Server_PlayMontage(InteractorChar->CharacterPushMontage, InteractorChar->MontagePlayRate);

    // 밀치는 방향 계산
    FVector LaunchDirection = InteractorChar->GetActorForwardVector().GetSafeNormal();
    FVector LaunchVelocity = LaunchDirection * 1000.0f + FVector(0, 0, 300.0f);

    // 캐릭터를 날림
    LaunchCharacter(LaunchVelocity, true, true);

    UE_LOG(LogTemplateCharacter, Log, TEXT("[Server] %s pushed by %s"),
           *GetName(), *Interactor->GetName());
}

기존 캐릭터 상호작용 로직을 인터페이스를 사용하여 구현하였다.