KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
AWheatly 클래스 참조

Wheatly NPC 액터 더 자세히 ...

#include <AWheatly.h>

+ AWheatly에 대한 상속 다이어그램 :
+ AWheatly에 대한 협력 다이어그램:

Public 멤버 함수

 AWheatly ()
 
void CompleteSpeakQuest (class APlayerActor *Player)
 SpeakQuest 완료 처리 (서버에서만 호출)
 
ECompassMarkerType GetCompassMarkerType ()
 
virtual void GetLifetimeReplicatedProps (TArray< FLifetimeProperty > &OutLifetimeProps) const override
 
void PlayAnimation (EWheatlyAnim InAnimType)
 특정 애니메이션 재생 (서버에서 호출)
 
FORCEINLINE void SetAnimationType (EWheatlyAnim InAnimType)
 애니메이션 타입 설정
 
virtual void SetShowOnCompass (bool bShow)
 
void SetSpeakStageActor (class ASpeakStageActor *InSpeakStageActor)
 SpeakStage 설정 (GameMode에서 호출)
 
virtual bool ShouldShowOnCompass () const
 
void SyncSpeakScenarioData (class APlayerActor *Player, const struct FResponseSpeakScenario &Data)
 Client에서 받은 시나리오 데이터를 동기화 (Server에서 호출됨)
 
virtual void Tick (float DeltaSeconds) override
 

Public 속성

bool bShowOnCompass = true
 
ECompassMarkerType MarkerType
 

Protected 멤버 함수

virtual void BeginPlay () override
 
void Multicast_PlayAnimation (EWheatlyAnim InAnimType)
 애니메이션 재생 (멀티캐스트 RPC)
 
void OnInteractionTriggered (class AActor *InteractingActor)
 플레이어 상호작용 핸들러
 
void OnOutlineStateChanged (bool bShouldShowOutline)
 Outline 상태 변경 핸들러
 
void OnRep_EyeColor ()
 
void OnRep_EyeSightState ()
 
void OnSpeakStageSpeakerChanged (class APlayerState *NewSpeaker)
 SpeakStage의 발화자 변경 이벤트 핸들러
 
virtual void SetCompassMarkerInto (ECompassMarkerType InMarkerType) override
 

Protected 속성

TMap< EWheatlyAnim, TObjectPtr< class UAnimSequence > > AnimSequences
 애니메이션 시퀀스 맵
 
TObjectPtr< class UMaterialInstanceDynamic > EyeMaterial
 동적 머티리얼 인스턴스 (런타임 색상 변경)
 
TObjectPtr< class UStaticMeshComponent > EyeMesh
 상호작용 중인 플레이어 표시기
 
TObjectPtr< class UStaticMeshComponent > EyeSightComp
 상호작용 중인 플레이어 표시기
 
TObjectPtr< class UMaterialInstanceDynamic > EyeTraceMaterial
 
TObjectPtr< class UInteractableComponent > InteractableComp
 상호작용 컴포넌트
 
TObjectPtr< class USkeletalMeshComponent > MeshComponent
 스켈레탈 메시 컴포넌트
 
TObjectPtr< class UBoxComponent > PlayerDetectionZone
 플레이어 감지 영역
 
TObjectPtr< class UWidgetComponent > WidgetComp
 위젯 컴포넌트 (상호작용 UI 표시)
 

Private 멤버 함수

void ApplyEyeSight ()
 
void ChangeEyeColor (FLinearColor newColor)
 눈 색상 변경
 
bool IsInRange (const class APawn *LocalPawn) const
 
void UpdateEyeSight (const FVector &Start, const FVector &End)
 

Private 속성

EWheatlyAnim AnimType
 현재 애니메이션 타입
 
bool bEyeSightVisible = false
 
bool bShowDebugInfo = true
 
float CurAnimDuration
 현재 재생 중인 애니메이션 길이 (초)
 
float IndicatorBaseLength = 1.0f
 
float IndicatorBaseRadius = 1.0f
 
FLinearColor ReplicatedEyeColor
 
FVector ReplicatedEyeSightEnd = FVector::ZeroVector
 
TObjectPtr< class ASpeakStageActorSpeakStageActor
 

상세한 설명

Wheatly NPC 액터

Portal의 Wheatly 캐릭터를 구현한 NPC

  • 턴 기반 대화 시스템 지원
  • 애니메이션 재생 및 네트워크 동기화
  • 상태에 따른 시각적 피드백 (눈 색상 변경)

AWheatly.h 파일의 30 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ AWheatly()

AWheatly::AWheatly ( )

AWheatly.cpp 파일의 31 번째 라인에서 정의되었습니다.

32{
33 PrimaryActorTick.bCanEverTick = true;
34
35 bReplicates = true;
36 SetReplicateMovement(true);
37
38 //--------------------------------------------------------------
39 // Skeletal Mesh Component 생성
40 //--------------------------------------------------------------
41 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
42
43 MeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("MeshComp"));
44 MeshComponent->SetupAttachment(RootComponent);
45 MeshComponent->SetCollisionProfileName(TEXT("BlockAllDynamic"));
46
47 EyeMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("EyeMesh"));
48 EyeMesh->SetupAttachment(MeshComponent, TEXT("eyelight_aimjoint"));
49
50 PlayerDetectionZone = CreateDefaultSubobject<UBoxComponent>(TEXT("PlayerDetectionZone"));
51 PlayerDetectionZone->SetupAttachment(RootComponent);
52 PlayerDetectionZone->SetBoxExtent(FVector(1000.f, 1000.f, 1000.f));
53 PlayerDetectionZone->SetCollisionProfileName(TEXT("Trigger"));
54
55 EyeSightComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("EyeSightComp"));
56 EyeSightComp->SetupAttachment(RootComponent);
57
58 //--------------------------------------------------------------
59 // 스켈레탈 메시 로드
60 //--------------------------------------------------------------
62
63 static ConstructorHelpers::FObjectFinder<UStaticMesh> CylinderMesh(TEXT("/Engine/BasicShapes/Cylinder.Cylinder"));
64 if (CylinderMesh.Succeeded())
65 {
66 UStaticMesh* Mesh = CylinderMesh.Object;
67 EyeSightComp->SetStaticMesh(Mesh);
68
69 if (Mesh)
70 {
71 IndicatorBaseLength = FMath::Max(Mesh->GetBounds().BoxExtent.Z * 2.0f, 1.0f);
72 IndicatorBaseRadius = FMath::Max(Mesh->GetBounds().BoxExtent.X, Mesh->GetBounds().BoxExtent.Y);
73 }
74 }
75 EyeSightComp->SetVisibility(false);
76 EyeSightComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
77
81
82 // InteractableComponent 생성
83 InteractableComp = CreateDefaultSubobject<UInteractableComponent>(TEXT("Interactable"));
84 InteractableComp->DetectionDistance = 500.0f;
85 InteractableComp->InteractionType = EInteractionType::Button;
86 InteractableComp->InteractionPrompt = TEXT("Talk to Activate");
87
88 WidgetComp = CreateDefaultSubobject<UWidgetComponent>(TEXT("WidgetComp"));
89 ConstructorHelpers::FClassFinder<UInteractWidget> WidgetRef(INTERACT_WIDGET_PATH);
90 WidgetComp->SetWidgetClass(WidgetRef.Class);
91 WidgetComp->SetupAttachment(GetRootComponent());
92 WidgetComp->SetWidgetSpace(EWidgetSpace::Screen);
93 WidgetComp->SetDrawSize(FVector2D(2048.0f, 1024.0f));
94
95 // 초기값 설정
96 CurAnimDuration = 0.0f;
98
99}
#define INTERACT_WIDGET_PATH
#define WHEATLY_MESH_PATH
Definition AWheatly.cpp:26
#define WHEATLY_MATERIAL_1
Definition AWheatly.cpp:28
#define WHEATLY_MATERIAL_0
Definition AWheatly.cpp:27
#define WHEATLY_MATERIAL_2
Definition AWheatly.cpp:29
TObjectPtr< class UWidgetComponent > WidgetComp
위젯 컴포넌트 (상호작용 UI 표시)
Definition AWheatly.h:130
float CurAnimDuration
현재 재생 중인 애니메이션 길이 (초)
Definition AWheatly.h:161
TObjectPtr< class UInteractableComponent > InteractableComp
상호작용 컴포넌트
Definition AWheatly.h:126
float IndicatorBaseRadius
Definition AWheatly.h:166
TObjectPtr< class USkeletalMeshComponent > MeshComponent
스켈레탈 메시 컴포넌트
Definition AWheatly.h:110
TObjectPtr< class UStaticMeshComponent > EyeSightComp
상호작용 중인 플레이어 표시기
Definition AWheatly.h:122
TObjectPtr< class UStaticMeshComponent > EyeMesh
상호작용 중인 플레이어 표시기
Definition AWheatly.h:114
TObjectPtr< class UBoxComponent > PlayerDetectionZone
플레이어 감지 영역
Definition AWheatly.h:118
float IndicatorBaseLength
Definition AWheatly.h:165
static T * LoadAsset(const TCHAR *Path)

다음을 참조함 : CurAnimDuration, EyeMesh, EyeSightComp, IndicatorBaseLength, IndicatorBaseRadius, INTERACT_WIDGET_PATH, InteractableComp, FComponentHelper::LoadAsset(), ICompassTargetInterface::MarkerType, MeshComponent, PlayerDetectionZone, Wheatly, WHEATLY_MATERIAL_0, WHEATLY_MATERIAL_1, WHEATLY_MATERIAL_2, WHEATLY_MESH_PATH, WidgetComp.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

멤버 함수 문서화

◆ ApplyEyeSight()

void AWheatly::ApplyEyeSight ( )
private

AWheatly.cpp 파일의 453 번째 라인에서 정의되었습니다.

454{
455 if (!bEyeSightVisible)
456 {
457 EyeSightComp->SetVisibility(false);
458 return;
459 }
460
461 const FVector StartLocation = EyeMesh->GetComponentLocation();
463}
void UpdateEyeSight(const FVector &Start, const FVector &End)
Definition AWheatly.cpp:483
bool bEyeSightVisible
Definition AWheatly.h:155
FVector ReplicatedEyeSightEnd
Definition AWheatly.h:152

다음을 참조함 : bEyeSightVisible, EyeMesh, EyeSightComp, ReplicatedEyeSightEnd, UpdateEyeSight().

다음에 의해서 참조됨 : OnRep_EyeSightState(), Tick().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BeginPlay()

void AWheatly::BeginPlay ( )
overrideprotectedvirtual

AWheatly.cpp 파일의 110 번째 라인에서 정의되었습니다.

111{
112 Super::BeginPlay();
113
114 if (MeshComponent)
115 {
116 UMaterialInterface* BaseMaterial = MeshComponent->GetMaterial(2);
117
118 EyeMaterial = UMaterialInstanceDynamic::Create(BaseMaterial, this);
119 MeshComponent->SetMaterial(2, EyeMaterial);
120 }
121
122 if (EyeSightComp)
123 {
124 UMaterialInterface* BaseMaterial = EyeSightComp->GetMaterial(0);
125
126 EyeTraceMaterial = UMaterialInstanceDynamic::Create(BaseMaterial, this);
127 EyeSightComp->SetMaterial(0, EyeTraceMaterial);
128 }
129
131 {
132 InteractableComp->InitWidget(WidgetComp);
133
134 InteractableComp->OnInteractionTriggered.RemoveDynamic(this, &AWheatly::OnInteractionTriggered);
135 InteractableComp->OnInteractionTriggered.AddDynamic(this, &AWheatly::OnInteractionTriggered);
136 InteractableComp->OnOutlineStateChanged.AddDynamic(this, &AWheatly::OnOutlineStateChanged);
137 }
138
139 // SpeakStage 자동 연결 (서버에서만)
140 if (HasAuthority() && !SpeakStageActor)
141 {
142 ASpeakStageActor* FoundStage = Cast<ASpeakStageActor>(
143 UGameplayStatics::GetActorOfClass(GetWorld(), ASpeakStageActor::StaticClass())
144 );
145
146 if (FoundStage)
147 {
148 SetSpeakStageActor(FoundStage);
149 PRINTLOG(TEXT("[AWheatly] SpeakStage auto-connected"));
150 }
151 else
152 {
153 PRINTLOG(TEXT("[AWheatly] Warning: No SpeakStageActor found in world"));
154 }
155 }
156
157 PlayAnimation(EWheatlyAnim::PowerOn);
158}
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
Speak Stage 시스템
void OnOutlineStateChanged(bool bShouldShowOutline)
Outline 상태 변경 핸들러
Definition AWheatly.cpp:379
void PlayAnimation(EWheatlyAnim InAnimType)
특정 애니메이션 재생 (서버에서 호출)
Definition AWheatly.cpp:244
void OnInteractionTriggered(class AActor *InteractingActor)
플레이어 상호작용 핸들러
Definition AWheatly.cpp:336
void SetSpeakStageActor(class ASpeakStageActor *InSpeakStageActor)
SpeakStage 설정 (GameMode에서 호출)
Definition AWheatly.cpp:270
TObjectPtr< class UMaterialInstanceDynamic > EyeMaterial
동적 머티리얼 인스턴스 (런타임 색상 변경)
Definition AWheatly.h:134
TObjectPtr< class UMaterialInstanceDynamic > EyeTraceMaterial
Definition AWheatly.h:137
TObjectPtr< class ASpeakStageActor > SpeakStageActor
Definition AWheatly.h:145

다음을 참조함 : EyeMaterial, EyeSightComp, EyeTraceMaterial, InteractableComp, MeshComponent, OnInteractionTriggered(), OnOutlineStateChanged(), PlayAnimation(), PRINTLOG, SetSpeakStageActor(), SpeakStageActor, WidgetComp.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ChangeEyeColor()

void AWheatly::ChangeEyeColor ( FLinearColor  newColor)
private

눈 색상 변경

매개변수
newColor[in] 새로운 색상

AWheatly.cpp 파일의 474 번째 라인에서 정의되었습니다.

475{
476 if (!EyeMaterial)
477 return;
478
479 EyeMaterial->SetVectorParameterValue(TEXT("EyeColor"), newColor);
480 EyeTraceMaterial->SetVectorParameterValue(TEXT("EyeColor"), newColor);
481}

다음을 참조함 : EyeMaterial, EyeTraceMaterial.

다음에 의해서 참조됨 : OnRep_EyeColor().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CompleteSpeakQuest()

void AWheatly::CompleteSpeakQuest ( class APlayerActor Player)

SpeakQuest 완료 처리 (서버에서만 호출)

매개변수
Player[in] 퀘스트를 완료한 플레이어

AWheatly.cpp 파일의 287 번째 라인에서 정의되었습니다.

288{
289 if (!HasAuthority() || !Player)
290 return;
291
292 // PlayerState에서 축적된 평가 결과 가져오기
293 ALingoPlayerState* PS = Player->GetPlayerState<ALingoPlayerState>();
294 if (!PS)
295 return;
296
297 if (UBroadcastManager* BroadcastMgr = UBroadcastManager::Get(GetWorld()))
298 BroadcastMgr->SendTutorMessage(FText::FromString("SPEAK COMPLETE"));
299}
게임 내 전역 이벤트를 중계하는 중앙 이벤트 버스(Event Bus) 서브시스템입니다.

◆ GetCompassMarkerType()

ECompassMarkerType ICompassTargetInterface::GetCompassMarkerType ( )
inlineinherited

CompassTargetInterface.h 파일의 29 번째 라인에서 정의되었습니다.

29{return MarkerType;}

다음에 의해서 참조됨 : APlayerActor::UpdateCompassMarkers().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetLifetimeReplicatedProps()

void AWheatly::GetLifetimeReplicatedProps ( TArray< FLifetimeProperty > &  OutLifetimeProps) const
overridevirtual

AWheatly.cpp 파일의 101 번째 라인에서 정의되었습니다.

102{
103 Super::GetLifetimeReplicatedProps(OutLifetimeProps);
104
105 DOREPLIFETIME(AWheatly, ReplicatedEyeColor);
106 DOREPLIFETIME(AWheatly, ReplicatedEyeSightEnd);
107 DOREPLIFETIME(AWheatly, bEyeSightVisible);
108}
Wheatly NPC 액터
Definition AWheatly.h:31
FLinearColor ReplicatedEyeColor
Definition AWheatly.h:148

다음을 참조함 : bEyeSightVisible, ReplicatedEyeColor, ReplicatedEyeSightEnd.

◆ IsInRange()

bool AWheatly::IsInRange ( const class APawn *  LocalPawn) const
private

AWheatly.cpp 파일의 430 번째 라인에서 정의되었습니다.

431{
432 TArray<AActor*> OverlappingActors;
433 InteractableComp->DetectionRange->GetOverlappingActors(OverlappingActors, ACharacter::StaticClass());
434
435 for (AActor* Actor : OverlappingActors)
436 {
437 if (Actor == LocalPawn)
438 return true;
439 }
440 return false;
441}

다음을 참조함 : InteractableComp.

다음에 의해서 참조됨 : OnSpeakStageSpeakerChanged().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Multicast_PlayAnimation()

void AWheatly::Multicast_PlayAnimation ( EWheatlyAnim  InAnimType)
protected

애니메이션 재생 (멀티캐스트 RPC)

매개변수
InAnimType[in] 재생할 애니메이션 타입

다음에 의해서 참조됨 : PlayAnimation().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnInteractionTriggered()

void AWheatly::OnInteractionTriggered ( class AActor *  InteractingActor)
protected

플레이어 상호작용 핸들러

매개변수
InteractingActor[in] 상호작용을 시도하는 액터

AWheatly.cpp 파일의 336 번째 라인에서 정의되었습니다.

337{
338 if (!HasAuthority() || !SpeakStageActor)
339 return;
340
341 APlayerActor* InteractingPlayer = Cast<APlayerActor>(InteractingActor);
342 if (!InteractingPlayer)
343 return;
344
345 auto PC = Cast<APlayerControl>(InteractingPlayer->GetController());
346
347 // 플레이어의 SpeakQuest 완료 여부 확인
348 if (auto PS = InteractingPlayer->GetPlayerState<ALingoPlayerState>())
349 {
350 if (PS->IsSpeakQuestCompleted())
351 {
352 if ( PC )
353 PC->Client_ToastMessage(TEXT("Already Clear SpeakQuest"));
354
355 return;
356 }
357 }
358
359 // SpeakStage의 상태를 직접 확인
360 if (ALingoPlayerState* CurrentSpeaker = SpeakStageActor->GetCurrentSpeaker())
361 {
362 if ( PC )
363 PC->Client_ToastMessage(FString::Printf(TEXT("Current Turn is [%s]"), *ULingoGameHelper::GetPlayerNameFromState(CurrentSpeaker)));
364
365 return;
366 }
367
368 if ( PC )
369 PC->Client_RequestSpeakScenario(this);
370
371 // 마커 표시
372 if (ALingoGameState* GS = GetWorld()->GetGameState<ALingoGameState>())
373 {
374 GS->SetAllCompassVisibility(false);
375 GS->SetCompassVisibilityByTag("WriteQuest", true);
376 }
377}
Main character driven directly by the player.
static FString GetPlayerNameFromState(const class ALingoPlayerState *PlayerState)
PlayerState에서 PlayerControl을 통해 사용자 이름 가져오기

다음을 참조함 : ULingoGameHelper::GetPlayerNameFromState(), SpeakStageActor.

다음에 의해서 참조됨 : BeginPlay().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnOutlineStateChanged()

void AWheatly::OnOutlineStateChanged ( bool  bShouldShowOutline)
protected

Outline 상태 변경 핸들러

매개변수
bShouldShowOutline[in] 아웃라인 표시 여부

AWheatly.cpp 파일의 379 번째 라인에서 정의되었습니다.

380{
381 if (MeshComponent)
382 {
383 MeshComponent->SetRenderCustomDepth(bShouldShowOutline);
384 }
385}

다음을 참조함 : MeshComponent.

다음에 의해서 참조됨 : BeginPlay().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnRep_EyeColor()

void AWheatly::OnRep_EyeColor ( )
protected

AWheatly.cpp 파일의 443 번째 라인에서 정의되었습니다.

444{
446}
void ChangeEyeColor(FLinearColor newColor)
눈 색상 변경
Definition AWheatly.cpp:474

다음을 참조함 : ChangeEyeColor(), ReplicatedEyeColor.

다음에 의해서 참조됨 : OnSpeakStageSpeakerChanged().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnRep_EyeSightState()

void AWheatly::OnRep_EyeSightState ( )
protected

AWheatly.cpp 파일의 448 번째 라인에서 정의되었습니다.

449{
451}
void ApplyEyeSight()
Definition AWheatly.cpp:453

다음을 참조함 : ApplyEyeSight().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnSpeakStageSpeakerChanged()

void AWheatly::OnSpeakStageSpeakerChanged ( class APlayerState *  NewSpeaker)
protected

SpeakStage의 발화자 변경 이벤트 핸들러

매개변수
NewSpeaker[in] 새로운 발화자 (없으면 nullptr)

AWheatly.cpp 파일의 387 번째 라인에서 정의되었습니다.

388{
389 // 눈 색상 변경은 서버에서만
390 if (HasAuthority())
391 {
392 ReplicatedEyeColor = (NewSpeaker != nullptr)
393 ? FLinearColor(1.0f, 1.0f, 0.0f, 1.0f) // Yellow: Busy
394 : FLinearColor(0.0f, 0.5f, 1.0f, 1.0f); // Blue: Available
395
397 }
398
399 // 위젯 표시 제어는 모든 클라이언트에서 실행
400 if (!InteractableComp)
401 return;
402
403 // 로컬 플레이어 확인
404 if ( auto LocalPawn = ULingoGameHelper::GetLocalPawn(GetWorld()) )
405 {
406 auto LocalPlayerState = LocalPawn->GetPlayerState<ALingoPlayerState>();
407
408 // 로컬 플레이어가 현재 발화자인지 확인
409 if (LocalPlayerState && NewSpeaker && LocalPlayerState == NewSpeaker)
410 {
411 // 발화자이면 위젯 숨김
412 InteractableComp->SetWidgetVisibility(false);
413 PRINTLOG(TEXT("[AWheatly] Local player is speaker - hiding widget"));
414 }
415 else
416 {
417 // 발화자가 아니면, DetectionRange 내에 있을 때만 위젯 표시
418 if (InteractableComp->DetectionRange)
419 {
420 if ( IsInRange(LocalPawn))
421 {
422 InteractableComp->SetWidgetVisibility(true);
423 PRINTLOG(TEXT("[AWheatly] Local player not speaker and in range - showing widget"));
424 }
425 }
426 }
427 }
428}
bool IsInRange(const class APawn *LocalPawn) const
Definition AWheatly.cpp:430
void OnRep_EyeColor()
Definition AWheatly.cpp:443
static APawn * GetLocalPawn(const UObject *WorldContextObject)

다음을 참조함 : ULingoGameHelper::GetLocalPawn(), InteractableComp, IsInRange(), OnRep_EyeColor(), PRINTLOG, ReplicatedEyeColor.

다음에 의해서 참조됨 : SetSpeakStageActor().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PlayAnimation()

void AWheatly::PlayAnimation ( EWheatlyAnim  InAnimType)

특정 애니메이션 재생 (서버에서 호출)

매개변수
InAnimType[in] 재생할 애니메이션 타입

AWheatly.cpp 파일의 244 번째 라인에서 정의되었습니다.

245{
246 SetAnimationType(InAnimType);
247
248 // 서버에서만 Multicast 호출
249 if (HasAuthority())
250 Multicast_PlayAnimation(InAnimType);
251}
void Multicast_PlayAnimation(EWheatlyAnim InAnimType)
애니메이션 재생 (멀티캐스트 RPC)
FORCEINLINE void SetAnimationType(EWheatlyAnim InAnimType)
애니메이션 타입 설정
Definition AWheatly.h:48

다음을 참조함 : Multicast_PlayAnimation(), SetAnimationType().

다음에 의해서 참조됨 : BeginPlay().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetAnimationType()

FORCEINLINE void AWheatly::SetAnimationType ( EWheatlyAnim  InAnimType)
inline

애니메이션 타입 설정

매개변수
InAnimType[in] 설정할 애니메이션 타입

AWheatly.h 파일의 48 번째 라인에서 정의되었습니다.

48{ AnimType = InAnimType; }
EWheatlyAnim AnimType
현재 애니메이션 타입
Definition AWheatly.h:158

다음에 의해서 참조됨 : PlayAnimation().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetCompassMarkerInto()

void AWheatly::SetCompassMarkerInto ( ECompassMarkerType  InMarkerType)
overrideprotectedvirtual

ICompassTargetInterface(으)로부터 재구현되었습니다.

AWheatly.cpp 파일의 465 번째 라인에서 정의되었습니다.

466{
467 MarkerType = InMarkerType;
468}

다음을 참조함 : ICompassTargetInterface::MarkerType.

◆ SetShowOnCompass()

virtual void ICompassTargetInterface::SetShowOnCompass ( bool  bShow)
inlinevirtualinherited

CompassTargetInterface.h 파일의 33 번째 라인에서 정의되었습니다.

◆ SetSpeakStageActor()

void AWheatly::SetSpeakStageActor ( class ASpeakStageActor InSpeakStageActor)

SpeakStage 설정 (GameMode에서 호출)

매개변수
InSpeakStageActor[in] 연결할 SpeakStageActor

AWheatly.cpp 파일의 270 번째 라인에서 정의되었습니다.

271{
272 // 기존 SpeakStage가 있다면 이벤트 바인딩 해제
273 if (SpeakStageActor)
274 SpeakStageActor->OnSpeakerChanged.RemoveDynamic(this, &AWheatly::OnSpeakStageSpeakerChanged);
275
276 SpeakStageActor = InSpeakStageActor;
277
278 // 새로운 SpeakStage에 이벤트 바인딩
279 if (SpeakStageActor)
280 {
281 SpeakStageActor->OnSpeakerChanged.AddDynamic(this, &AWheatly::OnSpeakStageSpeakerChanged);
282 // 초기 상태 동기화
283 OnSpeakStageSpeakerChanged(SpeakStageActor->GetCurrentSpeaker());
284 }
285}
void OnSpeakStageSpeakerChanged(class APlayerState *NewSpeaker)
SpeakStage의 발화자 변경 이벤트 핸들러
Definition AWheatly.cpp:387

다음을 참조함 : ASpeakStageActor::OnSpeakerChanged, OnSpeakStageSpeakerChanged(), SpeakStageActor.

다음에 의해서 참조됨 : BeginPlay().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ShouldShowOnCompass()

virtual bool ICompassTargetInterface::ShouldShowOnCompass ( ) const
inlinevirtualinherited

CompassTargetInterface.h 파일의 32 번째 라인에서 정의되었습니다.

32{return bShowOnCompass;}

다음에 의해서 참조됨 : APlayerActor::UpdateCompassMarkers().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SyncSpeakScenarioData()

void AWheatly::SyncSpeakScenarioData ( class APlayerActor Player,
const struct FResponseSpeakScenario Data 
)

Client에서 받은 시나리오 데이터를 동기화 (Server에서 호출됨)

매개변수
Player[in] 요청한 플레이어
Data[in] Client에서 받은 시나리오 데이터

AWheatly.cpp 파일의 301 번째 라인에서 정의되었습니다.

302{
303 if (!HasAuthority())
304 return;
305
306 // Player가 유효한지 확인
307 if (!Player)
308 {
309 PRINTLOG(TEXT("[AWheatly] SyncSpeakScenarioData: Player is null"));
310 return;
311 }
312
313 // PlayerState에 데이터 저장
314 if (auto PS = Player->GetPlayerState<ALingoPlayerState>())
315 {
316 PS->SpeakScenarioData = Data;
317 PS->OnUpdateSpeakScenarioData();
318
319 PRINTLOG(TEXT("[AWheatly] SyncSpeakScenarioData: Successfully synced scenario data for %s"),
321 }
322 else
323 {
324 PRINTLOG(TEXT("[AWheatly] SyncSpeakScenarioData: Failed to get PlayerState"));
325
326 // 실패 시 SpeakStage를 종료
327 if (SpeakStageActor && SpeakStageActor->GetCurrentSpeaker())
328 SpeakStageActor->EndStage();
329 }
330}

다음을 참조함 : ULingoGameHelper::GetPlayerNameFromState(), PRINTLOG, SpeakStageActor.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ Tick()

void AWheatly::Tick ( float  DeltaSeconds)
overridevirtual

AWheatly.cpp 파일의 160 번째 라인에서 정의되었습니다.

161{
162 Super::Tick(DeltaSeconds);
163
164 if (!SpeakStageActor)
165 return;
166
167 // 퀘스트 진행 중일 때
168 if (auto CurrentSpeaker = SpeakStageActor->GetCurrentSpeaker())
169 {
170 if (HasAuthority())
171 {
172 if (auto SpeakerPawn = CurrentSpeaker->GetPawn())
173 {
174 ReplicatedEyeSightEnd = SpeakerPawn->GetActorLocation();
175 bEyeSightVisible = true;
176
178
179 // 스피커를 쳐다보도록 회전
180 FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(GetActorLocation(), SpeakerPawn->GetActorLocation());
181 FRotator TargetRotation( LookAtRotation.Pitch, LookAtRotation.Yaw, 0); // Yaw만 사용
182 SetActorRotation(FMath::RInterpTo(GetActorRotation(), TargetRotation, DeltaSeconds, 5.0f));
183 }
184 }
185 }
186 // 퀘스트 진행 중이 아닐 때
187 else
188 {
189 if (HasAuthority())
190 {
191 bEyeSightVisible = false;
192
194 }
195
196 TArray<AActor*> OverlappingActors;
198 PlayerDetectionZone->GetOverlappingActors(OverlappingActors, APlayerActor::StaticClass());
199
200 APawn* NearestPawn = nullptr;
201 double MinDistanceSquared = MAX_dbl;
202
203 for (AActor* OverlappingActor : OverlappingActors)
204 {
205 if (APawn* Pawn = Cast<APawn>(OverlappingActor))
206 {
207 double DistanceSquared = FVector::DistSquared(GetActorLocation(), Pawn->GetActorLocation());
208 if (DistanceSquared < MinDistanceSquared)
209 {
210 MinDistanceSquared = DistanceSquared;
211 NearestPawn = Pawn;
212 }
213 }
214 }
215
216 if(NearestPawn)
217 {
218 // LineTrace로 시야 확인
219 FHitResult HitResult;
220 FVector StartLocation = EyeMesh->GetComponentLocation();
221 FVector EndLocation = NearestPawn->GetActorLocation();
222 FCollisionQueryParams CollisionParams;
223 CollisionParams.AddIgnoredActor(this); // 자기 자신은 무시
224
225 bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, ECC_Visibility, CollisionParams);
226
227 // 아무것도 맞지 않았거나, 맞은 대상이 목표한 폰일 경우에만 시야가 확보된 것으로 간주
228 if (!bHit || (bHit && HitResult.GetActor() == NearestPawn))
229 {
230 // 가장 가까운 플레이어를 쳐다보도록 회전
231 FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(EyeMesh->GetComponentLocation(), NearestPawn->GetActorLocation());
232 FRotator TargetRotation( LookAtRotation.Pitch, LookAtRotation.Yaw, 0); // Yaw만 사용
233 SetActorRotation(FMath::RInterpTo(GetActorRotation(), TargetRotation, DeltaSeconds, 2.0f));
234 }
235 }
236 }
237}

다음을 참조함 : ApplyEyeSight(), bEyeSightVisible, EyeMesh, PlayerDetectionZone, ReplicatedEyeSightEnd, SpeakStageActor.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateEyeSight()

void AWheatly::UpdateEyeSight ( const FVector &  Start,
const FVector &  End 
)
private

AWheatly.cpp 파일의 483 번째 라인에서 정의되었습니다.

484{
485 FVector Delta = End - Start;
486 float Length = Delta.Size();
487 if (Length <= KINDA_SMALL_NUMBER)
488 {
489 EyeSightComp->SetVisibility(false);
490 return;
491 }
492
493 FVector Midpoint = Start + (Delta * 0.5f);
494 EyeSightComp->SetWorldLocation(Midpoint);
495
496 FVector Direction = Delta / Length;
497 FRotator Rotation = FRotationMatrix::MakeFromZ(Direction).Rotator();
498 EyeSightComp->SetWorldRotation(Rotation);
499
500 const float LengthScale = Length / FMath::Max(IndicatorBaseLength, KINDA_SMALL_NUMBER);
501 const float TargetThickness = 10.f; // Desired thickness
502 const float MeshDiameter = FMath::Max(IndicatorBaseRadius * 2.0f, KINDA_SMALL_NUMBER);
503 const float RadiusScale = (TargetThickness / MeshDiameter)*2.5f;
504
505 EyeSightComp->SetWorldScale3D(FVector(RadiusScale, RadiusScale, LengthScale));
506 EyeSightComp->SetVisibility(true);
507}

다음을 참조함 : EyeSightComp, IndicatorBaseLength, IndicatorBaseRadius.

다음에 의해서 참조됨 : ApplyEyeSight().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ AnimSequences

TMap<EWheatlyAnim, TObjectPtr<class UAnimSequence> > AWheatly::AnimSequences
protected

애니메이션 시퀀스 맵

AWheatly.h 파일의 141 번째 라인에서 정의되었습니다.

◆ AnimType

EWheatlyAnim AWheatly::AnimType
private

현재 애니메이션 타입

AWheatly.h 파일의 158 번째 라인에서 정의되었습니다.

◆ bEyeSightVisible

bool AWheatly::bEyeSightVisible = false
private

AWheatly.h 파일의 155 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ApplyEyeSight(), GetLifetimeReplicatedProps(), Tick().

◆ bShowDebugInfo

bool AWheatly::bShowDebugInfo = true
private

AWheatly.h 파일의 163 번째 라인에서 정의되었습니다.

◆ bShowOnCompass

bool ICompassTargetInterface::bShowOnCompass = true
inherited

CompassTargetInterface.h 파일의 27 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : APlayerActor::APlayerActor().

◆ CurAnimDuration

float AWheatly::CurAnimDuration
private

현재 재생 중인 애니메이션 길이 (초)

AWheatly.h 파일의 161 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly().

◆ EyeMaterial

TObjectPtr<class UMaterialInstanceDynamic> AWheatly::EyeMaterial
protected

동적 머티리얼 인스턴스 (런타임 색상 변경)

AWheatly.h 파일의 134 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : BeginPlay(), ChangeEyeColor().

◆ EyeMesh

TObjectPtr<class UStaticMeshComponent> AWheatly::EyeMesh
protected

상호작용 중인 플레이어 표시기

AWheatly.h 파일의 114 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), ApplyEyeSight(), Tick().

◆ EyeSightComp

TObjectPtr<class UStaticMeshComponent> AWheatly::EyeSightComp
protected

상호작용 중인 플레이어 표시기

AWheatly.h 파일의 122 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), ApplyEyeSight(), BeginPlay(), UpdateEyeSight().

◆ EyeTraceMaterial

TObjectPtr<class UMaterialInstanceDynamic> AWheatly::EyeTraceMaterial
protected

AWheatly.h 파일의 137 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : BeginPlay(), ChangeEyeColor().

◆ IndicatorBaseLength

float AWheatly::IndicatorBaseLength = 1.0f
private

AWheatly.h 파일의 165 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), UpdateEyeSight().

◆ IndicatorBaseRadius

float AWheatly::IndicatorBaseRadius = 1.0f
private

AWheatly.h 파일의 166 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), UpdateEyeSight().

◆ InteractableComp

TObjectPtr<class UInteractableComponent> AWheatly::InteractableComp
protected

상호작용 컴포넌트

AWheatly.h 파일의 126 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), BeginPlay(), IsInRange(), OnSpeakStageSpeakerChanged().

◆ MarkerType

◆ MeshComponent

TObjectPtr<class USkeletalMeshComponent> AWheatly::MeshComponent
protected

스켈레탈 메시 컴포넌트

AWheatly.h 파일의 110 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), BeginPlay(), OnOutlineStateChanged().

◆ PlayerDetectionZone

TObjectPtr<class UBoxComponent> AWheatly::PlayerDetectionZone
protected

플레이어 감지 영역

AWheatly.h 파일의 118 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), Tick().

◆ ReplicatedEyeColor

FLinearColor AWheatly::ReplicatedEyeColor
private

AWheatly.h 파일의 148 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : GetLifetimeReplicatedProps(), OnRep_EyeColor(), OnSpeakStageSpeakerChanged().

◆ ReplicatedEyeSightEnd

FVector AWheatly::ReplicatedEyeSightEnd = FVector::ZeroVector
private

AWheatly.h 파일의 152 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ApplyEyeSight(), GetLifetimeReplicatedProps(), Tick().

◆ SpeakStageActor

TObjectPtr<class ASpeakStageActor> AWheatly::SpeakStageActor
private

AWheatly.h 파일의 145 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : BeginPlay(), OnInteractionTriggered(), SetSpeakStageActor(), SyncSpeakScenarioData(), Tick().

◆ WidgetComp

TObjectPtr<class UWidgetComponent> AWheatly::WidgetComp
protected

위젯 컴포넌트 (상호작용 UI 표시)

AWheatly.h 파일의 130 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AWheatly(), BeginPlay().


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: