
C++
永远的小白虾
无论什么时候,面对这计算机的浩瀚海洋,我都是小白虾
展开
-
【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 · 2021 阅读 · 1 评论 -
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 · 1297 阅读 · 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 · 6514 阅读 · 0 评论 -
UE4 为Actor添加碰撞体与实时进行Trace查询的性能比较
版本:4.26条件:初始Actor只有一个StaticMesh组件。生成1000个Actor,在初始Actor的基础上添加一个球形碰撞体。当性能趋于稳定之后:生成1000个初始Actor,在Tick中实时调用球形多物体检测。初始打开时:当性能趋于稳定之后:记录实验过程:(1)启动时差距,使用碰撞体时,游戏明显卡顿,启动需要花大于2-4秒的启动时间,而Trace检测则初始化速度很快,打开时基本没有什么卡顿的现象。猜测,可能是生成物体时,物体过于密集导致物体间发生碰撞,导致性能开销较大。原创 2022-01-20 17:47:10 · 2955 阅读 · 0 评论 -
游戏开发中的基本数学与物理
本章中会记录数学中的角度与弧度的变换,勾股定理,矢量加减、矢量数乘、矢量分解,矢量点乘等。物理中的距离、速度、加速度、力之间的关系与应用。来源为:游戏人工智能编程案例精粹(修订版)第一章一、数学1.1 角度与弧度的变换日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种度量单位。由于圆的周长为2PI,所以每个圆都有2PI弧度(Radians)原创 2022-01-19 21:46:06 · 3910 阅读 · 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 · 1529 阅读 · 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 · 2222 阅读 · 0 评论 -
UE4C++ 小知识(十二) 限制黑板键FBlackboardKeySelector的选择范围
版本号:4.26在使用C++写行为树任务的时候,经常需要在蓝图中指定黑板键,在任务内部进行修改,而有时我们需要能够限制黑板键自动筛选可以输入对象。因此,首先我们需要在C++文件中,声明一个黑板键。 UPROPERTY(EditAnywhere, Category = Blackboard) struct FBlackboardKeySelector BlackboardKey;然后开始限制该黑板键值的输入范围。限制输入范围为:BoolBlackboardKey.AddBoolFilter原创 2022-01-01 11:12:51 · 1131 阅读 · 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 · 2568 阅读 · 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 · 1254 阅读 · 0 评论 -
UE4C++小知识(八)获取自身到目标点的向前向量
有个小需求是:UKismetMathLibrary::FindLookAtRotation(ControlledPawn->GetActorLocation(), TargetLocation).RotateVector(FVector(1.f, 0.f, 0.f))原创 2021-12-27 18:26:00 · 2885 阅读 · 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 · 905 阅读 · 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 · 1803 阅读 · 5 评论 -
UE4使用AIController控制AI的移动
版本号:4.26在UE4中,我们常常需要使用AIController来控制我们的AI的移动。那么我们如何在AIController中控制AI的移动呢?首先我们得知道一个概念,那就是Pawn的移动是需要依靠移动组件的。本文章中将会提到两种移动组件,一种是CharacterMovementComponent,一种是FloatingPawnComponent。而控制AI移动的方式也有两种,但都需要先添加移动组件与设置导航范围。一、通过行为树在行为树中调用MoveTo任务节点,指定一个黑板值作为目标,原创 2021-12-14 22:22:31 · 4906 阅读 · 0 评论 -
UE4中出现如下报错:无法解析的外部符号
如果UE4 C++中出现如下报错:无法解析的外部符号可能是你没有添加Module。需要到xxx.Build.cs文件中,添加你需要的模块。PublicDependencyModuleNames.AddRange(new string[] { "GameplayAbilities"});原创 2021-12-14 15:52:24 · 4160 阅读 · 1 评论 -
UE4中的LookAt
(RootComp->GetComponentLocation() - LocalPawn->GetActorLocation()).GetSafeNormal().Rotation()原创 2021-12-12 00:08:18 · 1125 阅读 · 0 评论 -
UE4C++小知识(6)接口的使用
判断目标Actor是否有继承UPawnSightSenseDataInterface接口TargetActor->GetClass()->ImplementsInterface(UPawnSightSenseDataInterface::StaticClass())执行UPawnSightSenseDataInterface接口中的GetShapeTArray函数TArray<FVector> ShapeVectors =IPawnSightSenseDataInterfac原创 2021-11-29 11:17:08 · 698 阅读 · 0 评论 -
UE4判断是否在扇形中的官方代码(C++)
有时候我们需要判断某个物体是否在另一个物体的扇形范围内,可以参考一下UE4源码中的代码。源码在**“AIHelpers.h”**命名空间是 FAISystem //----------------------------------------------------------------------// // CheckIsTargetInSightCone // F // ***** //原创 2021-11-22 17:45:16 · 1670 阅读 · 0 评论 -
C++绘制游戏世界(享元模式实例)
一、定义享元模式的定义:运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式主要包含以下角色:(1)抽象享元角色:所有具体享元类的基类,为具体享元规范需要实现的公共接口。(2)具体享元角色:实现抽象享元角色中所规定的的接口。(3)非享元角色:是不可以共享的外部状态。(4)享元工厂角色:负责创建和管理享元角色。其结构如下图所示:该部分主要参考:享元模式(详解版),详情请点击该链接。二、原创 2021-10-23 17:39:37 · 1685 阅读 · 0 评论 -
C++实现游戏中自定义按键功能(命令模式实例)
命令模式·Design Patterns1、命令模式的定义命令模式的定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。让两者之间通过命令对象进行沟通,这样方便对命令对象进行存储、传递、调用、增加与管理。命令模式主要包含以下主要角色:1、抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法Execute。2、具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接受者的功能来完成命令要执行的操作。3原创 2021-10-22 16:58:31 · 4455 阅读 · 0 评论 -
C++实现妄想山海中的动物类
前段时间有玩过妄想山海。所以对妄想山海中的动物的类比较好奇。所以就是尝试着自己写一下。主要涉及到的模式为建造者模式,算是一个比较大的实例吧。一、组件类妄想山海中的动物都是有多个组件的,如:头,尾,角什么的。而且可以进行修改动物的组件,且根据不同部件可以完成各自的功能。比如老虎安上翅膀,就能飞啥的。先看看类图:组件接口://组件接口class IComponent{ public: virtual void SetName(std::string name)=0; virtual std:原创 2021-09-23 14:48:43 · 1365 阅读 · 1 评论 -
UE4C++小技巧(六)动态创建网格体,并绑定重叠事件
版本:4.24第一步:在头文件中前向声明一个UStaticMeshComponent指针,一个UBoxComponent指针,其中UBoxComponent指针用于指向碰撞体,UStaticMeshComponent指针用于指向静态网格物体。public: //静态网格体 UPROPERTY(VisibleAnywhere, BlueprintReadWrite,Category="Mesh") class UStaticMeshComponent* MachineMesh; //碰撞体 UP原创 2021-09-19 10:03:42 · 1923 阅读 · 0 评论 -
UE4C++小知识(五)运行过程中显示鼠标
引擎版本为4.24第一步:获取玩家控制器APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GWorld, 0);第二步:设置显示鼠标 PlayerController->bShowMouseCursor = true;//显示鼠标第三步:当你显示鼠标之后,未点击屏幕便直接拖动鼠标时,就会发现镜头直接随着屏幕晃动。由此我们便可以做以下设置。 PlayerController->Se原创 2021-09-19 09:37:17 · 3348 阅读 · 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 · 1285 阅读 · 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 · 798 阅读 · 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 · 2363 阅读 · 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 · 4909 阅读 · 0 评论 -
UE4实战记录(一)让物体向前飞行
需求为:自己实现一个投掷物类,不能使用UE4自带的ProjectMovementComponent组件。首先,我想到的是得让我的投掷物,向前飞行呀!开始实现该功能。玩家类:World->SpawnActor<AMyProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);这里就是一个生成投掷物类,具体信息去看第一人称模板。需要注意是这里投掷物的旋转是直接使用玩家控制器的旋转。投掷原创 2021-09-14 12:05:02 · 1721 阅读 · 0 评论 -
UE4小技巧(一)让C++动态生成的物体带有细节面板
最近在写一个功能的时候,遇到了一个问题,就是使用C++来动态生成一个USphereComponent组件,当使用蓝图来继承该C++类时,却发现该USphereComponent组件,没有细节面板(无法修改其中的东西)。生成的代码如下:CollisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));方法一:只需要在下面添加一句RootComponent = CollisionComp;将该组件原创 2021-09-13 20:49:04 · 1305 阅读 · 1 评论 -
C++中的const关键字总结
一、概念const 修饰符的作用就是修饰常量,即被其修饰的东西只能读取,不能被修改。1.1 作用域在C和C++中全局const变量的作用域相同,都是当前文件,不同的是它们的可见范围。C语言中const全局变量的可见范围是整个程序,在其他文件中使用extern声明就可以使用。而C++中const全局变量的可见范围仅限于当前文件,在其他文件中不可见,所以它可以定义在头文件中,多次引用都不会出错。不过如果你是用的是GCC,你可以通过extern关键字来扩大C++全局const变量的可见范围。exte原创 2021-08-30 17:37:54 · 320 阅读 · 0 评论 -
战斗系统平衡性评估(算法题)
今天面试的时候,遇到了一道感觉蛮复杂的问题。题目游戏的战斗系统一般都需要平衡性评估,尤其是伤害输出能力。我们需要在各种战斗规则下,计算角色的最大伤害输出能力。以下题目都是单个或多个角色一起攻击单个目标,不考虑目标血量,只考虑伤害能力。(1)两个角色A和B,攻击冷却时间分别为k1,k2秒,每次攻击能分别造成d1,d2的伤害。只要未在冷却中,角色可以自由选择攻击的时机,但只能在整数秒发动攻击。战斗时长总长为t秒。k1,k2,d1,d2,t都是正整数。战斗中有额外的规则:若两个角色在同一时刻一起攻击,则每个原创 2021-08-18 22:10:19 · 2196 阅读 · 0 评论 -
c++中的内存知识汇总
一、基本类型内存占用相信我,你最开始就应该知道的,是每个基础类型在不同编译器下占的内存空间大小(位数)。参考博客二、内存空间的分区c++中的内存空间大致可以分为五个区域,分别是栈区(由编译器自动分配释放,存放函数参数值,局部变量值等)、堆区(由程序员分配释放,程序结束后可能会由OS回收)、全局区/静态区(数据区存放全局变量和静态变量,程序结束后由系统释放。需要注意的是未初始化的放在.bbs段,初始化的会放在.data段)、文字/只读常量区(存放常量字符串,程序结束后由系统释放,占据comment区原创 2021-07-07 11:43:48 · 2798 阅读 · 0 评论 -
C++ Vector push_back()的首地址问题
从教程中,知道了当我们增加Vector中的容量时,Vector的首地址会发生变化,导致迭代器出现错误。因此产生一个疑问,就是push_back(),这个函数是往Vector中添加元素,当容量不够时,会自动添加容量。但push_back()是在末尾添加的,所以这个函数导致的容量增加会改变首地址吗?因此,通过下面的代码来进行验证。#include <iostream>#include<vector>using namespace std;int main(){ vec原创 2021-04-21 16:41:05 · 899 阅读 · 0 评论 -
C++需要注意的地方(一)
本文章参考至《C++ Primer Plus (第6版)中文版》第二章(1)直接使用using namespace std,是一个偷懒的做法,只是在简单的程序中使用,当复杂程序中,应该使用std:cout这样的方式,或者using std:cout。这样可以有效的防止函数的混淆。(2)有的时候,控制台输出后立刻关闭,这时候需要使用cin.git()来等待输入。如果前面有使用cin输入值的话,需要使用两次cin.git(),一次处理enter,一次等待输入。(3)如endl等对cout来说有特殊含义的符原创 2021-04-09 11:18:54 · 231 阅读 · 0 评论