碰撞检测
显示名称 | 中文名称 | C++ |
---|---|---|
Sphere Trace By Channel | 按通道进行球体追踪 | UKismetSystemLibrary::SphereTraceSingle |
Sphere Trace By Profile | 按描述文件进行球体追踪 | UKismetSystemLibrary::SphereTraceSingleByProfile |
Sphere Trace For Objects | 针对Object进行球体追踪 | UKismetSystemLibrary::SphereTraceSingleForObjects |
Multi Sphere Trace By Channel | 按通道进行多球体追踪 | UKismetSystemLibrary::SphereTraceMulti |
Multi Sphere Trace By Profile | 按描述文件进行多球体追踪 | UKismetSystemLibrary::SphereTraceMultiByProfile |
Multi Sphere Trace For Objects | 针对object进行多球体追踪 | UKismetSystemLibrary::SphereTraceMultiForObjects |
Box Trace By Channel | 按通道进行盒体追踪 | UKismetSystemLibrary::BoxTraceSingle |
Box Trace By Profile | 按描述文件进行盒体追踪 | UKismetSystemLibrary::BoxTraceSingleByProfile |
Box Trace For Objects | 针对Object进行盒体追踪 | UKismetSystemLibrary::BoxTraceSingleForObjects |
Multi Box Trace By Channel | 按通道进行多盒体追踪 | UKismetSystemLibrary::BoxTraceMulti |
Multi Box Trace By Profile | 按描述文件进行多盒体追踪 | UKismetSystemLibrary::BoxTraceMultiByProfile |
Multi Box Trace For Objects | 针对object进行多盒体追踪 | UKismetSystemLibrary::BoxTraceMultiForObjects |
Line Trace By Channel | 按通道进行线条追踪 | UKismetSystemLibrary::LineTraceSingle |
Line Trace By Profile | 按描述文件进行线条追踪 | UKismetSystemLibrary::LineTraceSingleByProfile |
Line Trace For Objects | 针对object进行线条追踪 | UKismetSystemLibrary::LineTraceSingleForObjects |
Multi Line Trace By Channel | 按通道进行多线条追踪 | UKismetSystemLibrary::LineTraceMulti |
Multi Line Trace By Profile | 按描述文件进行多线条追踪 | UKismetSystemLibrary::LineTraceMultiByProfile |
Multi Line Trace For Objects | 针对object进行多线条追踪 | UKismetSystemLibrary::LineTraceMultiForObjects |
Capsule Trace By Channel | 按通道进行胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceSingle |
Capsule Trace By Profile | 按描述文件进行胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceSingleByProfile |
Capsule Trace For Objects | 针对object进行胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceSingleForObjects |
Multi Capsule Trace By Channel | 按通道进行多胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceMulti |
Multi Capsule Trace By Profile | 按描述文件进行多胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceMultiByProfile |
Multi Capsule Trace For Objects | 针对object进行多胶囊体追踪 | UKismetSystemLibrary::CapsuleTraceMultiForObjects |
参数详情
输入引脚
- Start:射线起点的位置。
- End:射线终点的位置。
- Radius:球体的半径。
- Trace Channel:碰撞通道,用于指定哪些类型的物体可以被检测到。常见的通道包括 Visibility、Camera、WorldStatic 等。
- bTrace Complex:是否启用复杂碰撞几何体的检测。如果设置为 True,则会检测复杂的静态网格体;如果设置为 False,则只检测简单的碰撞盒。
- bFind Initial Overlap:是否检测初始重叠。如果设置为 True,则会在起点处检测是否有重叠的物体。
- bIgnore Self:是否忽略自身物体的碰撞。如果设置为 True,则不会检测到执行该节点的物体本身。
- Actor to Ignore:需要忽略的特定 Actor。你可以在这里指定一个或多个 Actor,使其不参与碰撞检测。
- bShow Trace:是否在编辑器中显示射线追踪的可视化效果。这在调试时非常有用。
- bPersistent Show Trace:是否持续显示射线追踪的可视化效果。如果设置为 True,即使游戏停止,也会继续显示。
输出引脚
- Out Hit:如果检测到碰撞,这里会返回一个 Hit Result 结构体,包含碰撞的详细信息,如碰撞位置、碰撞物体等。
- Return Value:布尔值,表示是否检测到碰撞。如果检测到碰撞,返回 True;否则返回 False。
示例用法
蓝图API | C++ API |
---|---|
![]() | ![]() |
const FVector ActorLocation = GetActorLocation();
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery1); // WorldStatic
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery2); // WorldDynamic
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery3); // Pawn
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery4); // PhysicsBody
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery5); // Vehicle
ObjectTypes.Emplace(EObjectTypeQuery::ObjectTypeQuery6); // Destructible
TArray<FHitResult> HitResults;
TArray<AActor*> ActorsToIgnore;
ActorsToIgnore.Add(this); // 忽略自身
if (UKismetSystemLibrary::SphereTraceMultiForObjects(GetWorld(), ActorLocation, ActorLocation, Area, ObjectTypes,false, ActorsToIgnore, EDrawDebugTrace::ForDuration, HitResults, true))
{
for (FHitResult HitResult : HitResults) {
if (HitResult.GetActor() != nullptr) {
ApplyEffectToTarget(HitResult.GetActor());
}
}
}
获取最近对象蓝图函数库示例
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Kismet/KismetSystemLibrary.h"
#include "SysUtilsBPLibrary.generated.h"
namespace EDrawDebugTrace
{
enum Type : int;
}
/**
*
*/
UCLASS()
class GENERALFRAMEWORK_API USysUtilsBPLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* 获取最近距离的对象
* @param WorldContextObject
* @param Location 位置
* @param Radius 范围
* @param ObjectTypes 检测对象类型列表
* @param ActorsToIgnore 忽略对象列表
* @param DrawDebugType 绘制Debug类型
* @return 最近检测对象
*/
UFUNCTION(BlueprintPure, meta = (DisplayName = "GetNearestObject", WorldContext = "WorldContextObject" ), Category = "GeneralFramework|SysUtils")
static AActor* GetNearestObject(const UObject* WorldContextObject,FVector Location, float Radius, const TArray<TEnumAsByte<EObjectTypeQuery> > & ObjectTypes,const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace::Type DrawDebugType);
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Libraries/SysUtilsBPLibrary.h"
#include "GameFramework/Character.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/KismetSystemLibrary.h"
AActor* USysUtilsBPLibrary::GetNearestObject(const UObject* WorldContextObject, FVector Location, float Radius,
const TArray<TEnumAsByte<EObjectTypeQuery>>& ObjectTypes,
const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace::Type DrawDebugType)
{
AActor* HitActor = nullptr;
TArray<FHitResult> HitResults;
if (UKismetSystemLibrary::SphereTraceMultiForObjects(WorldContextObject->GetWorld(), Location, Location, Radius,
ObjectTypes, false, ActorsToIgnore,
DrawDebugType, HitResults, true))
{
float MinDistance = 99999;
for (FHitResult HitResult : HitResults)
{
if (HitResult.GetActor() != nullptr)
{
const float Distance = UKismetMathLibrary::Vector_Distance2D(
HitResult.GetActor()->GetActorLocation(), Location);
if (Distance < MinDistance)
{
HitActor = HitResult.GetActor();
MinDistance = Distance;
}
}
}
}
return HitActor;
}