- 博客(167)
- 收藏
- 关注
原创 UE GamePlayTag
该例子,仿照官方文档案例。GamePlayTag的名字要准确,包括上层的。TestContainer,就是来输入检测的例子是否满足上面的条件。1.它是一个 编辑器层级的标签,也是个变量,它可以在多种方式创建,最终在Config文件夹的对应文件里对应产生。再在ProjectSetting里面设置,自动添加同步,就有对应的GamePlayTag了。在 ProjectSetting 的 ManagerGameplayTags 里,添加。2.也有容器,相当于GamePlayTag的数组,但它有更丰富的用法。
2025-12-31 09:48:19
301
原创 UE C++ FName, FText 测试
1.在调试时,由于FText内部时不可读的引用,所以用toString转换调试。网上还有一种Unreal.natvis 拷贝,但可能版本更新后,这个方法也咩用了。测试 表里是否已经存在了这个 键值的实例,两个都找到了。这是在构造的时候找,找不到才返回0。测试相等性,虽然存了大小写,却对大小写不敏感。equal为false。Compare返回0,才相等。源码要转两次才看得到注释。
2025-12-23 12:10:32
120
原创 UE C++ 字符串编码转码
这个是老版本的转换,再转换回去。并且传入其他函数时,由于生命周期过短会有问题,不建议这么做。1.FTCHARToUTF8 传入 FString的指针,再从UTF8转换为TCHAR。2.StringCast是最新的,将TCHAR 转换为 UTF8,再转回TCHAR。1.从ANSI , Unicode(二进制),TCHAR(UE) 三个互相转换。Unicode 是一种全球统一的编码标准,它将各个语言的字符映射为二进制。这两个方案相对稳定,在UE内部也有使用。都是用<uint8>的TArray来装,和用来转换。
2025-12-22 22:31:43
121
原创 UE C++ UI的折叠动画,隐藏收缩经验分享
二.还有一种情况,我想让某个UI元素隐藏,并且让其它UI元素补上它的位置。通过将让某个GridPanel隐藏,其它的将位置补上。Transform就改位置。一.如何做UI折叠动画。很简单,UE都准备好了。选择你要动的UI元素。
2025-12-18 22:47:23
229
原创 UE 运行时编辑效果。Gizom使用增强输入改写
1.添加增强输入的资源,用静态查找的方式。这里用的TObject智能指针,其实和一般的指针用法一样,带个模板。其实也是调用上一个函数,但是选中后会修改bTraceSuccessful的值。导致不一样的逻辑,但是这是正确的。.这里会有一些问题,增强输入对bool返回值比较敏感,很多时候导致编辑器时报错,但又不会完全崩溃。2.ClearDomin清空点击后的功能,避免一直跟随移动。1.核心使用左键点击后,发射射线启用这个函数。2.在选中后,再点击轴拖动可以。拿到蓝图的资源,并赋值到Pawn内。
2025-12-15 22:29:27
393
原创 UE C++ 字符串的操作
2.它是基于TArray的类容器类,它的构造让它更容易进行增删查改,且顺序可靠自动维护。不像FName,FText,以键值对这种模式。3.对跨平台,网络传输等等都是字符串,有的传字节流。所以UE自己的FString 字符串功能完备就顺理成章了。1.因为字符串拥有完备操作函数,虽然是以牺牲一定性能的代价。二.字符串 与 UE其他数字类型的相互转换。一.为什么对字符串进行操作。1.查找,添加,替换。
2025-12-13 16:55:29
201
原创 UE FString, FName ,FText 三者转换,再次学习,官方文档理解
开头FString 更万能,并且它本身有TChar* 类型的数组。二.转化,很早之前也写过转换的文章。网络端,同步需要解码,编码来支持。UI,本地化经常用到。
2025-12-11 12:29:34
182
原创 UE5 C++ 动态多播
这里绑定了三个响应函数,一个C++,两个蓝图。还可以不像例子里在自己的类里绑定多个,还可以去其他类里绑定,AddDynamic第一个参数就填入其他类的实例。其实感觉最好用的就是把委托事件在单例里声明,这样任何类都可以拿来声明并绑定。2.多播绑定的 函数必须加入反射系统(有UFUNCTION宏),不然找不到,也就失去了多播的意义。也是在Begin Play里绑定,在EndPlay里解绑。这里在Begin Play里就绑定,参数要相同。再来个在关卡蓝图里绑定,这里执行玩一次就解绑了。一.声明,多播的几个要点。
2025-12-09 20:49:15
340
原创 UE C++ 如何通过动画蓝图驱动 骨骼网格体做刚性旋转
1.通过GetPawnOwner 可以拿到,动画蓝图的Pawn,再获得Pawn的属性赋值给动画蓝图里的参数。也就是说你在Pawn里的 UPROPERTY(EditAnywhere)的值,暴露给编辑器后,这个值会同步到动画蓝图里的参数。2.这个函数放到蓝图函数里的 类似Tick事件里执行,这里叫EventBluprintUpdateAnimation。动态加载的核心,主要是这个UAnimBlueprintGeneratedClass类,是默认包含的,是引擎核心类,无需加头文件。这里是选择使用动画蓝图。
2025-12-09 10:36:19
413
原创 UE C++ 加载骨骼,骨骼动画,做简单的刚性旋转操作
首先是选中骨骼,其次旋转的模式,旋转的空间都需要改变为 Add to Exisiting, Parent Bone Space。然后,改变动画蓝图里的Rotation,网格就会进行刚性旋转。就和加载材质有点像,只不过动态网格是USkeletalMesh,而谷歌是USkeleta。不知道是不是和CopyReference里的Engine.后面的保持一致。打开后,找到SketelMesh,左上角的Edit,对对应的骨骼进行移动,旋转。需要启用,官方的这个插件。好像5.5是自带启动好的,5.3还需要开启一下。
2025-12-08 07:43:42
210
原创 UE5 C++ 动态单播放
3.在蓝图里就要多一些步骤,不是直接CustormEvent连上不行,因为默认是没有返回值的。可加可不加(有UPROPERTY宏),有时UE抽风就加,说不定就绑上了。强调一下,绑定的函数一点要参数一致,且加入反射系统(有UFUNCTION 宏)动态单播,需要把参数的名字也声明上,不仅仅只写参数类型。2.蓝图里绑定就是用蓝图连上 CustomEvent。这个是在继承的蓝图类里绑定。1.C++ 里绑定,使用BindFuntion()三个函数,暴露给蓝图。4.在执行时可以有返回值,但这个在蓝图里看不到.
2025-12-04 14:35:25
220
原创 UE C++ TSet 查询和删除
2.感觉有点疑惑,感受不到这个容器的意义。Find 可以替代 上面的 Contain 加 下标。而且Find 会返回对应类型的指针。这样好像又能理解一些了,比TArray消耗更少,只存和拿不会自动排序。看源码,其实不是传递的数组。是创建了临时数组传入添加赋值,最后返回这个数组。1.在新的版本应该是没有Index这个函数了,里面的Index。Reset() 会清空Number,保留Max的内存。TSet的Reserve 起到先扩容 Max的作用。相同的值,TSet 不会重复添加。Empty(0) 会全清空。
2025-12-03 12:10:07
234
原创 UE5 C++ 多播绑定执行演示
一对对的响应,这里就创建一个发送多播的Actor,和多个响应多播的Actor。这里我学到一个牛逼的,只要你遵循反射规则写好宏,哪怕你在一个cpp里面也可以创建,两个类。并且引擎里会显示出来。AXGMultiDelegateActor作为发播类, AXGMultiExecuteActor 作为执行函数响应类。因为声明里有FString的参数所以,在发报的时候添加进去。2.BeginPlay里找到场景里的发报类,并且用AddUObject 进行绑定,这里是只放一个发报的。响应函数就是,自己的ID号,和血量。
2025-12-02 12:25:46
236
原创 UE5 C++ TSet 创建初始和迭代
auto,如果明确只知道类型,可以用类型替换。改引用就是改对应的内存。都没用到过,后面用到再说,感觉比TArray快,但不会自动排序。把元素本身放入容器,更快速。感觉用的少,并且排序不可靠。有点象TArray的感觉。
2025-12-01 12:05:39
247
原创 UE5 C++ 最简洁的万能案例,使用增强输入驱动移动旋转Pawn
这样我们直接对Controller 进行旋转,就达到整体旋转的效果了。最后个注释的,把输入设备变为Player0的有情况需要,比如Controller从其他Pawn移过来。1.让后在创建继承自C++的蓝图pawn,这样方便直接赋值 输入的 资产。2.创建一个空Pawn C++类,并开始初始化需要的组件。Move相对难一点,因为你要算现在的方向是在坐标系下的哪个方向。2.一个增强输入上下文 IMC,并设置Move,Look的键和参数。Look,这个相对简单、两个Add函数都是Pawn自带的。
2025-11-28 23:33:37
357
原创 UE5 C++ JSON文件读取 JSON Reader
TJsonReader<TCHAR> 是 通过TJ送Reader Factory<TCHAR>里的Ceate 制造出来,并且在Create时,里面传入之前读到的FString。3.这个时候,通过将FJsonSerializer类里的Deserialize函数,传入。这个时候,就实现了,FString到FJsonReader,再到FJsonObject。4.JsonObject又有各种As开头的函数,进行转换为对应的变量。在JsonObject时有三种方式,解析的函数。二.FJsonObject的解析。
2025-11-19 22:57:42
326
原创 UE5 C++ JSON 写入文件 JSON Writer
同样在WriteValue时,一开始要有WritObjectStart也是就{,写完内容后,还要有WriteObjectEnd 就是}回来。1.通过TJsonWriter的WriteObjectStart()表示开始写{,但是最开始不能在里面加TEXT();再for(auto& A:Arrays)来 写,至于写数组的内容。可以有键,也可以没有键。所以最终都是 WriteValue(TEXT(键),值)这样的写法,表示键是WX,值是大括号里面的内容。在嵌套的内层可以使用 {上面代码按格式解析出来。
2025-11-16 20:06:29
168
原创 UE5 C++ 定时器 官方案例(二)
同样加上UPROPERTY的UPROPERTY(EditAnywhere),后将变量。后倒计时最后一秒的函数暴露给蓝图,重写。这里还学到个沿用C++ 之前的代码,在那个基础上再加蓝图。右键Event重写事件。接下来我们将 时间参数暴露出来,并增加爆照效果到蓝图。二、创建蓝图,并把部分变量给蓝图。一.在上一部分里,我们创造了 一个定时器。这样C++原有的也能用,卧槽涨知识了。
2025-11-13 17:59:49
182
原创 UE5 C++ JSON 最简单,麻烦的方式,直接读存(一)
1.这种方式是在 写好FString里的数据,以JSON的格式,创建数据格式类似{“”:“”,“”:“”}。然后用SaveStringToFile,将数据以哪种数据流格式,存到具体路径的文件夹下。这里用的UTF-8.FPaths::ProjectSavedDir();可以看出,它是给的Save的文件夹路径。3.反序列化,把数据从文件读回FString里。
2025-11-12 12:28:10
222
原创 UE5 C++ 定时器 官方案例练习
UPrimitiveComponent 是涉及渲染的组件,三角面的渲染几何等等。渲染线程它不能用U开头的东西,它会在这里把数据转换为F开头的结构体,把数据传递给渲染现场。定时器,AdvanceTimer 减少计时,更新显示的位置。并判断是否要消除计时器,再最后清楚的时候,更新文本。UpdateTimeDisplay()更新,在BeginPlay一开始的时候就更新一次,并设置好定时器。一.这里参照 官方案例。
2025-11-12 12:10:46
300
原创 UE C++ 定时器
AActor在World里,所以主要是在AActor里通过GetWorld拿到 TimeManager.也可通过UGameInstance拿到全局定时器。当然直接GetWorld()后的World里从World调用也是可行的,它底层是从World里的OwningGameInstace里的方法。通过GetWorldTimerManger拿到世界的管理器,这是在Actor里封装的,并返回TimerManager的引用。定时器句柄,很重要,要好好管理。1.定时器一般都是在世界里获得 定时器的管理者。
2025-11-10 13:22:37
320
原创 UE5 C++ 反射 运行时获取类和字符串的信息
1.使用GetClass() 获取反射类的类型,而这个方法来自于UObjectBase,经常看大钊的UObject的应该很熟悉这个。不过它是获取反射类的名字。源代码注释里说明了,它是UObject更下一层级的接口。5.测试代码 在GameMode里测试Student,的运行时,获得它的属性,类信息。再升入可以发现,它是泛型的。4. 获得Property的类型, GetCPPTpe().首先我们需要创建一个UStudent类,它本身拥有反射的。在里面去拿 反射的类的信息,也就时 元数据的 具体信息。
2025-11-06 13:19:07
489
原创 UE5 C++ Slate 画曲线
二. 首先我们必须包含 UMG 模块,因为要在C++里继承UserWidget。其次我们需要包好Slate和SlateCore 模块。3.将数组两两放入曲线中,得到更顺滑的数组。最终核心的Slate 还是FSlateDrawElement::MakeLines函数,进行绘画。它更是UserWidget里用来画最大LayerID的,当LayerID增加,它就不停刷新。这里也绘制了X轴,Y轴,使用的是FSlateDrawElement::MakeText。1.这里我们SetValues用于外部调用。
2025-11-05 21:10:19
222
原创 UE C++ Map Slack
它和TArray的Slack的有类似的,但更复杂。Slack是多出来的内存,它不是TArray链表不会自动对齐,它也许不是连续的。先使用Reserve,就可以用十个无效值去占内存。如果不用它,Num超出Max后,TMap会自动扩容。Slack Remove 是把对象释放了,但是它内存并没有释放。也就是Max不变小。这个时候Compact就可以进行压缩,把中间值像空气一样压到末尾。直到Shrink以后,会把末尾释放。再使用Shrink就能再次释放。一.什么是Slack。
2025-11-05 20:41:07
275
原创 UE5 C++ 代码上构建反射
我粗糙的觉得,它和Generated共同写静态代码,就像补充好了头文件,和定义的关系。编译时,生成静态代码的反射你还没有,就是说生成基础代码C++给引擎用的你还缺。今天我们就简单的从最基本的代码理解反射,这也是今天从一个视频上学来的,结合上最近反射的理论学习觉得很有意思。2.在这个类里面需要,修改它是个 空的C++类需要将它,改成有反射的类。每一个基于UObject类的实现类,都有对应的UClass用于存元数据等反射数据。1.这个是在UE里构建一个最简单的类,它本身是没有反射的。问题来了,什么是元数据。
2025-11-04 23:13:05
850
1
原创 UE TMap C++ 运算符
这是 UE 中与 std::move 类似的功能,不过当传入右值或常量对象时它不会编译通过,因为我们希望在 MoveTemp 无效果时得到提示。=,这种是复制新的。UE 内部有重载运算符。但是MoveTemp,原容器就会被清空。* MoveTemp 会将一个引用转换为右值引用。
2025-11-03 07:53:56
211
原创 UE5 C++ TMap 排序
三.排序后,之前的指针就无法,再指向原来的元素。因为指针存的是地址,TMap是无序的。所以结果看M1,M2并没有加在同一个元素上。* 调用方式为:“MyMapVar.ValueSort( PREDICATE_CLASS() );* 调用方式为:“MyMapVar.KeySort( PREDICATE_CLASS() );* 根据每对键值对的键对 pairs 数组进行排序,然后重建映射的哈希值。* 根据每对键值对的值对 pairs 数组进行排序,然后重建映射的哈希值。二.ValueSort。
2025-11-03 07:39:50
309
原创 UE C++ TMap 移除
当你没找到,也不会改变原来的引用。ElementSetType类,居然本质是TSet 让我对 TSet的学习更为期待。2.会保留,预期的可能的(potentially)已经分配的空间,也就是你传入的值。看代码,测试代码会发现会返回的其实是值类型,这个whether 感觉用的不太好。1.清空后,会保留你之前申请的空间,即Max不会变,Num清零。Num 会被清为0,但是Max 会因为你申请的值而改变。1.Remove 会返回TMap里的删除元素的数量。1.赋值的是变量的引用,而不是复制的值。
2025-11-01 22:04:56
297
原创 UE C++ 离线安装 经验
最神奇的是,我还没有Microsoft Visual Studio这个文件夹。我有其他的后面Microsoft Visual Studio1.7这种。离线时你又下不全,经典的报错 nutget无法还原。最直接暴力的方式是在你自己装好的环境整包拷贝。一般再C盘,你的用户下。考到你的离线环境对应的账户下。最好下个全包的吧,企业版的最好。2.VS的离线包,可以参照微软的官方教程,或者其他帖子。3. VSselector工具,就是用来刷新VS的工具。二.有时VS安装有问题,有时候有没问题。一.首先思路,和资料。
2025-10-28 22:15:06
278
原创 TMap的查询
这里用引用会,改到TMap里本身的值。直接等号是复制体,如果不想它被改动,就在引用钱买你加const。GenerateValueArray 会将所有的值生成数组,都是无序的。FindRef,返回的是一个值副本,不会创建新的元素。如果没有就会返回默认值的副本。FindOrAdd如果没有查询到,就会创建新的元素加入,返回的是引用。看源码,Find一般返回的是空指针。如果不是空指针,就能访问。GenerateKeyArray 会将所有的键值生成数组。FindKey,按值找key,更慢。如果没有键,就会触发断言。
2025-10-28 16:19:22
257
原创 UE C++ TMap容器的 创建和遍历
3.迭代器,TMap里的 .CreateConstIterator(),只是他的key,value要用It.key(),*It.Vlaue方法才能拿到的。2.TPair<>& + for循环,其实auto 出来的就师TPair。这里添加会返回,当前值的引用。一.一般分为TMap和TMultiMap。1.auto& + for循环。都是先声明,再往里面添加。也可以用Emplace。将两个Map合并在一起。可以重复添加,相同的键。
2025-10-14 13:13:33
163
原创 UE C++的单播的其它方式(二)
在执行CallReplaceMyDelegate 便改掉了绑定。一.对于智能指针的Lamda函数的绑定 BindSPLamda。二.对于原生C++的绑定 BindStatic。用CreateLamda来代替原来的委托。五.绑定 弱指针对象的 Lamda函数。三.绑定 线程安全的 智能指针。匿名函数就能顶替掉原来的函数。在CPP里创建一个纯C++函数。沿用用上篇文章的智能指针。六.新建委托,代替原委托。四.绑定 反射的函数。
2025-09-18 15:08:45
138
原创 UE C++ 单播委托 的多种方式
只是绑定的时候,需要多绑定一些匿名函数。匿名函数传参,和声明委托传参可以一致即可。这里就不用,另外在实现因为它就是写在参数中,相当于临时函数一样。方便用完就完了,不用去头文件什么,传来传去。1.在头文件里,写一个C++ 原生类做测试。不反射,接着在委托函数里,实例化指针。同样的还有个BindSPLamda,也是绑定那个对象,然后调用那个Lamda表达式。1.说下我对 Lmada表达式的简单理解,把函数当成 参数传递进去。用共享指针的弱引用 创建新的对象,再用弱指针指向它。2.进行测试,写到这里。
2025-09-12 07:08:45
313
原创 UE C++ 单播的委托
另一个响应的Actor,首先需要拿到发号施令的人(申明并实例化的Actor类),然后Cast 转化。拿到它的委托指针,用里面的 绑定操作(BindUObject),注册自己并绑定响应函数。只是发号施令的更方便。没有严格按声明的委托来,函数多加了额外的参数,就是绑定的时候,也多绑定了额外的参数。()里对应,先填返回值类型,再填委托的声明的名字,传入参数类型。多用于,委托定死了,不能改的情况。3.同样在创建,响应的函数,里面包含一个参数传入。有参,无参都能负荷,这里用二里有参的委托来举例。3,绑定,将的参数。
2025-09-10 09:52:19
303
原创 UE C++ 系统再学习委托(一)对官方文档的理解
除了动态(不在蓝图里能用,符合上面说的,蓝图限制多),在绑定时,可以将参数存储在委托内,调用时,此参数将被传到绑定函数。绑定到智能指针,和UObject 上,这两个声明周期是UE管理好的。动态可能会限制多一些,不如C++灵活,反射系统的注册也需要一些额外的规定,可能不支持载荷之类的等等。不知道为啥叫动态,叫反射多播多好,英译吧可能。单播 单向传播 一对一,只有一个对象绑定后能下能响应。多播,动态单播,动态多播的变体如下。多播 多向传播 一对多,四处留情,一呼百应。单播,多播,动态单播,动态多播。
2025-09-09 10:00:22
289
原创 UE5 制作游戏框架的部分经验积累(持续更新)
它用来存储 每个关卡具体的 游戏逻辑,游戏规则,并存着临时的数据。这些临时数据随时会存到GameInstance的全局数据库里,也会从里面读来用来初始化,或者其他用途。由于几乎每个关卡都需要UI,所以可以放到对应每个关卡的GameMode里,有的多有的少。3.初始化,游戏最开始的时候需要的 配置表之类的。它的生命周期开始的非常早,最大限度的减少了游戏等待资源加载的时间。1.我们通常会把它用来存储 核心的数据,这样既方便保存读取,也方便随时初始化加载。对于每个关卡,都会有的功能,可以抽象出来一个父类。
2025-09-04 21:30:43
358
原创 UE5.3 C++ 接口初步使用
但不建议BlueprintNativeEvent的接口,直接在内部定义。因为它一定会被,继承的类重载,哪怕代码一摸一样,你也要抄一份过去,他最终调用的是继承接口的派生类的,这一点与C++思想一样。有一个方式可以用接口默认方法,但是那个不安全。是选择加入的,只有主动标记的类型、属性、方法会被反射系统追踪, UnrealHeaderTool 会收集这些信息,生成用于支持反射机制的C++代码,然后再编译工程。且支持反射系统的类型都有一个相应的UClass,或者它的子类,UClass中包含了该类的描述信息。
2025-09-04 16:03:50
609
原创 UFUNCTION C++ 的再次理解
添加 const 后有以下几个意义: 常量函数:当你声明一个函数为 const,则表明它不会修改任何外部对象的状态,这对于安全性和提高代码效率很有帮助,因为编译器可以对这类函数进行优化。二.函数说明符控制 ,函数在引擎和编辑器各个反面的UPERPERTY属性说明符类似,属性控制的时变量。此函数不对拥有它的对象产生任何影响,可在蓝图或关卡蓝图图表中执行。2.纯函数没有引脚,输出引脚连两次的话,哪怕是打印函数,可能会执行两次逻辑。,是写入代码的位置。这里官方还比较明确了,蓝图覆盖不了,再用.cpp里的原生的。
2025-09-01 22:34:01
427
原创 UE5 C++ 第三方动态库的使用
再用FPlatformProcess::GetDllExport.传入这个解析出来库的指针,和你要使用的函数名的TEXT类型,比如TEXT("BASS_Init")。返回也要进行指针转换,转换为对应的函数指针。FPlatformProcess::GetDllHandle将他解析为 任意类型,用void* 接受。这里是给 函数指针起了 叫BassInitToFunc的别名。bin里有dll动态库,include里有动态库需要的头文件。二.在Target.cs里,进行设置。一. 首先要考入对应的 第三方库。
2025-09-01 17:37:08
607
原创 UPROPERTY的再次学习
我们跟着官方文档来理一下,查缺补漏具体的细节。或者说变量在蓝图和编辑器下,以哪种方式显示,其实构成也不复杂如下,就两个组成。UseEnumValuesAsMaskValuesInEditor 应该是可以自己赋值,比如ECB_Blue 是16,而不用默认定好的Bit位1,2,4。UPROPERTY([变量说明符specifier,....],[元数据meta,....]) 可叠加。UE5.3蓝图里,支持的只有三个。四.其余的数字类型,加上UPEROPERTY。结构体里有 暴露好的数组,再组成它的数组。
2025-08-25 16:04:20
355
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅