UE4
永远的小白虾
无论什么时候,面对这计算机的浩瀚海洋,我都是小白虾
展开
-
【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 · 1813 阅读 · 1 评论 -
【UE5 Mass AI】UE5技术演示视频中的MassAI笔记
在虚幻引擎中,Mass Framework是面向数据的一种框架设计,而MassAI则是一个具体的用例。Mass Framework可以分为三部分:MassEntity,MassGameplay,MassAI。1. Mass EntityMassEntity是一种面向数据的框架,该框架有两部分,一为片段(Fragment),非常小的数据结构,会连续的储存在内存中;另为实体(Entity),则是由片段构成集合的实例。该框架中将所有处理逻辑与数据构成进行解除联系,所有的数据构成均在片段中。为了了解要在原创 2022-04-26 17:59:12 · 6102 阅读 · 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 · 1235 阅读 · 0 评论 -
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 · 6040 阅读 · 0 评论 -
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 · 891 阅读 · 0 评论 -
UE4 为Actor添加碰撞体与实时进行Trace查询的性能比较
版本:4.26条件:初始Actor只有一个StaticMesh组件。生成1000个Actor,在初始Actor的基础上添加一个球形碰撞体。当性能趋于稳定之后:生成1000个初始Actor,在Tick中实时调用球形多物体检测。初始打开时:当性能趋于稳定之后:记录实验过程:(1)启动时差距,使用碰撞体时,游戏明显卡顿,启动需要花大于2-4秒的启动时间,而Trace检测则初始化速度很快,打开时基本没有什么卡顿的现象。猜测,可能是生成物体时,物体过于密集导致物体间发生碰撞,导致性能开销较大。原创 2022-01-20 17:47:10 · 2787 阅读 · 0 评论 -
游戏开发中的基本数学与物理
本章中会记录数学中的角度与弧度的变换,勾股定理,矢量加减、矢量数乘、矢量分解,矢量点乘等。物理中的距离、速度、加速度、力之间的关系与应用。来源为:游戏人工智能编程案例精粹(修订版)第一章一、数学1.1 角度与弧度的变换日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种度量单位。由于圆的周长为2PI,所以每个圆都有2PI弧度(Radians)原创 2022-01-19 21:46:06 · 3798 阅读 · 0 评论 -
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 · 1405 阅读 · 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 · 2043 阅读 · 0 评论 -
UE4C++ 小知识(十二) 限制黑板键FBlackboardKeySelector的选择范围
版本号:4.26在使用C++写行为树任务的时候,经常需要在蓝图中指定黑板键,在任务内部进行修改,而有时我们需要能够限制黑板键自动筛选可以输入对象。因此,首先我们需要在C++文件中,声明一个黑板键。 UPROPERTY(EditAnywhere, Category = Blackboard) struct FBlackboardKeySelector BlackboardKey;然后开始限制该黑板键值的输入范围。限制输入范围为:BoolBlackboardKey.AddBoolFilter原创 2022-01-01 11:12:51 · 1025 阅读 · 0 评论 -
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 · 2466 阅读 · 0 评论 -
UE4 蓝图实现透视技能
先放效果图。如果你打算参考本博客,你需要知道的是:版本号:4.26这只是简单的实现一个透视效果,并未考虑性能优化的问题。文中不写原理,只写功能实现,只是说一句:通过深度测试来做的。功能:按下一个键,可被透视的物体出现在屏幕中,不可被透视的物体继续隐藏。再按一下,可被透视的物体隐藏。思路:先写一个关掉深度测试的材质,这意味着使用该材质的物体永远显示在其他物体的最前面。再为可以被透视的物体写一个透视函数,当需要透视的时候调用(可以改成接口)。透视的方法就是替换原本材质为关掉深度测试的材质,让他们永原创 2021-12-31 14:34:16 · 1541 阅读 · 0 评论 -
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 · 1127 阅读 · 0 评论 -
UE4C++小知识(八)获取自身到目标点的向前向量
有个小需求是:UKismetMathLibrary::FindLookAtRotation(ControlledPawn->GetActorLocation(), TargetLocation).RotateVector(FVector(1.f, 0.f, 0.f))原创 2021-12-27 18:26:00 · 2696 阅读 · 0 评论 -
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 · 819 阅读 · 0 评论 -
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 · 1691 阅读 · 5 评论 -
UE4中AI视线感知的具体检测范围
关于UE4中AI视线感知的逻辑为:(1)通过CheckIsTargetInSightCone函数,检测注册了可被视觉感知的目标是否在Cone范围内(实时检测)。(2)如果在扇形范围,则发射一条射线,如射线命中目标,则判定为看到目标。所以,AI视觉感知的检测范围,在俯视图上为 近为NearClippingRadiusSq,远为FarClippingRadiusSq,角度为 PeripheralVisionAngleCos的扇形范围。如下图所示,CheckIsTargetInSightCone函数的注释原创 2021-12-22 14:42:20 · 3356 阅读 · 3 评论 -
UE4使用AIController控制AI的移动
版本号:4.26在UE4中,我们常常需要使用AIController来控制我们的AI的移动。那么我们如何在AIController中控制AI的移动呢?首先我们得知道一个概念,那就是Pawn的移动是需要依靠移动组件的。本文章中将会提到两种移动组件,一种是CharacterMovementComponent,一种是FloatingPawnComponent。而控制AI移动的方式也有两种,但都需要先添加移动组件与设置导航范围。一、通过行为树在行为树中调用MoveTo任务节点,指定一个黑板值作为目标,原创 2021-12-14 22:22:31 · 4598 阅读 · 0 评论 -
UE4中出现如下报错:无法解析的外部符号
如果UE4 C++中出现如下报错:无法解析的外部符号可能是你没有添加Module。需要到xxx.Build.cs文件中,添加你需要的模块。PublicDependencyModuleNames.AddRange(new string[] { "GameplayAbilities"});原创 2021-12-14 15:52:24 · 3955 阅读 · 1 评论 -
UE4中的LookAt
(RootComp->GetComponentLocation() - LocalPawn->GetActorLocation()).GetSafeNormal().Rotation()原创 2021-12-12 00:08:18 · 1060 阅读 · 0 评论 -
UE4实战技巧(三) 如何打断AI Move To 的移动
问题描述:UE4中自带的AI Move To 在 向导航系统请求执行成功之后,无法通过行为树中的装饰器打断,即即便打断该部分子树,AI依旧会前往目标位置。但我这边的需求是,需要它停止当前的行为,等待几秒后,根据条件判断,执行下一个行为。目前可以提供两个方案一、当目标是Actor的时候,只需清理Actor即可。当目标是位置时,需要在tick中不断调用 “停止运动”。二、直接使用一个新的请求,覆盖前面的那个清求。...原创 2021-12-08 14:05:30 · 4309 阅读 · 2 评论 -
UE4C++小知识(6)接口的使用
判断目标Actor是否有继承UPawnSightSenseDataInterface接口TargetActor->GetClass()->ImplementsInterface(UPawnSightSenseDataInterface::StaticClass())执行UPawnSightSenseDataInterface接口中的GetShapeTArray函数TArray<FVector> ShapeVectors =IPawnSightSenseDataInterfac原创 2021-11-29 11:17:08 · 665 阅读 · 0 评论 -
UE4判断是否在扇形中的官方代码(C++)
有时候我们需要判断某个物体是否在另一个物体的扇形范围内,可以参考一下UE4源码中的代码。源码在**“AIHelpers.h”**命名空间是 FAISystem //----------------------------------------------------------------------// // CheckIsTargetInSightCone // F // ***** //原创 2021-11-22 17:45:16 · 1572 阅读 · 0 评论 -
UE4实战技巧(二)AI视觉感知的所有Pawn均检测问题
最近在写敌人的AI的时候,用到了AIPerception组件,之后便发现了一个问题。当为敌人增加上视觉感知,修改检测归属为【敌方、中立、友方】之后,只要是类型为Pawn的对象,即使为增加感官刺激组件,也会触发感官的目标更新。这样导致了即使是同样的敌人也会触发视觉感知组件,为此,我感觉很不爽(因为感觉到性能的浪费)。开始打算,为每个Pawn设置【归属】,但蓝图中根本无法修改阵营信息。但在查看官方的行为树教学的时候,我发现了其中便包含了该问题的解决方式。链接如下:Unreal Engine AI wit原创 2021-11-09 16:36:58 · 2432 阅读 · 0 评论 -
UE4 学习笔记(十四)NPC血条组件
功能:只要为NPC添加血条组件,即可为NPC添加一根血条。并附带CurrentHp和MaxHp两个属性,且始终朝向摄像机。目的:让NPC与血条解耦,不必将血条的逻辑写到NPC中,防止NPC蓝图中的蓝图量过大,导致混乱。第一步:生成一个继承自WidgetComponent的BP_NPCHPComponent。第二步:声明两个整型变量CurrentHp和MaxHp。第三步:在组件Tick中写下如下蓝图:第四步:提供给外部停止绘制UI和开始绘制UI的事件,血条改变事件。第五步:新建一个控件蓝图原创 2021-10-28 23:50:52 · 2561 阅读 · 3 评论 -
在UE4蓝图中实现基类指针指向派生类的功能
第一步:定义基类组件BaseComponent,派生类组件DeriveComponent,用于测试的Actor TestBlueprint.第二步:定义BaseComponent的类引用与对象引用变量。并将类引用改为派生类。第三步:通过ComponentClass 来创建对象,然后赋值给ComponentObject,当需要使用时,直接使用ComponentObject即可。...原创 2021-10-27 23:21:24 · 497 阅读 · 0 评论 -
C++绘制游戏世界(享元模式实例)
一、定义享元模式的定义:运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式主要包含以下角色:(1)抽象享元角色:所有具体享元类的基类,为具体享元规范需要实现的公共接口。(2)具体享元角色:实现抽象享元角色中所规定的的接口。(3)非享元角色:是不可以共享的外部状态。(4)享元工厂角色:负责创建和管理享元角色。其结构如下图所示:该部分主要参考:享元模式(详解版),详情请点击该链接。二、原创 2021-10-23 17:39:37 · 1661 阅读 · 0 评论 -
UE4C++小技巧(六)动态创建网格体,并绑定重叠事件
版本:4.24第一步:在头文件中前向声明一个UStaticMeshComponent指针,一个UBoxComponent指针,其中UBoxComponent指针用于指向碰撞体,UStaticMeshComponent指针用于指向静态网格物体。public: //静态网格体 UPROPERTY(VisibleAnywhere, BlueprintReadWrite,Category="Mesh") class UStaticMeshComponent* MachineMesh; //碰撞体 UP原创 2021-09-19 10:03:42 · 1828 阅读 · 0 评论 -
UE4C++小知识(五)运行过程中显示鼠标
引擎版本为4.24第一步:获取玩家控制器APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GWorld, 0);第二步:设置显示鼠标 PlayerController->bShowMouseCursor = true;//显示鼠标第三步:当你显示鼠标之后,未点击屏幕便直接拖动鼠标时,就会发现镜头直接随着屏幕晃动。由此我们便可以做以下设置。 PlayerController->Se原创 2021-09-19 09:37:17 · 3219 阅读 · 0 评论 -
UE4C++小知识(四)两种输出方式
引擎版本为4.24第一种方式:打印到屏幕上#include "Engine.h"GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Red, FString(TEXT("test1")));#include "Kismet/KismetSystemLibrary.h"UKismetSystemLibrary::PrintString(this, TEXT("Successed Produce NPC:%d"),Num); 第二种方式:打印到原创 2021-09-19 09:29:54 · 1245 阅读 · 0 评论 -
UE4C++小知识(二)创建一个单独的FStruct.h文件
#pragma once#include "CoreMinimal.h"#include "Engine/Datatable.h"#include "FProduct.generated.h"/** * */USTRUCT(BlueprintType)struct FProduct:public FTableRowBase{ GENERATED_USTRUCT_BODY()public: FProduct() { ProductPrice = 0; } UPROPERTY(E原创 2021-09-19 09:22:16 · 714 阅读 · 0 评论 -
UE4C++小知识(三)操作DataTable
在日常的UE4开发当中,我们需要读取DataTable类型的数据。需要做的:第一步:导入头文件#include "Engine/Datatable.h"第二步:设定读取路径FString TableLoadPath=FString(TEXT("/Game/XXX"));第三步:加载DataTable文件//加载DataTableUDataTable* ProductTable = LoadObject<UDataTable>(NULL, *TableLoadPath);第原创 2021-09-19 09:13:12 · 2254 阅读 · 0 评论 -
UE4C++小知识(一)加载Widget的控件蓝图类
第一步:写入蓝图类的路径//写路径FString WidgetClassLoadPath = FString(TEXT("/Game/Project/UI/WBP_StoreUI.WBP_StoreUI_C"));//一定要加这个后缀名第二步:获取到该类//获取类UClass* Widget = LoadClass<UUserWidget>(NULL, *WidgetClassLoadPath);这里使用的LoadClass为动态加载类的方法,可以程序运行之后执行,也就是说可以放原创 2021-09-18 15:47:27 · 4586 阅读 · 0 评论 -
UE4实战记录(一)让物体向前飞行
需求为:自己实现一个投掷物类,不能使用UE4自带的ProjectMovementComponent组件。首先,我想到的是得让我的投掷物,向前飞行呀!开始实现该功能。玩家类:World->SpawnActor<AMyProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);这里就是一个生成投掷物类,具体信息去看第一人称模板。需要注意是这里投掷物的旋转是直接使用玩家控制器的旋转。投掷原创 2021-09-14 12:05:02 · 1646 阅读 · 0 评论 -
UE4小技巧(一)让C++动态生成的物体带有细节面板
最近在写一个功能的时候,遇到了一个问题,就是使用C++来动态生成一个USphereComponent组件,当使用蓝图来继承该C++类时,却发现该USphereComponent组件,没有细节面板(无法修改其中的东西)。生成的代码如下:CollisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));方法一:只需要在下面添加一句RootComponent = CollisionComp;将该组件原创 2021-09-13 20:49:04 · 1221 阅读 · 1 评论 -
UE4【C++】射线检测
配置环境:UE4.24+Vs2019为了写一个功能,需要使用到UE4 的C++射线检测。但国内网站有的,大部分都蓝图的实现方法,官方文档里面也没有。仅有的几个,还是不能使用。在国外网上找了一个勉强能用的,但却无法检测到物体,然后就再稍微改了一点。// Called every framevoid AFondCreater::Tick(float DeltaTime){ Super::Tick(DeltaTime); FHitResult OutHit;//用于接收命中的Actor FVecto原创 2021-09-09 20:22:02 · 2808 阅读 · 0 评论 -
UE4面试基础知识(三)
1、如果要在游戏的开始和结束执行某些操作,可以在UE4哪儿处理?如果你是指的一个关卡的开始和结束位置执行某些操作的话,可以创建一个Actor专门用于执行这些事件。开始的操作放在BeginPlay中,结束的操作是在EndPlay中。BeginPlay会在关卡开始时调用,EndPlay会在关卡切换的时候调用。注意该Actor不能提前调用Actor的EndPlay。如果是还要开始一些的话,就是LevelActor的Construct()函数。如果是还要晚一些的话,就是LevelActor的BeginPl原创 2021-08-18 17:34:53 · 4644 阅读 · 0 评论 -
UE4面试基础知识(二)
1、在客户端是否可以获取到AIController?不可以,在DS模型下,AIController只存在于服务端,其主要是通过在服务端对Pawn进行操控,然后再同步到客户端。UE4 AIController2、客户端上面能够执行RPC的对象有哪些?RPC(远程过程调用),是在本地调用但能在其他机器(不同于执行调用的机器)上远程执行的函数。在客户端上能够执行RPG的对象需要满足:(1)该Actor必须被复制(2)如果RPC是从客户端调用并在服务器上执行,客户端就必须拥有调用RPC的Actor。原创 2021-08-17 22:42:54 · 7468 阅读 · 0 评论 -
UE4面试基础知识(一)
1、Actor的EndPlay事件在哪些时候会调用?EndPlay - 在数个地方调用,保证 Actor 的生命走向终点。在游戏过程中,如包含流关卡的 Actor 被卸载,Destroy 将发射此项和关卡过渡。调用 EndPlay 的全部情形: (1)对 Destroy 显式调用 (2)Play in Editor 终结 (3)关卡过渡(无缝行程或加载地图) 包含 Actor 的流关卡被卸载 (4)Actor 的生命期已过 (5)应用程序关闭(全部 Actor 被销毁)原创 2021-08-15 16:40:14 · 27278 阅读 · 7 评论 -
个人制作的游戏
以往的经历中制作过的一些练手游戏。unity游戏制作桃园斩:4399桃园斩魔晶拼图:4399魔晶拼图一号地牢:4399一号地牢UE4 练手demoACT游戏dmeo,跟着一个up做的,自己魔改了一下。B站ACT小游戏通过汉字组成词语来解谜的解谜游戏。B站解谜游戏...原创 2021-06-30 21:23:59 · 366 阅读 · 2 评论