7#include "Engine/GameViewportClient.h"
8#include "Engine/OverlapResult.h"
9#include "Engine/HitResult.h"
10#include "Engine/EngineTypes.h"
11#include "Engine/Engine.h"
12#include "Engine/World.h"
15#include "DrawDebugHelpers.h"
20 bool ActorPositionWasChanged =
false;
24 return ActorPositionWasChanged;
27 UWorld* World = Actor->GetWorld();
31 const FVector ActorLocation = Actor->GetActorLocation();
32 const FVector StartLocation = ActorLocation + FVector(0.0f, 0.0f, StartZOffset);
33 const FVector EndLocation = ActorLocation - FVector(0.0f, 0.0f, EndZOffset);
35 FCollisionQueryParams QueryParams;
36 QueryParams.AddIgnoredActor(Actor);
37 bool Hits = World->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, ECC_WorldStatic, QueryParams);
42 Actor->TeleportTo(HitResult.ImpactPoint, Actor->GetActorRotation());
43 ActorPositionWasChanged =
true;
47 return ActorPositionWasChanged;
61 const FVector CurrentActorLocation = Actor->GetActorLocation();
62 const FVector EndActorLocation = CurrentActorLocation + FVector(0.0f, 0.0f, AboveOffset);
63 Actor->TeleportTo(EndActorLocation, Actor->GetActorRotation());
76 UWorld* World = Actor->GetWorld();
80 FTransform
Transform = Actor->GetActorTransform();
81 FVector ActorLocation =
Transform.GetLocation();
82 FVector ActorScale =
Transform.GetScale3D();
85 FVector MeshExtent = Mesh->GetBounds().BoxExtent;
86 FVector TopExtent = FVector(MeshExtent.X, MeshExtent.Y, MeshExtent.Z * TopPercentage);
88 FVector StartLocation = ActorLocation + FVector(0.0f, 0.0f, MeshExtent.Z);
89 FVector EndLocation = ActorLocation + FVector(0.0f, 0.0f, MeshExtent.Z * TopPercentage);
92 FCollisionQueryParams QueryParams;
93 QueryParams.AddIgnoredActor(Actor);
96 return World->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, CollisionChannel, QueryParams);
107 UE_LOG(LogTemp, Warning, TEXT(
"UPhysicsUtilities.cpp: StaticMesh is null!"));
112 if (!GEngine || !GEngine->GameViewport)
117 TArray<FOverlapResult> OverlapResults;
119 UWorld* World = GEngine->GameViewport->GetWorld();
122 FVector Location =
Transform.GetLocation();
123 FQuat Rotation =
Transform.GetRotation();
125 FBox ActorBounds = StaticMesh->GetBoundingBox().TransformBy(FTransform(Rotation, Location, Scale));
127 World->OverlapMultiByObjectType(
131 FCollisionObjectQueryParams(ECC_WorldStatic),
132 FCollisionShape::MakeBox(ActorBounds.GetSize() * 0.5f)
136 return OverlapResults.Num() > 0;
141 return FindOverlappingActorsOfClass<AActor>(ActorTransform, Radius, DebugVisualizeRadius);
147 TArray<T*> OverlappingActors;
149 if (!GEngine || !GEngine->GameViewport)
151 return OverlappingActors;
154 UWorld* World = GEngine->GameViewport->GetWorld();
158 TArray<FOverlapResult> OverlapResults;
159 FCollisionQueryParams Params;
160 Params.AddIgnoredActor(
nullptr);
161 Params.bTraceComplex =
false;
162 Params.bReturnPhysicalMaterial =
false;
164 FCollisionObjectQueryParams ObjectQueryParams;
165 ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);
167 bool bOverlap = World->OverlapMultiByObjectType(
169 ActorTransform.GetLocation(),
170 ActorTransform.GetRotation(),
172 FCollisionShape::MakeSphere(Radius),
178 for (
const FOverlapResult& OverlapResult : OverlapResults)
180 T* OverlappingActor = Cast<T>(OverlapResult.GetActor());
181 if (OverlappingActor)
183 OverlappingActors.Add(OverlappingActor);
190 if (DebugVisualizeRadius)
192 DrawDebugSphere(World, ActorTransform.GetLocation(), Radius, 12, FColor::Green,
false, 2.0f, 0, 1.0f);
196 return OverlappingActors;
static bool SnapActorAboveGround(AActor *Actor, float AboveOffset=50.0f)
static bool HasOverlappingActors(const UStaticMesh *StaticMesh, const FTransform &Transform)
static bool DoesTopPercentageMeshOverlap(AActor *Actor, const UStaticMesh *Mesh, float TopPercentage, ECollisionChannel CollisionChannel)
static TArray< T * > FindOverlappingActorsOfClass(const FTransform &ActorTransform, float Radius, bool DebugVisualizeRadius=false)
static TArray< AActor * > FindOverlappingActorsInSphere(const FTransform &ActorTransform, float Radius, bool DebugVisualizeRadius=false)
static bool SnapActorToGround(AActor *Actor, float StartZOffset=600.0f, float EndZOffset=600.0f)