KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
ADropper.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025.
2// Proprietary and confidential.
3
4#include "ADropper.h"
5
6#include "Luggage.h"
7#include "Food.h"
8#include "GameLogging.h"
9#include "Components/SkeletalMeshComponent.h"
10#include "Components/SceneComponent.h"
11#include "Components/StaticMeshComponent.h"
12#include "TimerManager.h"
13#include "UDialogManager.h"
14#include "Net/UnrealNetwork.h"
15
17{
18 PrimaryActorTick.bCanEverTick = false;
19 bReplicates = true;
20
21 // Root
22 USceneComponent* Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
23 RootComponent = Root;
24
25 // SkeletalMesh
26 SkeletalMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMesh"));
27 SkeletalMesh->SetupAttachment(RootComponent);
28
29 // Collision Mesh
30 BoxCollision = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BoxCollision"));
31 BoxCollision->SetupAttachment(SkeletalMesh);
32 BoxCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
33 BoxCollision->SetCollisionResponseToAllChannels(ECR_Block);
34
35 // Spawn Position
36 SpawnPos = CreateDefaultSubobject<USceneComponent>(TEXT("SpawnPos"));
37 SpawnPos->SetupAttachment(SkeletalMesh);
38}
39
40void ADropper::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
41{
42 Super::GetLifetimeReplicatedProps(OutLifetimeProps);
43
44 DOREPLIFETIME(ADropper, SpawnClass);
45 DOREPLIFETIME(ADropper, NextData);
46 DOREPLIFETIME(ADropper, bIsSpawnIng);
47}
48
50{
51 PRINTLOG(TEXT("Dropper GUID = %s, Authority=%d"),
52 *GetPathName(), HasAuthority());
53
54 if (!SpawnClass || !SpawnPos)
55 return false;
56
57 if (bIsSpawnIng)
58 return false;
59
60 if (HasAuthority())
61 Spawn();
62 else
64
65 return true;
66}
67
69{
70 if (!HasAuthority())
71 return;
72
73 if (!SpawnClass || !SpawnPos)
74 {
75 PRINTLOG(TEXT("ADropper::SpawnInternal - Invalid data"));
76 bIsSpawnIng = false;
77 return;
78 }
79
80 FActorSpawnParameters Params;
81 Params.Owner = this;
82 Params.Instigator = GetInstigator();
83
84 // 실제 스폰
85 AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(
87 SpawnPos->GetComponentLocation(),
88 SpawnPos->GetComponentRotation(),
89 Params
90 );
91
92 if (!SpawnedActor)
93 {
94 bIsSpawnIng = false;
95 return;
96 }
97
98 bIsSpawnIng = true;
99
100 // 애니메이션 실행
103
104 FTimerHandle TimerHandle;
105 GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([this, SpawnedActor]
106 {
107
108 // 데이터 전달
109 if (auto tmpLuggage = Cast<Aluggage>(SpawnedActor))
110 {
111 tmpLuggage->SetLuggageInfo(NextData.SpawnIndex, NextData.word2.name, NextData.word1.name);
112
113 int32 ColorIdx = FCString::Atoi(*NextData.word2.code);
114 tmpLuggage->ApplyColorToMesh(ColorIdx);
115
116 int32 PatternIdx = FCString::Atoi(*NextData.word1.code);
117 tmpLuggage->ApplyPatternToMesh(PatternIdx);
118 }
119
120 }), 1.f, false);
121
122 // 2초 뒤 충돌 OFF → 다시 ON
123 GetWorldTimerManager().SetTimer(
125 this,
127 2.0f,
128 false
129 );
130}
131
132void ADropper::Server_Spawn_Implementation()
133{
134 PRINTLOG(TEXT("Dropper Authority=%d RemoteRole=%d"), HasAuthority(), (int)GetRemoteRole());
135
136 Spawn();
137}
138
140{
141 if (!HasAuthority())
142 return;
143
145
146 GetWorldTimerManager().SetTimer(
148 this,
150 2.0f,
151 false
152 );
153}
154
156{
157 if (!HasAuthority())
158 return;
159
161 bIsSpawnIng = false;
162}
163
164void ADropper::Multicast_PlayAnimation_Implementation()
165{
167 SkeletalMesh->PlayAnimation(AnimToPlay, false);
168}
169
170void ADropper::Multicast_DisableCollision_Implementation()
171{
172 if (BoxCollision)
173 BoxCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);
174}
175
176void ADropper::Multicast_RestoreCollision_Implementation()
177{
178 if (BoxCollision)
179 {
180 BoxCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
181 BoxCollision->SetCollisionResponseToAllChannels(ECR_Block);
182 }
183}
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
UDialogManager 클래스를 선언합니다.
void OnRestoreCompleted()
Definition ADropper.cpp:155
void Server_Spawn()
void Multicast_PlayAnimation()
애니메이션 재생
TSubclassOf< AActor > SpawnClass
이번 스폰에서 사용할 클래스
Definition ADropper.h:103
void Multicast_DisableCollision()
충돌 비활성화
FLuggageData NextData
이번 스폰에서 사용할 데이터
Definition ADropper.h:107
void Spawn()
서버에서만 실행되는 실제 스폰 로직
Definition ADropper.cpp:68
TObjectPtr< UAnimationAsset > AnimToPlay
드랍 시 재생할 애니메이션
Definition ADropper.h:99
TObjectPtr< USceneComponent > SpawnPos
스폰 위치
Definition ADropper.h:87
TObjectPtr< USkeletalMeshComponent > SkeletalMesh
드랍퍼 스켈레탈 메시
Definition ADropper.h:91
void Multicast_RestoreCollision()
충돌 복구
TObjectPtr< UStaticMeshComponent > BoxCollision
충돌 박스
Definition ADropper.h:95
void OnDelayCompleted()
Definition ADropper.cpp:139
FTimerHandle DelayTimerHandle
Definition ADropper.h:117
bool RequestSpawn()
스폰 요청 (서버에서만 동작)
Definition ADropper.cpp:49
bool bIsSpawnIng
이번 스폰에서 사용할 데이터
Definition ADropper.h:115
virtual void GetLifetimeReplicatedProps(TArray< FLifetimeProperty > &OutLifetimeProps) const override
Definition ADropper.cpp:40
FTimerHandle RestoreTimerHandle
Definition ADropper.h:118
FWordInfo word1
시나리오 단어 정보
Definition ADropper.h:18
FWordInfo word2
Definition ADropper.h:21
int32 SpawnIndex
스폰 인덱스(선택적으로 사용)
Definition ADropper.h:25
FString code
FString name