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

#include <ConveyorBelt.h>

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

Public 멤버 함수

 AConveyorBelt ()
 
void ChangeConveyorMovement ()
 
void ChangeConveyorSpeed (float NewSpeed)
 
void InitConveyorBelt ()
 
void Multicast_ChangeConveyorSpeed (float NewSpeed)
 
void MulticastRPC_ChangeConveyorMovement ()
 
void MulticastRPC_InitConveyorBelt ()
 
void Server_ChangeConveyorSpeed (float NewSpeed)
 
void ServerRPC_ChangeConveyorMovement ()
 
void ServerRPC_InitConveyorBelt ()
 
virtual void Tick (float DeltaTime) override
 컨베이어 벨트 Tick
 

Protected 멤버 함수

virtual void BeginPlay () override
 
void MoveOverlappedSkeletals (float deltaDistance)
 
void MoveOverlappedStatics (float deltaDistance)
 정적 오브젝트 (Luggage) 이동 처리
 

Protected 속성

TObjectPtr< class UBoxComponent > BeltBoxComp
 
TObjectPtr< class UStaticMeshComponent > BeltComp
 
bool bIsForward = true
 
TObjectPtr< class UArrowComponent > MoveDirArrowComp
 
float MoveSpeed = 200.f
 
TObjectPtr< class USceneComponent > RootSceneComp
 

상세한 설명

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

생성자 & 소멸자 문서화

◆ AConveyorBelt()

AConveyorBelt::AConveyorBelt ( )

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

18{
19 // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
20 PrimaryActorTick.bCanEverTick = true;
21
22 RootSceneComp = CreateDefaultSubobject<USceneComponent>(TEXT("RootSceneComp"));
23 SetRootComponent(RootSceneComp);
24
25 BeltComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BeltComp"));
26 ConstructorHelpers::FObjectFinder<UStaticMesh> beltMeshRef(TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'"));
27 if (beltMeshRef.Succeeded())
28 {
29 BeltComp->SetStaticMesh(beltMeshRef.Object);
30 BeltComp->SetRelativeScale3D(FVector(1.5,5.5,0.05));
31 BeltComp->SetupAttachment(GetRootComponent());
32 }
33
34 BeltBoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BeltBoxComp"));
35 BeltBoxComp->SetupAttachment(GetRootComponent());
36 BeltBoxComp->SetBoxExtent(FVector(75,275,5));
37
38 MoveDirArrowComp = CreateDefaultSubobject<UArrowComponent>(TEXT("MoveDirArrowComp"));
39 MoveDirArrowComp->SetupAttachment(GetRootComponent());
40 MoveDirArrowComp->SetRelativeRotation(FRotator(0, 90, 0));
41
42 // Set Collision Preset
43 BeltComp->SetCollisionProfileName(TEXT("BlockAllDynamic"));
44 BeltBoxComp->SetCollisionProfileName(TEXT("ConveyorBelt"));
45}
TObjectPtr< class USceneComponent > RootSceneComp
TObjectPtr< class UStaticMeshComponent > BeltComp
TObjectPtr< class UBoxComponent > BeltBoxComp
TObjectPtr< class UArrowComponent > MoveDirArrowComp

다음을 참조함 : BeltBoxComp, BeltComp, MoveDirArrowComp, RootSceneComp.

멤버 함수 문서화

◆ BeginPlay()

void AConveyorBelt::BeginPlay ( )
overrideprotectedvirtual

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

49{
50 Super::BeginPlay();
51
52}

◆ ChangeConveyorMovement()

void AConveyorBelt::ChangeConveyorMovement ( )

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

87{
89}
void ServerRPC_ChangeConveyorMovement()

다음을 참조함 : ServerRPC_ChangeConveyorMovement().

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

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

◆ ChangeConveyorSpeed()

void AConveyorBelt::ChangeConveyorSpeed ( float  NewSpeed)

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

103{
105}
void Server_ChangeConveyorSpeed(float NewSpeed)

다음을 참조함 : Server_ChangeConveyorSpeed().

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

◆ InitConveyorBelt()

void AConveyorBelt::InitConveyorBelt ( )

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

72{
74}
void ServerRPC_InitConveyorBelt()

다음을 참조함 : ServerRPC_InitConveyorBelt().

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

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

◆ MoveOverlappedSkeletals()

void AConveyorBelt::MoveOverlappedSkeletals ( float  deltaDistance)
protected

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

118{
119 TArray<AActor*> overlappedActors;
120 BeltBoxComp->GetOverlappingActors(overlappedActors);
121 for (const auto& actor : overlappedActors)
122 {
123 if (Cast<APlayerActor>(actor) || Cast<ANPCBase>(actor))
124 {
125 FVector deltaLoc = MoveDirArrowComp->GetForwardVector() * deltaDistance;
126 deltaLoc = bIsForward ? deltaLoc : -deltaLoc;
127 actor->AddActorWorldOffset(deltaLoc);
128 }
129 }
130}

다음을 참조함 : BeltBoxComp, bIsForward, MoveDirArrowComp.

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

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

◆ MoveOverlappedStatics()

void AConveyorBelt::MoveOverlappedStatics ( float  deltaDistance)
protected

정적 오브젝트 (Luggage) 이동 처리

[문제 1] 기존에는 클라이언트/서버 모두 물리 이동 처리하여 충돌 발생 [해결 1] 서버 전용 Tick으로 변경하여 물리 복제 충돌 제거

[문제 2] AddForce 방식은 매 프레임 누적되어 무한 가속됨 [해결 2] SetPhysicsLinearVelocity로 일정 속도 유지

  • 서버 전용 실행이므로 네트워크 충돌 없음
  • Z축 속도는 유지하여 중력 영향 보존

[개선] SetPhysicsLinearVelocity로 일정 속도 유지

  • AddForce는 매 프레임 누적되어 무한 가속되므로 부적합
  • 서버 전용 실행이므로 클라이언트와 충돌 없음
  • Z축 속도는 유지하여 중력/점프 등 유지

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

143{
144 TArray<UPrimitiveComponent*> overlappedComponents;
145 BeltBoxComp->GetOverlappingComponents(overlappedComponents);
146
147 for (const auto& comp : overlappedComponents)
148 {
149 AActor* owner = comp->GetOwner();
150 Aluggage* luggage = Cast<Aluggage>(owner);
151 AFood* Food = Cast<AFood>(owner);
152
153 if (!Food && !luggage) continue; // 둘 다 아니면 스킵
154 if (!Cast<UStaticMeshComponent>(comp)) continue;
155
156 // [개선] Luggage의 경우 Hook이나 PickUp 중이면 컨베이어 이동 무시
157 // bIsPickedUp은 이제 복제되므로 서버에서 정확한 상태 확인 가능
158 if (luggage)
159 {
160 if (luggage->InteractableComp && luggage->InteractableComp->IsPickedUp())
161 {
162 continue;
163 }
164
165 // [개선] Hook 중이면 컨베이어 이동 무시
166 if (luggage->bIsBeingHooked)
167 {
168 continue;
169 }
170 }
171
172 FVector moveDirection = MoveDirArrowComp->GetForwardVector();
173 moveDirection = bIsForward ? moveDirection : -moveDirection;
174
175 // 물리 객체인지 확인
176 UPrimitiveComponent* primComp = Cast<UPrimitiveComponent>(comp);
177 if (primComp && primComp->IsSimulatingPhysics())
178 {
185 FVector targetVelocity = moveDirection * MoveSpeed;
186 FVector currentVelocity = primComp->GetPhysicsLinearVelocity();
187
188 // Z축 속도는 현재 속도 유지 (중력, 점프 등)
189 FVector newVelocity = targetVelocity;
190 newVelocity.Z = currentVelocity.Z;
191
192 primComp->SetPhysicsLinearVelocity(newVelocity, false);
193 }
194 else
195 {
196 // 물리가 아닌 경우 (Hook/PickUp 중) - 이동하지 않음
197 // Hook 중에는 물리가 꺼져있으므로 여기서 멈춤
198 }
199 }
200}
Definition Food.h:37
상호작용 가능한 수하물 액터
Definition luggage.h:15
bool bIsBeingHooked
훅 중 플래그 (복제됨)
Definition luggage.h:55
TObjectPtr< class UInteractableComponent > InteractableComp
Definition luggage.h:38

다음을 참조함 : BeltBoxComp, Aluggage::bIsBeingHooked, bIsForward, Food, Aluggage::InteractableComp, MoveDirArrowComp, MoveSpeed.

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

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

◆ Multicast_ChangeConveyorSpeed()

void AConveyorBelt::Multicast_ChangeConveyorSpeed ( float  NewSpeed)

◆ MulticastRPC_ChangeConveyorMovement()

void AConveyorBelt::MulticastRPC_ChangeConveyorMovement ( )

◆ MulticastRPC_InitConveyorBelt()

void AConveyorBelt::MulticastRPC_InitConveyorBelt ( )

◆ Server_ChangeConveyorSpeed()

void AConveyorBelt::Server_ChangeConveyorSpeed ( float  NewSpeed)

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

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

◆ ServerRPC_ChangeConveyorMovement()

void AConveyorBelt::ServerRPC_ChangeConveyorMovement ( )

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

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

◆ ServerRPC_InitConveyorBelt()

void AConveyorBelt::ServerRPC_InitConveyorBelt ( )

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

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

◆ Tick()

void AConveyorBelt::Tick ( float  DeltaTime)
overridevirtual

컨베이어 벨트 Tick

[문제] 기존에는 서버/클라이언트 구분 없이 이동 처리하여 물리 복제와 충돌 [해결] 서버에서만 이동 처리, 클라이언트는 복제로 동기화

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

60{
61 Super::Tick(DeltaTime);
62
63 // [개선] 서버에서만 이동 처리
64 if (!HasAuthority())
65 return;
66
69}
void MoveOverlappedStatics(float deltaDistance)
정적 오브젝트 (Luggage) 이동 처리
void MoveOverlappedSkeletals(float deltaDistance)

다음을 참조함 : MoveOverlappedSkeletals(), MoveOverlappedStatics(), MoveSpeed.

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

멤버 데이터 문서화

◆ BeltBoxComp

TObjectPtr<class UBoxComponent> AConveyorBelt::BeltBoxComp
protected

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

다음에 의해서 참조됨 : AConveyorBelt(), MoveOverlappedSkeletals(), MoveOverlappedStatics().

◆ BeltComp

TObjectPtr<class UStaticMeshComponent> AConveyorBelt::BeltComp
protected

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

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

◆ bIsForward

bool AConveyorBelt::bIsForward = true
protected

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

다음에 의해서 참조됨 : MoveOverlappedSkeletals(), MoveOverlappedStatics().

◆ MoveDirArrowComp

TObjectPtr<class UArrowComponent> AConveyorBelt::MoveDirArrowComp
protected

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

다음에 의해서 참조됨 : AConveyorBelt(), MoveOverlappedSkeletals(), MoveOverlappedStatics().

◆ MoveSpeed

float AConveyorBelt::MoveSpeed = 200.f
protected

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

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

◆ RootSceneComp

TObjectPtr<class USceneComponent> AConveyorBelt::RootSceneComp
protected

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

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


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