原理
灵魂画师上线!
很多游戏像CS:GO子弹都是从玩家眼睛里以一条直线打出去的,而不是从枪里。
所以我们只要从屏幕中心或玩家眼睛向外射线,然后在地图里定位这个交点即可实现瞄准。
代码
1 2 3
|
void TraceUnderCrosshairs(FHitResult& TraceHitResult);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include "Kismet/GameplayStatics.h" #include "DrawDebugHelpers.h"
void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult) { FVector2D ViewportSize; if (GEngine && GEngine->GameViewport) { GEngine->GameViewport->GetViewportSize(ViewportSize); }
FVector2D CrosshairLocation(ViewportSize.X / 2.f, ViewportSize.Y / 2.f); FVector CrosshairWorldPosition; FVector CrosshairWorldDirection; bool bScreenToWorld = UGameplayStatics::DeprojectScreenToWorld( UGameplayStatics::GetPlayerController(this, 0), CrosshairLocation, CrosshairWorldPosition, CrosshairWorldDirection );
if (bScreenToWorld) { FVector Start = CrosshairWorldPosition;
FVector End = Start + CrosshairWorldDirection * TRACE_LENGTH;
GetWorld()->LineTraceSingleByChannel( TraceHitResult, Start, End, ECollisionChannel::ECC_Visibility );
if (!TraceHitResult.bBlockingHit) { TraceHitResult.ImpactPoint = End; } else { DrawDebugSphere( GetWorld(), TraceHitResult.ImpactPoint, 12.f, 12, FColor::Red ); } } }
|
完成
这下我们就可以看到开枪后我们可以打到地图的哪里了。
有个小问题就是这样可以打到自己,之后再修复吧。