FVector如何進行地面的判定

[复制链接]
查看2085 | 回复4 | 2019-4-5 12:05:24 | 显示全部楼层 |阅读模式
本帖最后由 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:rintf(TEXT("The Component Being Hit is: %s"), *OutHit.GetComponent()->GetName()));
    }
}



mknmknmk | 2019-4-8 16:49:51 | 显示全部楼层
FCollisionQueryParams  添加ignore actor  this
检查 OutHit.bHIt
回复 支持 反对

使用道具 举报

UnrealEngineer | 2019-4-9 09:24:58 | 显示全部楼层
我记得CharacterMovement这个组件有一个方法 bool IsFalling()还是bool IsInAir()专门来判断角色是否在空中。。。或许你可以看看这方面的源码会有相应解释呢
回复 支持 反对

使用道具 举报

cow1330 | 2019-4-9 21:32:00 | 显示全部楼层
本帖最后由 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確實有這個指令,但還小弟目前還不會直接引用
還在測試
回复 支持 反对

使用道具 举报

cow1330 | 2019-4-10 14:02:52 | 显示全部楼层
小弟終於試出來了, 原理是之前說的,在角色的腳下設一個極短射線
當射線跟地面接觸就算是地上,沒碰到就算空中
之前一直卡在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;
        }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

36

主题

77

回帖

256

积分

初阶编码师

积分
256