생성자도 제대로 생성하였고, 변수 선언 , UE_LOG등 어떤 부분에서도 문제를 찾을 수 없었다.
끝내 해결 할 수 있었지만 해결 방법은 문제가 발생한 TickComponent가 존재한 Trigger Scene Component를 삭제했다가 다시 삽입하는 것이 방법이였다.
그런데 TickComponent 문제를 해결 하였음에도 Trigger가 제대로 작동하지 않았다. 이 때문에 강의와 공식문서를 찾아보며 왜 작동하지 않는지 확인하였는데 아주 기초적인 실수를 하였다. Trigger를 삭제했다 다시 삽입 하였기에 기본 설정으로 돌아갔을 터인데 Trigger의 크기 설정을 하지 않은 점이 문제였다.
비정상
정상
TickComponent가 제대로 작동해 원하는 대로 석상이 Box Trigger 영역안에 들어갔을때 벽에 추가한 Mover Component가 작동하게 되었다. 원하는 것은 석상이 벽의 구멍안에 들어갔을때 석상과 벽이 지하로 같이 사라지는 것을 원하였는데 이가 완벽하게 구현되지는 않았다. 왜냐하면 석상과 벽은 다른 객체로 판단되기에 석상과 벽을 붙일 필요가 있었고 이를 위해 AttachToComponent를 사용하였다. AttachToComponent는 Actor의 RootComponent를 제공된 구성 요소에 선택적으로 명명된 소켓에 연결하는 것이다.
Trigger Component에서 Mover를 사용하기위해 의존성을 삽입하였다.
GetOverlappingActors를 이용해 액터가 겹치는 액터(구성요소와 겹치는 모든 구성요소) 목록을 반환하고 이 액터가 tag를 통해 얻은 결과를 return한다.
PrimitiveComponents는 일반적으로 충돌 데이터로 렌더링되거나 사용되는 일종의 형상을 포함하거나 생성하는 SceneComponent입니다.
만약 return 받은 결과가 null이 아니라면 의존성 삽입을 통해 이용가능한 Mover Component의 SetShouldMove(true)를 이용해 Mover를 이용한다.
(Mover.CPP)
// Fill out your copyright notice in the Description page of Project Settings.
#include "TriggerComponent.h"
//생성자
//라이브 코딩에서 생성자를 추가하더라도 적용되지 않는 경우가 있으니 에디터를 닫고 Run Build Task를 꼭 진행하라
UTriggerComponent::UTriggerComponent()
{
PrimaryComponentTick.bCanEverTick = true;
UE_LOG(LogTemp, Display,TEXT("Trigger constructing"));
}
void UTriggerComponent::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogTemp, Display,TEXT("Trigger Component Alive"));
}
void UTriggerComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// UE_LOG(LogTemp, Display,TEXT("Tick is suss"));
// 1111
AActor* Actor = GetAcceptableActor();
if(Actor!=nullptr){
UPrimitiveComponent* Component = Cast<UPrimitiveComponent>(Actor->GetRootComponent());
if(Component != nullptr){
Component->SetSimulatePhysics(false);
}
Actor->AttachToComponent(this,FAttachmentTransformRules::KeepWorldTransform);
Mover->SetShouldMove(true);
// UE_LOG(LogTemp,Display,TEXT("Unlocking"));
}
else{
Mover->SetShouldMove(false);
// UE_LOG(LogTemp,Display,TEXT("Relocking"));
}
// TArray<AActor*> Actors;
// //// 이 액터가 겹치는 액터(구성요소와 겹치는 모든 구성요소) 목록을 반환합니다.
// //// .num을 이용해 몇개의 액터가 들어있는지 확인 할 수 있다.
// //// 겹치는 액터가 하나 이상일때 작동하게 만들 수 있다.
// GetOverlappingActors(Actors);
// int32 index = 0;
// while(index<Actors.Num()){
// FString ActorName = Actors[index]->GetActorNameOrLabel();
// UE_LOG(LogTemp,Display,TEXT("OverLapping : %s"),*ActorName)
// index = index++;
// }
// for (int32 i = 0; i<Actors.Num(); i++){
// FString ActorName = Actors[i]->GetActorNameOrLabel();
// UE_LOG(LogTemp,Display,TEXT("OverLapping : %s"),*ActorName)
// }
//모든 액터를 순환하는 코드 액터 말고도 다른 여러 개 Type에 사용가능하다.
// for(AActor* Actor : Actors)
// {
// // FString ActorName = Actor->GetActorNameOrLabel();
// if(Actor->ActorHasTag(AcceptableActorTag)){
// // if(Actor->ActorHasTag("Unlock1")){
// UE_LOG(LogTemp,Display,TEXT("Unlocking"));
// }
// }
}
//22222
void UTriggerComponent::SetMover(UMover* NewMover){
//파라미터와 변수
Mover = NewMover;
}
AActor* UTriggerComponent::GetAcceptableActor() const{
TArray<AActor*> Actors;
GetOverlappingActors(Actors);
for(AActor* Actor:Actors){
bool HasAcceptableTag = Actor->ActorHasTag(AcceptableActorTag);
bool IsGrabbed = Actor->ActorHasTag("Grabbed");
if(HasAcceptableTag && !IsGrabbed){
return Actor;
}
}
return nullptr;
}
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/BoxComponent.h"
#include "C:\Users\82103\Documents\Unreal Projects\CryptRider\CryptRaiderSaveFile2\Source\CryptRaider\Mover.h"
#include "TriggerComponent.generated.h"
/**
*
*/
//블루프린트에서 컴포넌트를 생성할 수 있게 도와줌
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class CRYPTRAIDER_API UTriggerComponent : public UBoxComponent
{
GENERATED_BODY()
public:
UTriggerComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
UFUNCTION(BlueprintCallable)
//의존성 삽입
void SetMover(UMover* Mover);
private:
UPROPERTY(EditAnywhere)
FName AcceptableActorTag;
//의존성 삽입
UMover* Mover;
AActor* GetAcceptableActor() const;
};