FVector如何進行地面的判定
本帖最后由 cow1330 于 2019-4-5 12:07 编辑小弟在試用FVector進行空中的判定,想說如果射線沒與地面接觸就當是空中
目前以經把射線改成人物的腳上,但對地面有無反應不知
用FCollisionQueryParams CollisionParams; 查也沒反應,但只對自已碰撞有反應
void ACharacterBase::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FHitResult OutHit;
FVector Start = GetActorLocation();
Start.Z += -135.f;
FVector Forward = GetActorUpVector();
FVector End = ((Forward * 10.f) + Start);
FCollisionQueryParams CollisionParams;
DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, 0, 0, 5);
if (ActorLineTraceSingle(OutHit, Start, End, ECC_WorldStatic, CollisionParams))
{
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Green, FString::Printf(TEXT("The Component Being Hit is: %s"), *OutHit.GetComponent()->GetName()));
}
}
FCollisionQueryParams添加ignore actorthis
检查 OutHit.bHIt
我记得CharacterMovement这个组件有一个方法 bool IsFalling()还是bool IsInAir()专门来判断角色是否在空中。。。或许你可以看看这方面的源码会有相应解释呢 本帖最后由 cow1330 于 2019-4-9 21:34 编辑
這兩天測試的情況,用射線檢測,目前是卡在如何判定,目前是想兩個方法
1.是在角色的腳下設一個極短射線,當射線跟地面接觸就算是地上方
小弟是成功了用 if (OutHit.bBlockingHit) 指令,當碰到地面就算地上
空中想說加改 else 就可以了,但實測結果 elsE 則不會執行
個人認為應該是判定部份還要修改,
2.直接設一個長射線,以射線的長度加以判斷
小弟正朝這方向試,我開啟數據來看發現在接觸地面,射線Z軸似乎變不大
想說設成超出一定數值就算空中,但目前不還會用射線碰撞點來當距離判斷
==另外想到==
目前小弟只是拿地面判定,但怪物還機關的仔細想想 if (OutHit.bBlockingHit) 指令
應該也會把踩到怪物當成地面,感謝 mknmknmk 提供 ignore actor this指令
應該可以解決這個問題,但目前還不會使用
UnrealEngineer
bool IsFalling(),我查過CharacterMovement確實有這個指令,但還小弟目前還不會直接引用
還在測試 小弟終於試出來了, 原理是之前說的,在角色的腳下設一個極短射線
當射線跟地面接觸就算是地上,沒碰到就算空中
之前一直卡在else沒反應,原來是設太多檢測,結果寫錯行了
這是小弟目前程式碼,目前是堪用,應該還可以改的更好
FHitResult OutHit;
FVector TraceStart = GetActorLocation();
TraceStart.Z += -115.f;
FVector ForwardDir = GetActorUpVector();
FVector TraceEnd = ((ForwardDir * 5.f) + TraceStart);
FCollisionQueryParams CollisionParams;
DrawDebugLine(GetWorld(), TraceStart, TraceEnd, FColor::Green, false, 0.5, 0, 5);
if (GetWorld()->LineTraceSingleByChannel(OutHit, TraceStart, TraceEnd, ECC_Pawn, CollisionParams))
{
if (OutHit.bBlockingHit)
{
bIsfalling = false;
}
}
else
{
bIsfalling = true;
}
页:
[1]