24.05.02 - 24.05.03
기획 구체적으로 나오기 전, 간략하게 구현해보고 있던 내용들
-- 아직 구체적인 컨텐츠 기획이 안나왔음. 캐릭터 관련 컨텐츠 구현을 위한 기본적인 인풋과 이동, 점프만 구현 ☑️
-- MagneticGlove
액터를 추가했음. 어차피 메시도 플레이어에 포함되어 있을거고, 탈부착하지 않을 것이기 때문에 플레이어 캐릭터가 가지고 있게끔 했다(생성될때 생성자에서 생성). 아직 옳은 구조인지 판단은 잘 안됨 ☑️
-- MagneticGlove
액터 삭제. 장갑의 기능이 사실상 자성이동밖에 없어서 기획자분께 문의 -> 그냥 외관상으로만 존재하기 때문에 캐릭터에게 속성만 나뉘어 부여하도록 결정 ☑️
-- 자성이 먹히는 Collision Channel을 생성하고, Line Trace을 사용해 구현할 예정. 자성 기둥, 자원들에 해당 콜리전 채널이 사용될 것 같다.
Magnetic Channel을 생성해 Pillar의 Collision Responses에서 Magnetic을 Block으로 설정
일단은 Line Trace로 구현했는데, Sweep으로 바꾸는게 나을까? 나중에 필요하다면 바꿔주자. 우선 내가 Tick에서 매번 이동 가능한 기둥을 탐색하고, 트레이스되면 하얀 테두리가 나오는 것(어떤 방식이든 간에..)처럼 포커싱 되는게 맞을 것 같다. 그리고 포커싱 된 상태로 입력이 들어오면 캐릭터를 그 방향으로 보내주는거지. 그럴려면 멤버변수로 지금 포커스된 대상이 있는지, 그 대상의 위치값을 가지고 있어야 함.
void ATrapperPlayer::FindMagneticPillar()
{
FVector Start = GetActorLocation();
FVector End = Start + GetActorForwardVector() * MagneticDistance;
DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, -1);
FHitResult Result;
bool HasHit = GetWorld()->LineTraceSingleByChannel(
Result,
Start,
End,
ECC_GameTraceChannel1
);
if (HasHit)
{
AActor* Target = Result.GetActor();
DrawDebugSphere(GetWorld(), Result.ImpactPoint, 10, 10, FColor::Red, false, -1);
bHasTarget = true;
TargetPosition = Target->GetActorLocation();
// TODO : 외곽선 테두리 그리기처럼 포커싱 효과 주기 -> 기획에서 어떤 효과인지 알려주면 진행
}
else
{
bHasTarget = false;
}
}
void ATrapperPlayer::MagneticMove()
{
if(!bCanMagneticMove) return;
FVector MoveDirection = (TargetPosition - GetActorLocation()).GetSafeNormal();
FVector MoveLocation = GetActorLocation() + (MoveDirection * Speed * GetWorld()->GetDeltaSeconds());
SetActorLocation(MoveLocation);
// 범위 내로 들어오면 false
}
void ATrapperPlayer::Interact(const FInputActionValue& Value)
{
float Data = Value.Get<float>();
if (Data && bHasTarget)
{
bCanMagneticMove = true;
UE_LOG(LogTemp, Warning, TEXT("Target Pos : %s"), *TargetPosition.ToString());
}
}
구현중인 코드. 라인트레이싱을 통해 타겟을 설정하고 버튼을 누르면 이동하는 것까진 만들었다. 기둥 주변 콜라이더에 닿았을 때 멈추는거 구현중! 이동로직 자체도 아직 엄청 어색해서 기획이 나오면 많이 다듬어야 할 것 같다.
-- 자성은 N극, S극처럼 두 개로 나뉘어 두 플레이어가 나눠 갖는다. 구현은 서버를 공부 후에 좀 더 생각해 봐야 할 것 같다. bool변수를 사용해야 하나?