自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

永远的小白虾的博客

虚幻引擎的相关博文

  • 博客(179)
  • 收藏
  • 关注

原创 UE枚举转String

【代码】UE枚举转String。

2024-02-04 11:18:00 195 2

原创 【UE5】UObject中调用WorldSubsystem

引擎版本:5.0.2博主在写BUG的过程中,遇到了问题,我需要在UObject中调用WorldSubsystem。但是呢,当我在继承自UObject类的蓝图类中调用WorldSubsystem时,就会出现以下报错:Function’Get XXXXSubsystem’ is unsafe to call from blueprints of class ‘XXXBlueprint’。Pin ‘Context Object’ must have a connection。这是因为在蓝图中 Get X

2022-06-07 13:59:45 1478 1

原创 MassAI 未加载UnrealEditor-MassEntity.pdb

如果你在写Processor的时候,遇到VS提示“未加载UnrealEditor-MassEntity.pdb”。之后无法加载进入编辑器。那么你应该是写Processor却没有重载ConfigureQueries。原因猜测为:Processor会自动创建一个实例对象。而你没有重载的话,在调用ConfigureQueries时,会出问题。...

2022-06-02 10:23:43 794 2

原创 MassEntity中SimpleMovement的使用方式

MassEntity中的SimpleMovementTrait的主要作用就是演示用。所以如果你希望能够快速的使用到这个框架,那么你就可以使用到这样的MassEntityConfig。在MassEntityConfig中添加DebugVisualizationTrait,用于快速的给予Agent显示。添加SimpleMovementTrait,根据Agent的VelocityFragment,来进行移动。添加VelocityRandomizerTrait,随机化Agent的VelocityFragme

2022-05-14 15:32:34 625

原创 MassEntity框架在移动时的性能测试

一、Movement1.1 使用Movement进行随机运动自己写的Processor,随机赋予周围正负100000以内的位置。MassEntityConfig配置如下图所示:生成数量为10000个,SimpleRandomMovementTrait为自己写的特性。24G的CPU,GTX2060的显卡,性能如下:一开始,能够稳定在13~16帧之间。Agent散开后,并不会有什么性能上的变化。也还是13~16帧之间。二、SimpleMovemnt2.1 使用SimpleMovemen

2022-05-14 15:13:09 596

原创 【UE5 Mass AI 基础教程一】代理生成

一、引擎参数配置打开UE5引擎,点击【编辑->插件】,进入插件页面,搜索【Mass】,将【MassAI】、【MassCrowd】、【MassEntity】、【MassGameplay】都勾选上。然后重启引擎,应用插件。再点击【编辑->项目配置】,搜索【Zone Graph】,修改配置为如下配置。二、Zone Graph 配置新建一个Base Level。在【添加物体->所有类】中最下方,找到【ZoneShape】,拖拽到场景中。操纵样条曲线,修改ZoneShape形状如下

2022-04-30 09:00:00 3867 9

原创 【UE5 Mass AI 基础教程二】代理移动

紧接上文,我们开始让Agent动起来。一、状态树点击【鼠标右键->人工智能->StateTree】,创建一个StateTree,命名为【ST_MassAI】。修改Schema为Mass Behavior,给Root状态添加子状态【Wander】,并在任务中,先通过ZG Find Wander Target 寻找可导航位置,再通过ZG Path Follow导航向目标位置,最后让Agent面向正确的位置。且在过渡中,当当前状态完成后返回Root 状态。二、MassEntityConfigA

2022-04-30 00:01:16 2591

原创 【UE5 Mass AI】生成与移动的最低特性需求

本文仅谈最低特性需求,并不涉及具体实现MassEntityConfigAsset生成物体的最低特性需求为:CrowdVisualizetion,LODCollector,AssortedFragments,CrowdMemberMassEntityConfigAsset让生成AI可以移动起来的最低特性需求为:CrowdVisualizetion,LODCollector,AssortedFragments,CrowdMember,ZoneGraphNavigation,Movem

2022-04-29 17:13:40 1212

原创 【UE5小问题记录】下载城市示例时,提示空间不足

当使用UE下载城市示例(City Sample 5.0)时,由于该项目实在过大,足足有100G左右,导致空间不足。并显示该保管库的下载位置为:C:\ProgramData\Epic\EpicGamesLauncher\VaultCache。但是我的Epic安装目录并不是这个位置。前面使用UE4.26的时候,下载的相关保管库,都是默认保存在D:\Epic Games\Launcher\VaultCache下面。所以我们需要修改保管卡的缓存位置。进入Epic界面中的【商城】界面,点开【用户头像】下面的【设

2022-04-28 10:00:00 5482 4

原创 【UE5 Mass AI】MassAI中的Fragment类型

Mass Ai中的特性是由片段组成,在特性代码中的BuildTemplate()函数中进行添加的。片段的基类为以下四种:FMassFragment:// 轻量级片段的基类USTRUCT()struct FMassFragment{ GENERATED_BODY() FMassFragment() {}};FMassTag:// 仅作为标记的基类USTRUCT()struct FMassTag{ GENERATED_BODY() FMassTag() {}};FMa

2022-04-27 17:34:05 2500

原创 【UE5 Mass AI】UE5技术演示视频中的MassAI笔记

在虚幻引擎中,Mass Framework是面向数据的一种框架设计,而MassAI则是一个具体的用例。Mass Framework可以分为三部分:MassEntity,MassGameplay,MassAI。1. Mass EntityMassEntity是一种面向数据的框架,该框架有两部分,一为片段(Fragment),非常小的数据结构,会连续的储存在内存中;另为实体(Entity),则是由片段构成集合的实例。该框架中将所有处理逻辑与数据构成进行解除联系,所有的数据构成均在片段中。为了了解要在

2022-04-26 17:59:12 4978 2

原创 UE4C++小知识(十六)TArray的Emplace报错的原因

UE版本:4.26这几天在写代码的时候,遇到了一个问题,就是我自建的继承自UObject的类,在使用TArray的Emplace时,出现了指针报空的问题。调用示例如下:class Test:public UObject{}TArray<UTest*> Tests;TempTest=NewObject<UTest>();Tests.Emplace(Test);//报错行报错代码: template <typename... ArgsType> F

2022-04-17 15:58:32 1163

原创 UE4C++小知识(十五)随机数的生成

今天想在UE4.26中,通过C++生成一个int随机数。在网上找了找,发现不是蓝图的,就是自己写的。因为我明显知道UE4有内置的随机函数。所以后面我在网上找到了这个。How does UE4 generate random numbers in C++ & Blueprints?意思大致为:FMath.RandRange()函数可以生成 随机数。FMath中的源码:/** Helper function for rand implementations. Returns a random

2022-04-12 17:22:07 5376

原创 游戏人工智能AI会议

ACAICOG

2022-01-28 10:37:14 425

原创 UE4 中的attach to actor 与 场景组件 的性能比较实验

1、生成5000个场景组件,附加到玩家身上。玩家不行动时,玩家行动时,如:行走,转向等,Frame:8.33ms左右Game:5.33-7ms左右Draw:0.03msGPU:8.37ms生成5000个Actor,附加在玩家身上。玩家不行动时,玩家行动时,如:行走,转向等,Frame:8.33ms左右Game:5.33-6ms左右Draw:0.03msGPU:8.37ms2、生成50000个场景组件,附加到玩家身上。玩家不行动时,玩家行动时,如:行走,

2022-01-25 08:00:00 760

原创 UE4 为Actor添加碰撞体与实时进行Trace查询的性能比较

版本:4.26条件:初始Actor只有一个StaticMesh组件。生成1000个Actor,在初始Actor的基础上添加一个球形碰撞体。当性能趋于稳定之后:生成1000个初始Actor,在Tick中实时调用球形多物体检测。初始打开时:当性能趋于稳定之后:记录实验过程:(1)启动时差距,使用碰撞体时,游戏明显卡顿,启动需要花大于2-4秒的启动时间,而Trace检测则初始化速度很快,打开时基本没有什么卡顿的现象。猜测,可能是生成物体时,物体过于密集导致物体间发生碰撞,导致性能开销较大。

2022-01-20 17:47:10 2567

原创 游戏开发中的基本数学与物理

本章中会记录数学中的角度与弧度的变换,勾股定理,矢量加减、矢量数乘、矢量分解,矢量点乘等。物理中的距离、速度、加速度、力之间的关系与应用。来源为:游戏人工智能编程案例精粹(修订版)第一章一、数学1.1 角度与弧度的变换日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种度量单位。由于圆的周长为2PI,所以每个圆都有2PI弧度(Radians)

2022-01-19 21:46:06 3660

原创 UE4C++小知识(十四)多对象的球形查询

TArray HitResults;FVector BeginLocation = ControlledPawn->GetActorLocation();FVector EndLocation = BeginLocation + ControlledPawn->GetActorForwardVector() * 1;TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;ObjectTypes.Add(EObjectTy

2022-01-10 23:29:17 1258 2

原创 UE4C++小知识(十三)C++使用SwitchOnString

蓝图中有一个SwitchOnString结点,我通过这个结点来判断类名,执行不同的方法。但我在C++中希望能够使用SwitchOnString,却发现不能直接使用。在源码中,找了一会儿,发现源码路径为:Epic Games\UE_4.26\Engine\Source\Editor\BlueprintGraph\Classes\K2Node_SwitchString.h从中可以看到,它是借助FName TArray实现的Switch。...

2022-01-05 10:04:41 1759

原创 UE4C++ 小知识(十二) 限制黑板键FBlackboardKeySelector的选择范围

版本号:4.26在使用C++写行为树任务的时候,经常需要在蓝图中指定黑板键,在任务内部进行修改,而有时我们需要能够限制黑板键自动筛选可以输入对象。因此,首先我们需要在C++文件中,声明一个黑板键。 UPROPERTY(EditAnywhere, Category = Blackboard) struct FBlackboardKeySelector BlackboardKey;然后开始限制该黑板键值的输入范围。限制输入范围为:BoolBlackboardKey.AddBoolFilter

2022-01-01 11:12:51 895

原创 UE4 C++小知识(十一)获取TSubclassOf变量的当前类型

版本号:4.26需求:我想在蓝图中指定类型,C++中使用Trace扫描到对象时,如果扫描到的对象类型为该类型时,则执行后续操作。所以我需要在C++中获取到TSubclassOf变量的当前类型。例如:TSubclassOf MyClass,在蓝图中指定为 继承自AActor的BP_AI类型,我们要在C++中获取到BP_AI类型。以下是调用TSubclassOf变量的一些函数时得到的输出。MyClass->StaticClass();输出为Class。MyClass->GetClas

2021-12-31 16:40:06 2190

原创 UE4 蓝图实现透视技能

先放效果图。如果你打算参考本博客,你需要知道的是:版本号:4.26这只是简单的实现一个透视效果,并未考虑性能优化的问题。文中不写原理,只写功能实现,只是说一句:通过深度测试来做的。功能:按下一个键,可被透视的物体出现在屏幕中,不可被透视的物体继续隐藏。再按一下,可被透视的物体隐藏。思路:先写一个关掉深度测试的材质,这意味着使用该材质的物体永远显示在其他物体的最前面。再为可以被透视的物体写一个透视函数,当需要透视的时候调用(可以改成接口)。透视的方法就是替换原本材质为关掉深度测试的材质,让他们永

2021-12-31 14:34:16 1410

原创 UE4C++小知识(十)随机生成可导航点

版本号:4.26如果你希望在C++中随机生成可导航点,你需要进行以下步骤。一、在Project.Build.cs中PublicDependencyModuleNames,添加"NavigationSystem" 。PublicDependencyModuleNames.AddRange(new string[] { "NavigationSystem" });二、在需要生成可导航点的CPP文件中,导入"NavigationSystem.h"头文件。#include "NavigationSyst

2021-12-28 10:10:28 1000

原创 UE4C++小知识(八)获取自身到目标点的向前向量

有个小需求是:UKismetMathLibrary::FindLookAtRotation(ControlledPawn->GetActorLocation(), TargetLocation).RotateVector(FVector(1.f, 0.f, 0.f))

2021-12-27 18:26:00 2432

原创 UE4C++小知识(九)BTTask中的FBlackboardKeySelector 返回255错误值

版本号:UE4.26如果你需要在BTTask中使用FBlackboardKeySelector,继承自UBTTaskNode。当GetSelectedKeyID()返回值为255(FBlackboard::FKey(-1))时,你需要在你的BTTask中,实现InitializeFromAsset函数。具体可以参考UBTTask_BlackboardBase类中的实现。UBTTask_BlackboardBase.h/** initialize any asset related data */

2021-12-27 18:16:51 708

原创 UE4C++小知识(7)行为树Task

本篇文章的目的:在UE4中使用C++实现一个自己的行为树任务节点。该任务节点可以完成简单的朝向Actor移动的功能。版本号:4.26项目名:AITest第一步,新建一个C++类,继承自BTTask_BlackboardBase,命名为BTTask_MyMoveTo。出现提示:需要在AITest.Build.cs中,修改下面这行代码,添加 “GameplayTasks”。PublicDependencyModuleNames.AddRange(new string[] { "Core", "C

2021-12-24 14:44:38 1570 5

原创 UE4中AI视线感知的具体检测范围

关于UE4中AI视线感知的逻辑为:(1)通过CheckIsTargetInSightCone函数,检测注册了可被视觉感知的目标是否在Cone范围内(实时检测)。(2)如果在扇形范围,则发射一条射线,如射线命中目标,则判定为看到目标。所以,AI视觉感知的检测范围,在俯视图上为 近为NearClippingRadiusSq,远为FarClippingRadiusSq,角度为 PeripheralVisionAngleCos的扇形范围。如下图所示,CheckIsTargetInSightCone函数的注释

2021-12-22 14:42:20 3044 3

原创 UE4使用AIController控制AI的移动

版本号:4.26在UE4中,我们常常需要使用AIController来控制我们的AI的移动。那么我们如何在AIController中控制AI的移动呢?首先我们得知道一个概念,那就是Pawn的移动是需要依靠移动组件的。本文章中将会提到两种移动组件,一种是CharacterMovementComponent,一种是FloatingPawnComponent。而控制AI移动的方式也有两种,但都需要先添加移动组件与设置导航范围。一、通过行为树在行为树中调用MoveTo任务节点,指定一个黑板值作为目标,

2021-12-14 22:22:31 4215

原创 UE4中出现如下报错:无法解析的外部符号

如果UE4 C++中出现如下报错:无法解析的外部符号可能是你没有添加Module。需要到xxx.Build.cs文件中,添加你需要的模块。PublicDependencyModuleNames.AddRange(new string[] { "GameplayAbilities"});

2021-12-14 15:52:24 3499 1

原创 UE4中的LookAt

(RootComp->GetComponentLocation() - LocalPawn->GetActorLocation()).GetSafeNormal().Rotation()

2021-12-12 00:08:18 965

原创 UE4实战技巧(三) 如何打断AI Move To 的移动

问题描述:UE4中自带的AI Move To 在 向导航系统请求执行成功之后,无法通过行为树中的装饰器打断,即即便打断该部分子树,AI依旧会前往目标位置。但我这边的需求是,需要它停止当前的行为,等待几秒后,根据条件判断,执行下一个行为。目前可以提供两个方案一、当目标是Actor的时候,只需清理Actor即可。当目标是位置时,需要在tick中不断调用 “停止运动”。二、直接使用一个新的请求,覆盖前面的那个清求。...

2021-12-08 14:05:30 3757 2

原创 UE4C++小知识(6)接口的使用

判断目标Actor是否有继承UPawnSightSenseDataInterface接口TargetActor->GetClass()->ImplementsInterface(UPawnSightSenseDataInterface::StaticClass())执行UPawnSightSenseDataInterface接口中的GetShapeTArray函数TArray<FVector> ShapeVectors =IPawnSightSenseDataInterfac

2021-11-29 11:17:08 621

原创 UE4判断是否在扇形中的官方代码(C++)

有时候我们需要判断某个物体是否在另一个物体的扇形范围内,可以参考一下UE4源码中的代码。源码在**“AIHelpers.h”**命名空间是 FAISystem //----------------------------------------------------------------------// // CheckIsTargetInSightCone // F // ***** //

2021-11-22 17:45:16 1413

原创 UE4实战技巧(二)AI视觉感知的所有Pawn均检测问题

最近在写敌人的AI的时候,用到了AIPerception组件,之后便发现了一个问题。当为敌人增加上视觉感知,修改检测归属为【敌方、中立、友方】之后,只要是类型为Pawn的对象,即使为增加感官刺激组件,也会触发感官的目标更新。这样导致了即使是同样的敌人也会触发视觉感知组件,为此,我感觉很不爽(因为感觉到性能的浪费)。开始打算,为每个Pawn设置【归属】,但蓝图中根本无法修改阵营信息。但在查看官方的行为树教学的时候,我发现了其中便包含了该问题的解决方式。链接如下:Unreal Engine AI wit

2021-11-09 16:36:58 2180

原创 UE4 学习笔记(十四)NPC血条组件

功能:只要为NPC添加血条组件,即可为NPC添加一根血条。并附带CurrentHp和MaxHp两个属性,且始终朝向摄像机。目的:让NPC与血条解耦,不必将血条的逻辑写到NPC中,防止NPC蓝图中的蓝图量过大,导致混乱。第一步:生成一个继承自WidgetComponent的BP_NPCHPComponent。第二步:声明两个整型变量CurrentHp和MaxHp。第三步:在组件Tick中写下如下蓝图:第四步:提供给外部停止绘制UI和开始绘制UI的事件,血条改变事件。第五步:新建一个控件蓝图

2021-10-28 23:50:52 2237 3

原创 在UE4蓝图中实现基类指针指向派生类的功能

第一步:定义基类组件BaseComponent,派生类组件DeriveComponent,用于测试的Actor TestBlueprint.第二步:定义BaseComponent的类引用与对象引用变量。并将类引用改为派生类。第三步:通过ComponentClass 来创建对象,然后赋值给ComponentObject,当需要使用时,直接使用ComponentObject即可。...

2021-10-27 23:21:24 447

原创 C++绘制游戏世界(享元模式实例)

一、定义享元模式的定义:运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式主要包含以下角色:(1)抽象享元角色:所有具体享元类的基类,为具体享元规范需要实现的公共接口。(2)具体享元角色:实现抽象享元角色中所规定的的接口。(3)非享元角色:是不可以共享的外部状态。(4)享元工厂角色:负责创建和管理享元角色。其结构如下图所示:该部分主要参考:享元模式(详解版),详情请点击该链接。二、

2021-10-23 17:39:37 1625

原创 C++实现游戏中自定义按键功能(命令模式实例)

命令模式·Design Patterns1、命令模式的定义命令模式的定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。让两者之间通过命令对象进行沟通,这样方便对命令对象进行存储、传递、调用、增加与管理。命令模式主要包含以下主要角色:1、抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法Execute。2、具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接受者的功能来完成命令要执行的操作。3

2021-10-22 16:58:31 4121

原创 UE4学习日记(十二)血液喷洒效果

一、材质制作首先,我们需要一张血液图灰度图。将其保存下来,命名为【Blood】,导入UE4当中。然后在内容浏览器中右键新建一个材质,命名为【M_Blood_Test】,混合模式设置为【半透明】。按住快捷键 【数字4】,点击空白处, 创建一个Constant4Vector,将值设置为【1,0,0,1】(红色,不透明),作为材质的基础颜色。按住快捷键 【T】,点击空白处,创建一个TextureSample,并将【材质表达式纹理Base->纹理】,指定为前面导入的贴图【Blood】,作为材质

2021-10-05 09:46:03 1163 2

原创 C++实现妄想山海中的动物类

前段时间有玩过妄想山海。所以对妄想山海中的动物的类比较好奇。所以就是尝试着自己写一下。主要涉及到的模式为建造者模式,算是一个比较大的实例吧。一、组件类妄想山海中的动物都是有多个组件的,如:头,尾,角什么的。而且可以进行修改动物的组件,且根据不同部件可以完成各自的功能。比如老虎安上翅膀,就能飞啥的。先看看类图:组件接口://组件接口class IComponent{ public: virtual void SetName(std::string name)=0; virtual std:

2021-09-23 14:48:43 1195 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除