【虚幻C++笔记】碰撞检测

目录

碰撞检测

显示名称 中文名称 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
cpp 复制代码
	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());
			}
		}
	}

获取最近对象蓝图函数库示例

cpp 复制代码
// 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);
};
cpp 复制代码
// 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;
}
相关推荐
NULL指向我24 分钟前
C语言数据结构笔记5:Keil 编译器优化行为_malloc指针内存分配问题
c语言·数据结构·笔记
C++ 老炮儿的技术栈42 分钟前
文本文件与二进制文件的区别
大数据·c语言·开发语言·c++·git·算法·visual studio
君鼎1 小时前
C++标准库大全(STL)
开发语言·c++·stl
wusixuan1310043 小时前
最大闭合子图学习笔记 / P2805 [NOI2009] 植物大战僵尸
笔记·学习·算法·最大闭合子图
moxiaoran57533 小时前
uni-app项目实战笔记5--使用grid进行定位布局
笔记·uni-app
羊小猪~~4 小时前
数据库学习笔记(十五)--变量与定义条件与处理程序
数据库·人工智能·笔记·后端·sql·学习·mysql
霸王蟹4 小时前
带你手写React中的useReducer函数。(底层实现)
前端·javascript·笔记·学习·react.js·typescript·前端框架
Humbunklung4 小时前
分布假设学习笔记
笔记·深度学习·学习
嵌入式@秋刀鱼5 小时前
《 第三章-招式初成》 C++修炼生涯笔记(基础篇)程序流程结构
linux·开发语言·数据结构·c++·笔记·visual studio code
HaiQinyanAN5 小时前
【学习笔记】重载和重写的注意事项
c++·笔记·学习