TIL day 44

2025. 2. 20. 22:25·TIL

1. 알고리즘


오늘 오전에는 "코딩테스트 합격자 되기" 에서 트리 부분 공부를 진행하였습니다.

  • 이진 트리의 순회 방법에 따른 다른 순회 순서에 대한 내용과
  • 이진 탐색 트리를 구현하는 부분을 집중적으로 공부하였습니다.

https://gbleem.tistory.com/92

 

이진 트리

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는 현재 캐릭터가 가지고 있는 무기를 가리키는 포인터입니다.
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. 기본 애니메이션 세팅과 무기 장착 시 애니메이션에 관련된 내용

https://gbleem.tistory.com/94

 

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
'TIL' 카테고리의 다른 글
  • TIL day 47
  • TIL day 46
  • TIL day 43
  • TIL day 42
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (184)
      • Unreal Engine (73)
      • C++ (19)
      • 알고리즘(코딩테스트) (27)
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    character animation
    enhanced input system
    싱글턴
    blend pose
    C++
    매크로 지정자
    motion matching
    const
    actor 클래스
    DP
    상속
    addonscreendebugmessage
    BFS
    Vector
    cin함수
    applydamage
    gamestate
    템플릿
    map을 vector로 복사
    additive animation
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
TIL day 44
상단으로

티스토리툴바