TIL
TIL day 32
gbleem
2025. 2. 4. 22:20
1. 코딩테스트
오늘 오전 코딩테스트는 프로그래머스 level 2 시소 짝꿍을 풀었습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/152996
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 뭘로 풀지?
- unordered_map 으로 데이터 저장 및 순회 -> unordered_map 순회 관련 글
- long long 타입 주의
2. 과제
기능들은 구현이 대체로 완료되어서 추가적으로 게임성을 추가하였고, 충돌 관련 내용을 구현하였습니다.
- 나이아가라
- 날아다니는 캐릭터에 Trail 같은 것이 붙어있으면 좋을 것 같다는 생각을 하게 되어서 관련 내용을 찾아보다가 나이아가라 시스템을 접하게 되었습니다.
- 그러나 이 시스템이 쉽지 않은 것 같아서 간단한 사용법을 익히고, 간단하게만 구현을 해보았습니다.
- 관련 정리 글
Unreal Engine - Simple Niagara (with cpp)
캐릭터가 움직이면, 해당 캐릭터의 뒷부분에 Trail 효과를 주고 싶어서 관련 기술을 찾아보던 도중 나이아가라 시스템을 알게 되었고 간단히 사용해 본 내용을 정리해 볼 것이다.1. 나이아가라 시
gbleem.tistory.com
- 충돌 처리
- 해당 과제에서는 물리를 끈 상태로 중력과 충돌을 구현해야 했기 때문에 약간의 어려움이 있었습니다.
- 기존의 구현
- 캐릭터가 땅에 있는지 하늘에 있는지를 SweepSingleByChannel을 통해서 체크하고
- 땅에 있다면, 캐릭터의 좌표 중 roll 회전을 0으로 만들고 pitch 회전을 못하게 만들어서 지면에 붙어있도록 구현하였습니다.
- 추가 구현
- 캐릭터가 static mesh와 같은 다른 actor는 뚫고 가는 문제가 있었습니다.
- 이 문제를 해결하고자 Sweep을 통해서 해당 actor를 체크하고, 캐릭터를 캐릭터의 이동 방향의 반대로 밀어주면 될 것이라고 생각하였습니다. (기존에 배웠던 Launch Character에서 영감을 얻음)
- 결론적으로 Lerp를 통해서 캐릭터를 뒤로 밀어주어서 통과되지 않도록 구현하였습니다.
- 충돌 구현 코드
void AFlyingCharacter::CollisionCheck()
{
FVector Start = GetActorLocation();
FVector End = Start + FVector::DownVector * 10.f;
FCollisionShape Sphere = FCollisionShape::MakeSphere(MaxCollisionSphereRadius);
FHitResult HitResult;
bool HasHit = GetWorld()->SweepSingleByChannel(HitResult, Start, End, FQuat::Identity, ECC_WorldStatic, Sphere);
if (HasHit)
{
if (!Controller)
return;
FVector HitVector = GetActorForwardVector();
FVector NowLocation = GetActorLocation();
FVector ToLocation = NowLocation + -HitVector * HitBackDistance;
FVector ResultLocation = FMath::Lerp(NowLocation, ToLocation, GetWorld()->GetDeltaSeconds() * HitBackSpeed);
SetActorLocation(ResultLocation);
}
}
- 충돌 영상 (actor와 충돌되는 것과 지면 충돌)
구현하다 보니 아직 충돌을 구현할 때 어려움이 많아서, 관련 내용을 좀 더 공부해보고 정리해 보아야 할 것 같습니다.
- 공부 예정 주제
- Collision Channel
- Sweep and Trace
내일은 과제 제출 영상 만들고, 깃허브 readme를 작성하면서 주요 구현 내용을 정리해 볼 예정입니다.