[250128 TIL] 폰으로 드론 제작하기 AddActorWorldOffset의 FHitResult
1️⃣ 알고리즘 코드카타
https://school.programmers.co.kr/learn/courses/30/lessons/42862#
[체육복]
🤖 AI 피드백
1. 여분과 분실 중복 처리
여분의 체육복을 가진 학생이 본인이 잃어버린 경우, 중복으로 처리될 가능성
2. 복잡한 로직
조건문의 중복과 비효율적인 연산으로 떨어지는 가독성
3. 정렬 불필요
정렬 없이도 해결 가능
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
// 여분과 분실 중복 제거
vector<int> actualLost;
vector<int> actualReserve;
for (int l : lost) {
if (find(reserve.begin(), reserve.end(), l) == reserve.end()) {
actualLost.push_back(l);
}
}
for (int r : reserve) {
if (find(lost.begin(), lost.end(), r) == lost.end()) {
actualReserve.push_back(r);
}
}
// 체육복 빌려주기
for (int r : actualReserve) {
auto it = find(actualLost.begin(), actualLost.end(), r - 1);
if (it != actualLost.end()) {
actualLost.erase(it);
continue;
}
it = find(actualLost.begin(), actualLost.end(), r + 1);
if (it != actualLost.end()) {
actualLost.erase(it);
}
}
return n - actualLost.size(); // 총 학생 수에서 남은 잃어버린 학생 수를 뺌
}
💭 회고
체육복 여벌을 가지고 있는 사람이 분실도 할 수 있는 걸
반영 안 해서 좀 헤맸다..
글을 꼼꼼히 읽어도 까먹을 수 있으니
코드를 작성하고 다시 읽어봐는 습관을 길러야겠다.
2️⃣ 드론 제작하기
💥문제1 : IMC 모디파이어
▪️상황
R/F 키를 눌러도 위아래로 움직이지 않음
▪️해결
스위즐 입력 축값 때문이어서 모디파이어 제거
🔹HitResult
void ADronePawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
Gravity = IsOnFloor ? GravityMin: GravityMax;
AddActorWorldOffset(GetActorUpVector() * Gravity, true, &HitResult);
if (HitResult.bBlockingHit && HitResult.GetActor()->ActorHasTag("Floor"))
{
IsOnFloor = true;
}
else
{
IsOnFloor = false;
}
}
▪️bBlockingHit : 충돌이 실제로 발생했는지 여부를 나타내는 부울 값
▪️Location : 충돌이 계산된 최종 위치 반환
▪️Normal : 충돌 계산 시 사용된 트레이스의 방향과 반대되는 벡터
▪️ImpactNormal : 충돌 표면의 법선 벡터(표면 방향)를 반환
(반사 벡터 계산, 충돌 시 반응 방향 등을 처리할 때 유용)
▪️GetActor() : 충돌한 액터의 포인터 반환
(충돌한 객체를 특정하거나 추가 로직을 실행할 때 사용)
▪️Distance : 충돌까지의 거리(트레이스 시작점에서 충돌 지점까지의 거리)를 반환
(타겟까지의 거리를 계산하거나 충돌 범위를 측정할 때 사용)
▪️ImpactPoint : 충돌이 발생한 월드 좌표를 반환
(충돌 지점을 시각적으로 표시하거나 계산에 사용할 때 유용)
FVector ImpactLocation = HitResult.ImpactPoint;
DrawDebugSphere(GetWorld(), ImpactLocation, 10.0f, 12, FColor::Red, false, 2.0f);
▪️Component : 충돌한 컴포넌트(메쉬, 콜리전 박스)의 포인터를 반환
(충돌한 컴포넌트에만 영향을 주고 싶을 때 유용)
if (UPrimitiveComponent* HitComponent = HitResult.Component.Get())
{
UE_LOG(LogTemp, Warning, TEXT("Hit Component: %s"), *HitComponent->GetName());
}
▪️PhysMaterial : 충돌한 표면의 물리적 재질 정보 반환
(표면에 따른 효과(소리, 입자 효과)를 적용할 때 유용)
if (HitResult.PhysMaterial.IsValid())
{
UE_LOG(LogTemp, Warning, TEXT("Physical Material: %s"), *HitResult.PhysMaterial->GetName());
}
💭회고
설날에도...힘냈다...으윽..
근데 원래는 드론 폰을 플레이어 폰 상속받아서 하려고 했는데
뭔가 헷갈려서 그냥 새로 만들었다.
상속 받는 게 맞는 걸까..?