Unreal Engine#8에서 해결하고자 했던 문제를 해결 하였다. 해결 방법은 First_Person과 관련된 파일을 새롭게 덮어 씌우는 방식으로 해결했다. 저번에 문제의 원인을 확실하게 조사해놓은게 큰 도움이 됐다.
새로운 First_Person 프로젝트를 생성하고
기존 프로젝트의 First_Person에 덮어 씌워 문제를 해결했다.
그리고 Grabber Component에 새로운 기능을 추가했다. BP_Player의 시야에 Grabber Component가 Hit되는지 검사하기 위해 SweepSingleByChannel을 사용했다.
Unreal Engine의 공식문서 설명은 아래와 같다.
여기서 ECollisionChannel 으로 TraceChannel을 변수로 넣으라는 설명이 있는데 이는 Component의 채널 명을 말하는 것이다. Component의 채널명을 확인하는 방법은 프로젝트 폴더의 Config/DefaultEngine에서 확인 할 수 있다. (Name = "Grabber")
// Fill out your copyright notice in the Description page of Project Settings.
#include "Grabber.h"
#include "Engine/World.h"
#include "DrawDebugHelpers.h"
// Sets default values for this component's properties
UGrabber::UGrabber()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UGrabber::BeginPlay()
{
Super::BeginPlay();
// ...
}
// Called every frame
void UGrabber::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
FRotator MyRotation = GetComponentRotation();
FString RotationString = MyRotation.ToCompactString();
UE_LOG(LogTemp, Display, TEXT("Grabber: %s"),*RotationString);
// ...
FVector Start = GetComponentLocation();
FVector End = Start + GetForwardVector() * MaxGrabDistance;
DrawDebugLine(GetWorld(),Start,End, FColor::Red);
FCollisionShape Sphere = FCollisionShape::MakeSphere(GrabRadius);
FHitResult HitResult;
bool HasHit = GetWorld()->SweepSingleByChannel(HitResult, Start, End, FQuat::Identity, ECC_GameTraceChannel2,Sphere);
//UE_LOG(LogTemp, Display,TEXT("Original Damage is : %f"),Damage);
//float time = GetWorld()->TimeSeconds;
//UE_LOG(LogTemp, Display,TEXT("Current Time is : %f"),time);void PrintDamage(float Damage);
if(HasHit){
AActor* HitActor = HitResult.GetActor();
UE_LOG(LogTemp,Display,TEXT("Hit Actor: %s"), *HitActor->GetActorNameOrLabel());
}
else{
UE_LOG(LogTemp,Display,TEXT("No Actor Hit"));
}
}
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/SceneComponent.h"
#include "Grabber.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class CRYPTRAIDER_API UGrabber : public USceneComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UGrabber();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
private:
UPROPERTY(EditAnywhere)
float MaxGrabDistance = 400;
UPROPERTY(EditAnywhere)
float GrabRadius = 100;
};
그런데 이번에는 C++ Component가 보이지 않는 문제가 발생하였다.
이로인해 Component를 만들었지만 적용하지 못하게 되었다.
새로운 Component를 만들려 해도 이미 존재하는 컴포넌트로 나오고 폴더 내에도 생성이 완료 돼있는데 왜 안나오는지 이유를 알 수 없다. 이를 해결하기 위해 저번과 같이 공식문서, 커뮤니티 등의 도움을 받아 해결 해 볼 것이다. 이런 문제를 해결해나가는 과정에서 얻는 경험이 후에 큰 도움이 될 수 있을 것이라고 믿는다.