1. 알고리즘
오늘 오전에는 "코딩테스트 합격자 되기" 에서 트리 부분 공부를 진행하였습니다.
- 이진 트리의 순회 방법에 따른 다른 순회 순서에 대한 내용과
- 이진 탐색 트리를 구현하는 부분을 집중적으로 공부하였습니다.
이진 트리
1. 트리 개념노드, 간선으로 이루어진 구조코딩테스트에서는 이진 트리만 알고 있으면 충분하다. 2. 이진 트리 표현하기2 - 1. 배열로 표현하기루트를 인덱스 1로 시작왼쪽 자식은 부모 노드의
gbleem.tistory.com
2. 언리얼
오늘은 무기를 캐릭터에 장착하고, 장착 시 애니메이션과 로직 연동을 구현하였고 추가적으로 그래플링 시스템을 구현하였습니다.
2 - 1. 캐릭터 무기 장착하는 시스템
아직 완벽히 아이템과 연동된 것이 아니어서 추후 완성이 되면 해당 내용을 정리할 예정입니다. (Item Peeking 시스템)
- 현재 동작 방식은 캐릭터가 무기(아이템) 가 가지는 collision 에 overlap 하게 되면
- 캐릭터가 가지고 있는 peeking 할 수 있는 변수를 true로 만들어주게 됩니다.
- 캐릭터는 Tick에서 peeking하도록 하는 변수가 true인 경우 ray trace를 통해 무기를 찾게 되면
- 해당 아이템을 캐릭터에게 장착하는 식으로 구현하였습니다.
- 코드
- trace하는 함수
- ray를 통해 찾은 무기를 Cast<AWeapon>(HitResult.GetActor()) 로 valid 체크를 한 다음
- 새로운 무기를 하나 spawn 해서 current weapon에 넣어주고 캐릭터 socket에 attach 해주었습니다.
- Current Weapon는 현재 캐릭터가 가지고 있는 무기를 가리키는 포인터입니다.
- trace하는 함수
void APlayerCharacter::BeginTraceForPickItem()
{
//trace 하기
APlayerCharacterController* PlayerController = Cast<APlayerCharacterController>(GetController());
if (PlayerController)
{
int32 ScreenWidth;
int32 ScreenHeight;
PlayerController->GetViewportSize(ScreenWidth, ScreenHeight);
const FVector2D ScreenCenter(ScreenWidth * 0.5f, ScreenHeight * 0.5f);
FVector WorldLocation;
FVector WorldDirection;
if (PlayerController->DeprojectScreenPositionToWorld(ScreenCenter.X, ScreenCenter.Y, WorldLocation, WorldDirection))
{
FVector TraceStart = WorldLocation + WorldDirection*100.f;
FVector TraceEnd = TraceStart + (WorldDirection * 10000.f);
FHitResult HitResult;
FCollisionQueryParams TraceParams;
TraceParams.AddIgnoredActor(this);
bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, TraceStart, TraceEnd, ECC_Visibility, TraceParams);
FColor LineColor = bHit ? FColor::Red : FColor::Blue;
DrawDebugLine(GetWorld(), TraceStart, TraceEnd, LineColor, false, 2.0f, 0, 2.0f);
if (bHit)
{
//if trace hit weapon
//destroy origin weapon
//spawn new weapon and attach to character
if(Cast<AWeapon>(HitResult.GetActor()))
{
CurrentWeapon = GetWorld()->SpawnActor<AWeapon>();
CurrentWeapon->SetActorEnableCollision(false);
FName WeaponSocket(TEXT("back_socket"));
CurrentWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
Cast<AWeapon>(HitResult.GetActor())->DestroyItem();
}
}
}
}
}
2 - 2. 기본 애니메이션 세팅과 무기 장착 시 애니메이션에 관련된 내용
UE5 Issues : 애니메이션 (Motion Matching, Blend Pose)
이번 프로젝트에서 담당한 부분이 캐릭터이어서, 자연스러운 애니메이션을 만들고 싶어서 공부한 내용과 적용해 본 것을 정리해 보았다.1. Motion Matching1 - 1. 이슈현재 상황에 있어서 가장 적합한
gbleem.tistory.com
2 - 3. 그래플링 시스템
Cable 컴포넌트와 MoveComponentTo 함수를 통해서 구현하고 있습니다.
아직 완벽하지 않아서 수정이 필요합니다.
기억할 만한 내용
- Cable 컴포넌트를 쓰려면, CableComponent.h 헤더가 필요한데 이 헤더를 쓰기 위해서는 Build.cs에 CableComponent를 추가해야 합니다.
PublicDependencyModuleNames.AddRange(new string[] { "CableComponent", "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });
- Cable 컴포넌트를 BP에서 부모 소켓을 설정하는 부분이 비활성화 되어있어서, 해당 부분을 cpp로 설정하는 방법입니다.
- 생성자에서 아래와 같이 설정하면 부모 소켓을 설정할 수 있습니다.
FName HandSocket(TEXT("hand_l_socket"));
CableComp->SetupAttachment(GetMesh(), HandSocket);
현재까지 구현한 내용
- 그래플링이 가능한 액터는 새로 만든 Trace Channel을 통해서 인식하도록 구현
- 우클릭을 통해 그래플링을 위한 케이블을 날릴 수 있음
- 그래플링이 가능한 액터라면 케이블이 해당 액터에 붙음
- 총을 든 상태에서는 케이블을 날릴 수 없음
- 케이블이 액터에 붙은 상황에서 좌클릭을 하면 해당 위치로 이동
- 여기서 rotation 관련 이슈가 남아있다.
'TIL' 카테고리의 다른 글
TIL day 47 (0) | 2025.02.26 |
---|---|
TIL day 46 (0) | 2025.02.24 |
TIL day 43 (0) | 2025.02.19 |
TIL day 42 (0) | 2025.02.18 |
TIL day 41 (0) | 2025.02.17 |