이번에는 자동으로 벽이 내려가면서 통로가 열리는 것과 석상을 추가하였다.
통로가 열리면서 아래로 내려가는 것을 원하였기에 Mover 라는 c++ Class를 제작하였다.
//Mover.cpp
#include "Mover.h"
#include "Math/UnrealMathUtility.h"
// Sets default values for this component's properties
UMover::UMover()
{
// 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 UMover::BeginPlay()
{
Super::BeginPlay();
OriginalLocation = GetOwner()->GetActorLocation();
// ...
}
//컴포넌트를 통해 액터에게 사운드를 부여하거나 액터의 위치를 파악하거나 설정하는 등의 작업을 수행할려면 포인터를 액터에게 먼저 전달해야한다.
// Called every frame
void UMover::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (ShouldMove){
FVector CurrentLocation = GetOwner()->GetActorLocation();
FVector TargetLocation = OriginalLocation + MoveOffset;
float Speed = FVector::Distance(OriginalLocation, TargetLocation) / MoveTime;
FVector NewLocation = FMath::VInterpConstantTo(CurrentLocation, TargetLocation, DeltaTime, Speed);
GetOwner() -> SetActorLocation(NewLocation);
}
}
//Mover.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Math/UnrealMathUtility.h"
#include "Mover.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class CRYPTRAIDER_API UMover : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UMover();
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)
FVector MoveOffset;
UPROPERTY(EditAnywhere)
float MoveTime = 4;
UPROPERTY(EditAnywhere)
bool ShouldMove = false;
FVector OriginalLocation;
};
그리고 석상을 추가해 바라보는 시각과 현재 시간을 OUTLOG에 표출되게 하였다.
//GRABBER.CPP
// 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);
//float time = GetWorld()->TimeSeconds;
//UE_LOG(LogTemp, Display,TEXT("Current Time is : %f"),time);
}
Unreal Engine#7에서 생긴 문제를 해결하기 위해 오늘 많은 시간을 할애하였다. 결국 문제를 해결하지는 못했지만 문제의 원인을 찾는데에는 성공했다.
이를 해결하기 위해서 공식 문서, 레딧 등을 참고하였고 결국 유튜브를 통해 찾을 수 있었다.
해결 방법을 통해 나를 비롯한 수많은 사람들이 도움을 받은 모습이다.
'
문제의 원인을 찾기 정말 힘들었다.
결국 커뮤니티의 도움을 받아 원인을 찾을 수 있었다.
원인은 IMC_Default에 이동과 관련된 설정이 매핑되어 있지 않아 생긴 문제였다.
아래와 같이 매핑을 하나하나 추가하는 것은 무리가 있을 것임으로 다른 프로젝트에서 First_control과 관련된 파일을 복사해 붙여넣는 방식으로 해결해 볼까 싶다.