- 博客(117)
- 收藏
- 关注
原创 样条线Mesh动态网格 工具 和 距离检测工具
里面集中处理了样条线的数据,CPP里其他的函数很多都在这里被调用清楚原先样条点,生成新的样条。核心在CreateSplineMesh,它里面集成封装了CPP里计算每个面的角度,计算网格体信息的所有相关函数来算三角形面,法线,贴图。2.FSplineMeshData 样条线网格的数据 ,样条点数,样条点间的距离,每一个样条点的位置,样条网格面数,每个样条点的计算方式,网格的生成方式。样条的点的总数,每个样条点距离开头的距离,每个样条点的位置,每个样条点向上的向量,每个样条点向前的向量。鼠标发射射线调用输入。
2025-05-19 07:45:01
272
原创 POI 点击互动
这个相对好理解,将POI上挂上碰撞体。用射线检测,碰撞判断是否是POI,再回调里面的响应函数。设置好碰撞体的大小位置即可。一.难点是WigetComponent加载的UI无法确定你点击到的是哪个POI,这里有两种写法。拿到当前尽头位置,和POI 位置。没帧数进行插值逼近。距离小于0.01时停止。1.通过射线检测回传,镜头移到前方。2、通过UI点击,发报机发送。二.实现镜头平滑移动。
2025-05-14 07:56:37
275
原创 多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。二.开始需要绑定,每一个,按键事件。在函数里,会通过GetPawn,判断当前肉体是哪个Pawn,在对于调用此时这个Pawn的函数功能。
2025-05-12 07:52:22
332
原创 UE5.3 C++ 房屋管理系统(二)
前面的是通用的,对表Tablet的数据进行增删查改。后面是根据不同的需求,封装了前面对表操作的功能。然后实现,对表的增删查改。当房屋管理者的TMap发生改变,也对表里的数据进行同样操作。就是表行的基类,里面的数据类型,和TMap里BuildInfo保持一致,方便同步。DataTable表,实际是每一行的名字,对于每一行的内容。表里的RowName,是系统自动添加的用于标识每一行。1.DataTable是UE常用的表,虽然不是专门用来存档的,但也可以这么用。创建表,并选择表里的每一行的数据是上面的结构体。
2025-05-12 07:44:11
371
原创 UE5.3 C++ 房屋管理系统(一)
如果是静态加载,就是在编辑器情况下放置,但这样方便了摆放,但管理就需要在开始是将所有的房屋找到加到管理者里。这个生成就是一定满足管理者,不然不生成,相反无论怎么写都不太可能,写的运行时和编辑器一样方便摆放设置。各有优缺点,所以这里我使用的动态加载,原因只是因为动态加载我写过。动态加载 模型后,也是存储在它自己的,m_childComponentMap组件字典里,这个用在自己读取JSON文件动态加载,组装后加入到这个Map。如果有拓展的功能,就用Cast,将对于指向基类指针转换为,多态的子类。
2025-05-09 07:58:05
508
原创 UE5.3 C++ 如何在c++ 中拿到UI元素,并绑定不同事件响应功能
但是不同的元素,需要的绑定参数是不一样的,比如按钮,OnClick,只需绑定点击后回调的函数名,而Text则绑定文本变化后,回调的函数。其实都不用改,把里面的抄到你定义的函数里,把多余的逗号去掉。这个和之前文章的碰撞回调是一样的,也是AddDynamic回调。转到FOnSelectionChangedEvent的定义,发现绑定需要两个参数,有参动态多播。所以定义Event的,函数需要对应这两个。UButton里,有OnClicked的回调。从声明里可以看出,这个是无参,多播的回调。再转Evenet的定义。
2025-05-07 07:38:27
334
原创 UE C++ 实现 智慧城市 中围绕一个点的移动旋转自由视角
这个应该最难的,不仅要用欧拉角旋转矩阵计算你当前朝向的前后左右,避免死锁,计算准确。还需要时刻记录,你当前的Controller朝向,因为Controller带动着Pawn在你朝向前后左右分别移动。并且还做了效果处理,当镜头越远,移动幅度越大。网上只看到蓝图实现的,C++自己尝试出来的。4.旋转,也有一定难度。但是yaw问题不大,360°随便转,它是连续的。当值超过360会跳变为0,小于0,也会跳变。旋转平移,以及左右鼠标激活的限制,条件。2.远近,比较常规的写法。5.让镜头,转移到自己的控制权。
2025-05-06 07:50:00
286
原创 跟着官方文档底层学习 二元谓词 中的 匿名函数
在TestLambda测试得到的效果是一样的。有点回调的意思,而且你的断点,直接打不到匿名函数里。测试,但在MyTeam2里通过二元谓词,用Money排序。我们在TestLambad里定义一个匿名函数。在结构体最后,重载 < 运算符,用Id排序。就是随便在某个地方定义后就能直接使用。一.UE匿名函数 的初步认识。二.通过二元谓词,排序结构体。我们就能看到,截然不同的排序。再在这里定义一个正常函数。
2025-03-05 07:44:54
171
原创 底层跟着官方文档学习 容器TArray 排序 和 二元谓词
这个排序Sort 和 堆排序,不区分大小写。每次排序都差不多一个结果。大小写,他们是一样的。
2025-02-26 23:52:03
26
原创 底层跟着官方文档学习UE C++ TArray容器系列 迭代 和 排序
WebSocket通信过程去创建WebSocket,要下一帧执行。类似Error,容器不要在遍历的时候去删。迭代器的方法,有点不常见。有点像个指针,迭代完还自带break.一.首先测试下,官方案例。二. 可能导致的错误用法。
2025-02-26 21:52:15
192
原创 官方文档学习TArray系列 容器的符号
1.重载一下 元素中的 == 运算符,有时需要重载排序。接下来,我们将id 作为判断结构体的标识。测试,发现相同Struct,相同的ID不会被同时加入,AddUnique使用了重载运算符。一.TArray中的元素相等。
2025-02-24 23:59:17
147
原创 官方文档学习TArray数组的运算符
MoveTemp的实现原理,应该先进行了深拷贝。再将原动态数组清空。元素自身要有 ==。数组要顺序数量同时相同,才能叫数组间的相同。就是我们常说的深拷贝,完全复制一个对象到另一个数组。最后敲一遍实例代码,会有更深的理解。1.重载== 运算符。
2025-02-24 23:56:56
275
原创 跟着官方文档学习 TArray系列(二)添加元素
TArray的Add,可用于简单常见的数据结构 int32,float这样。即使有临时值代价也不大。但如果是USTURCT,FString这样的就可以用Emplace这样,直接加入数组。TArray的增加,不是来一个加一个。而是类似std::Vector那样的怎加方法,大概就是超过就怎加一倍这样,他肯定有对于的算法。Num = 4,之前都是4.
2025-02-20 23:33:43
217
原创 跟着官方文档学习 UE5.3 C++ TArray系列(一)
它们就相当于C++动态数组Vector,但是被UE封装了,懂得都懂反射嘛,要不一不小心就被回收了。它真的非常常见,我所用的容器中,它绝对排名第一,第二是TMap。
2025-02-19 22:40:10
320
原创 UE5.3 C++ USTRUCT 的再次理解
之前写过USTRUCT创建,当时只是作为通信的接口,从零开始创建,能在C++里使用。我们来看看官方文档里面是如何描述创建的,更简洁但很明白。一.USTRUCT创建。
2025-02-18 23:35:18
390
原创 UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。
第一个点,是本身直接放过去。第二个点是使用AddSplinePoint放进去。让后算两个点的距离,通过材质参数集合,设置UV。材质参数集合,它的改动,在上面的代码里。它在材质里的如下图,只设置了V的平铺,没设置U的平铺。一.制作了基于USplineComponent的画线插件,就是我们常说的样条线。直接看怎么用,关于插件实现细节,后续会更新,看思路就行。通过ID,管理每一条线。二.材质参数集合在C++使用。材质参数需要的头文件。
2025-02-16 21:18:43
471
原创 UE C++ UObject 功能的初步总结(结合官方文档)
2.序列化:编辑器的资产序列化到磁盘上,变为.uasset等格式的资产文件。所有的东西存在编辑器里,都是UObject,它们通过Serialize()进行里的序列化操作。4.自动属性初始化:所有UPROPERTY下的属性值,如果自己不初始化,则会自动初始化,就是int ,float 会初始化0,字符串会初始化为空串。3.默认属性值自动更新:属性值你改过,就以你改过为准。你在代码里改过默认属性值,则所有没改过的属性值都会跟着改。USTRUCT 大部分都有,它有着和UObject一样的反射和序列化能力。
2025-02-15 23:31:08
333
原创 UE5.3 C++ USTRUCT的规范使用和制作简单的画线插件
如果想让蓝图认识,需要加BlueprintType。如果想让变量能在蓝图中访问,可用Break/Make,需要使用UPROPERTY修饰符(BlueprintReadWrite)。先介绍,这种简单一点的通过,UE自带的LinePatchComponent进行画线。把模块和头加上就能从GameInstance里获得GameSubsystem,再转换为自己的system。用UGameInstanceSubsystem做插件的好处,有很多。这个是画线的,把头和组件加上就行了。1.首先需要创建一个,None。
2025-02-13 22:31:34
344
原创 UE 5.3 C++ 对垃圾回收的初步认识
所有的C++ UObject都会在引擎启动的时候初始化,然后引擎会调用其默认构造器。如果没有默认的构造器,那么 UObject 将不会编译。只是上一个更通用,下面这个在构造函数里才使用,来创建和管理组件。AddtoRoot,强制不被回收。一旦按下3,垃圾回收。自己的UObject就会被回收掉。在你Actor的头文件的中,声明一个UObject·。解决方案,加上UPOPERTY,让它被对象引用。虚幻会管理,它重载了new 和 delete。UObject 不支持构造参数。并在Actor里声明它。
2025-02-01 21:46:26
405
原创 UE5.3 C++ CDO的初步理解
一.UObjectUObject是所有对象的基类,往上还有UObjectBaseUtility。注释:所有虚幻引擎对象的基类。对象的类型由基于 UClass 类来定义。这为创建和使用UObject的对象提供了 函数,并且提供了应在子类中重写的虚函数。为 UObject 提供工具类的函数,不应直接使用此类。为更底层接口提供给UObject,也不能直接使用反射系统直接,一般是收集UObject的信息。是在运行的时候,拿到运行的对象注册的信息。将这个信息写入对象的表,随时可以取到,访问。
2025-01-29 19:02:48
1214
原创 年度总结(尽量简短)
1.对于U++使用更熟练,能应付基本的开发。几个项目的练习和磨练,基本达到了我今年的目标,自己可以应付项目。2.对于建立自己的工具库,建立自己的服务器。保存自己的财富做的还不够好,确切的说是还没引起重视。希望今年,自己可以多喝水,多运动。1.对于自己想练习的东西,需要更有执行力。多练多做,看明显比做的多。只有从做中,才能明白更多的东西.2.坚持写帖子,虽然后半年的帖子发的没有上半年勤快。3.对于职场上的焦虑,减轻一些。见多了,慢慢就没把和多东西看得很重了。4.对于算法,其实一直都是自己的弱项。
2025-01-29 11:43:04
223
原创 UE C++ 对打包后的窗口的操作
SetScreenResolution设置窗口的分辨率FIntPoint()。这个代码,可以放到GameInstanceSubsystem的Initialize里,打包后后以最快的方式去设置窗口。3.直接使用C++的原始方式,设置UE的窗口。这个的好处是,可以在开始运行很快,就拿到窗口。而不是运行到一定时间,加载到虚幻准备把窗口给你后,才操作。这个通过Viewport拿到Window()的,再移动到哪个点。2.通过虚幻给的窗口句柄,用Windows的函数操控窗口,来设置窗口层级和移动窗口位置大小。
2025-01-17 22:32:03
423
原创 UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击
Canvas Panel的所有子集都是平行关系,因此有些时候会出现上方图层渲染层级高于下方的图层,这个时候可以调Zorder强行调整渲染层级。同一Actor下挂载或的widget component 可通过Layers shared layer name和Layer ZOrder来设置层级,数值越大越上,layername相同的order需一样;在上图顺序中,bg_1的显示层级低于bg_2 因为panel_1的Zorder低于panel_2不能按照-10+20=10&即使上面有其他,但也能点击到。
2025-01-09 00:11:48
321
原创 UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化
这里当时卡住了,我继承了C++类来进一步写POI的写如UI的TEXT。这样就可以实现Actor拿到它想显示的UI,并赋值修改这个UI。两个函数,无论时显示UI现在的地方,还是UI输入去其它地方都能实现,坐标的转换。简单做个UI,这个UI把锚点放到屏幕中心。就能实现3DUI刚好在那个点上。然后在CPP里,实现组件。并设置为3DUI,这里用的屏幕尺寸的。而且涉及经纬度,ToText需要设置小数点后的位数 7。创建C++ Actor来制作,APOI。自动在对应经纬产出物体,显示经纬高。简单的通过UI,传值调用。
2024-12-25 20:30:49
545
原创 UE5 C++ Subsystem 和 多线程
有点像“全局变量”,也有点像是静态蓝图函数(如GetGameInstance),可以方便的在蓝图的各个地方调用。Subsystems真正的威力其实远不止这点手头上的便利,而在于接下来要谈的引擎帮你自动处理的部分。我觉得可以暂时理解为线程的生命周期,是由代码确定的,而不是直接和UE的其它类保持相同。创建一个空的类,在类里面继承FRunnable。经典的单例写法,一个static指针,一个staic获得自己的函数。一.Subsystem先做一个简单的介绍,其实可以去看大钊的文章有一篇专门讲这个的。
2024-12-11 22:27:30
741
原创 UE5 根据数据库播放字幕 和 C++碰撞产生爆照特效
一定要在继承AActor,APawn这样的类上使用,而且一定包含了继承的头文件。但要将 NigaraFunctionLibrary的头文件加上,SpawnSystemAtLocation里的参数,也可以不用默认参数。然后就能实现 ,相同类的不同子类 ,碰撞后爆炸的效果。首先实现BlueprintImplementableEvent函数,使用插件里的蓝图静态库函数转换为FName,再读取表里的结构体。头文件,碰撞和回调函数都声明了。将这个结构体,传入RunText,加入到视口一段时间后,又消失。
2024-12-02 23:05:22
494
原创 UE5 C++ 定时器控制Component持续旋转 和 动态加载模型
3.使用管理者拿到每一个目标,如果高于一定高度,并且之前在地面上,才收。这样一个Bool就可以让这个动作有唯一性。ConfigData 是读取到JSON文件并解析的数据,通过这段代码就可以拼接一个车,飞机,轮船等模型。2.拿到静态网格组件,并定时让他旋转到一定角度,清空定时器。很简单,设置创建方法类型,并将组件添加到实例组件列表中。可得UActorComponent的三个流程。附着节点,再设置相对父节点的位置。
2024-11-09 21:55:35
461
原创 C/C++ 位运算算法小练习(二)
进制问题,主要需要将 数 % 要去的进制。/= 要去的进制。余数分别*自己的进制 N次方。这里主要使用异 运算符。都能实现互换 1变为0. 0变为1。二.位运算 实现 变量互换。
2024-10-20 23:43:34
267
1
原创 C/C++ 位运算小算法练习
对于奇偶性判断,我们关注的是整数的最低位(即二进制的最右边一位)。这是因为除了最低位以外,其他位上的数字都是2的幂次方,因此它们加起来一定是偶数。最低位的1代表的是2的0次方,即1,它决定了整数的奇偶性。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5。第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。例如,2是10,4是100,8是1000。
2024-10-20 10:02:22
381
原创 UE C++ BlueprintImplementableEvent 和 BlueprintNativeEvent再次理解
BlueprintImplementableEvent只能在蓝图定义,绝对不在cpp里定义,要在蓝图里定义。你标签里都说BlueprintImplementable 在蓝图里实现定义了,你当然不能在CPP里这样。因为蓝图里定义实现了。蓝图通信方便,但是C++虽然不实现定义,也能调用蓝图的定义逻辑。在C++可以声明和定义函数,在C++里调用该函数,蓝图重写实现该函数(蓝图可以重写或不重写C++父类函数)在C++可以声明函数(不能定义,蓝图重写),在C++里调用该函数,蓝图重写实现该函数。
2024-10-15 15:44:23
1112
原创 UE C++ 实时加载模型的总结
首先看武器的Map里是否,包含之前加载的武器模型。如果包含这个ID的武器。找到并拿到它,销毁。然后在Map里移除这个指针。如果实时加载UE模型,需要先将之前的模型删除。再生成出来,放在根节点,保持相对位置,相对的俯仰角。设置ID,让它们绑定到组件上,将根组件变为USceneComponet组件,就有位置信息。重新生成,m_WeaponType在构造时初始化,工厂然后通过,工厂生成武器。如果想要不在跟组件上,就使用如下代码。武器生成后,就可以了,然后销毁工厂。让后设置相对于根节点的相对位置。
2024-10-08 22:58:40
415
原创 UE C++ 插件读取图片(二)
图片的加载过程先通过SetCompressed将二进制文件转化为BGRA的数据,然后通过GetRaw()函数提取到数组里面赋值给Texture2D,然后通过CreateTransient创建图片信息数据。上篇文章(一)有函数,通过传入路径的文件格式,依据尾部的信息,不同的文件格式的图片的ImageWrapper。图片文件对应的原始RGBA数据是没有压缩的,且与图片格式无关,称为RawData;2.然后写的函数,将外部图片变为UTexture。图片文件数据是经过压缩的数据,称为CompressedData;
2024-09-04 21:36:46
550
原创 UE5.3 新学到的一些性能测试合计(曼巴学习笔记)
三.编辑器外,详细记录一段时间所有性能表现的工具——Unreal Insights。UE5.3的位置有所更新,在右下角的Trace里。右侧为不同的部分,CPU上的逻辑,大部分还可以追溯到 性能消耗的代码。二.查看GPU的消耗。可以记录这一刻各个部分的占用情况,只能看当前的。可以分享,保留,删除。GPU 上可以放大,具体某一刻的许多模块。2.输入命令行,profilegpu。自动开始,记录直到关闭独立运行的窗口。还有很多的技巧,可以在官方文档中学习。关闭实时渲染,并运行独立进程的游戏。
2024-09-04 11:17:30
817
原创 UE5 C++ 读取图片插件(一)
在BlueprintLibrary中用static全局函数,这样在蓝图中可以直接去调用非常方便。智能指针,虚幻底层包含原生C++,智能指针可以包裹原生C++。5.结构体用于区分,每个图片的具体信息。结构体名称不仅要F开头,而且要像个UE的类一样声明如下,可读可写。7.图片加载,加载模块ImageWrapper(build.cs里添加的模块)。判断尾部,在返回队形的相关信息。3.在TextureReaderBPLibrary.h里,添加需要使用的头文件。用于图片类型,路径类型。通过文件路径,去加载图片。
2024-09-04 09:20:33
804
原创 UE引擎内置插件信息 储存的位置
uproject。图标文件可以让UE 引擎内置插件,配置更改,比如我希望我的DataSmithImporter插件是启用的。
2024-09-02 23:19:46
390
原创 UE5 摄像机图像采集到材质 映射到 UI 和 物体表面
五,但是如果要用于UI,还需要更改SceneCapture2D的摄像机的CaptureSource为 FinalColor(LDR)。或者其它的,原来默认的 会让UI变为透明效果。三.将RenderTarget贴图放到SceneCapture2D的摄像机上Scene Capture的TextureTarget。四.这个时候的映射贴图,产生的材质可以直接。但这个方法,性能直接从120降到70,80的样子。一.创建SceneCapture2D的组件。二.创建用于 映射的 贴图。
2024-08-29 20:18:08
1419
1
原创 UE 的整形数理解
int通常占用4个字节(32位),long通常占用4个或8个字节(取决于平台,可能是32位或64位),long long通常占用8个字节(64位),而short通常占用2个或4个字节(取决于平台,可能是16位或32位)。无符号类型和带符号类型的区别在于无符号类型不能表示负数,只能表示非负数,而带符号类型可以表示正数、负数或零。例如,一个无符号的int可以表示从0到2^32-1的值,而一个带符号的int可以表示从-2^31到2^31-1的值。虚幻使用的字符类型为 TCHAR,采用 UTF-16 的编码格式。
2024-08-27 21:14:11
445
原创 Cesium 全球视角 和 多方案镜头切换
镜头切换,在一个Pawn里的多个镜头。可以使用UE中World Settings里的玩家控制器中,默认的控制器行为会对当前开启的Camera组件进行激活处理。同一个输入,可以将不同的Pawn对应不同的功能,可能相同也可能不同。这里我是让每个Pawn自己抢夺,控制权。实现不同Pawn之间的是视角切换。三.处理输入,最好在Controller里,为什么因为你的Pawn换了,你也能逻辑清晰,不必重写。但是如果是两个Pawn之间切换,就要用Poccess 掌控。1.我用这两个都行,前提是这个是在世界里的物体。
2024-08-27 19:58:02
611
原创 UE 限制PlayerController 旋转时,Pitch俯仰角一直在地面往上
原理就是 当Pitch < 0时,就 让它只能往上加。其余时候都是可以加,可以减。为什么要让它有时为0,因为有时要往下过头,影响效果。
2024-08-22 19:17:02
282
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人