首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    UE4 中通过单例类实现全局数据管理

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。...初学者必知的UE4新建关卡时的一些设置【虚幻引擎】。控件 UI 的摆放如下图所示,一个蓝色按钮和一个红色按钮,下面对应是蓝色方和红色方的比分。图片然后修改关卡蓝图,将 UMG 添加到视口。...图片二、C++ 代码新建 C++ 类,注意需要打开 显示所有类,继承自 Object 父类,并将生成的类命名为 Singleton,如下图所示。...图片图片编辑源码如下,需要注意的是由于反射机制, ue4 中的构造函数没办法转为私有。...WikiUE4[C++]在虚幻引擎实现单例模式 - 知乎[UE4]线程锁FScopeLock用法_玄冬Wong的博客-CSDN博客

    2.2K21

    UE4中的DynamicTexture数据更新

    最近在UE4中实现了程序实时生成的Mesh顶点动画, 使用的顶点数目很多(几十万量级) 一开始是创建Dynamic Vertex Buffer, 然后每帧去更新顶点数据,发现效率比较低 效率的瓶颈在顶点坐标的计算上..., 毕竟数量有点多 于是改成了基于Vertex Texture(Material中的World Position Offset)的实现,那VB就不用更新了, 只需要每帧更新Texture 这么做虽然传输的数据量是一致的...UpdateResource(); } 改完一测, Crash了, 仔细一看, 原来是FTexture2D::UpdateResource()中会重新创建D3D Texture对象,相关函数必须是GameThread中调用才可以...本身这种数据更新的方式就有问题, 能不能直接更新到对应的D3D Texture中呢?...搜索UE4的代码, 发现FTwitchLiveStreaming::UpdateWebCamTexture()中有比较高效的实现, 大致思路就是把数据发到RenderThread去直接更新, 调用的是RHIUpdateTexture2D

    3.2K110

    【技术总结】UE4中的Subsystem

    在4.22版本发布了之后,我们可以直接将工具写在Subsystem中,让引擎帮我们自动管理工具类的生命周期,不再需要自己维护工具的生命周期或者修改引擎的类(如GameInstance)。...但是即便是这样也需要手动为每一个单例类写一遍,很容易出错,也不容易维护。 总而言之,不管是什么样的实现方法,UE4客户端开发都得要自己管理好自己写的单例类的生命周期,心智负担极大。...目前UE4支持的Subsystem类型有以下5种: Engine类:UEngineSubsystem Editor类:UEditorSubsystem GameInstance类:UGameInstanceSubsystem...(另,FSubsystemCollectionBase继承了FGCObject,不然F开头的纯C++类无法访问/管理U开头的UE4的类,如果感兴趣的话可以看一下相关的资料,这里不赘述)。...还记得我们提到过FSubsystemCollectionBase继承了FGCObject,所以F开头的纯C++类可以引用U开头的UE4类型对象,从而能够让UE4的GC系统管理引用的对象吗?

    7K72

    UE4中的单映射:TMap容器

    一、TMap是么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每个键都是唯一的。类似C++中的Map....; }  注意的是,迭代器指向了单映射的每一个元素时,可以用key来取得元素的键,用Value来取得元素的值。 运行后可以看到输出结果: ?...; } } }  现在我们学了最常用的三种容器,动态数组容器——TArray,集合容器——TSet还有单映射——TMap。当然还有各种各样的容器,它们的操作都是大同小异的。...C++的泛型编程的优点也在于此,它们提供了相似的接口使得我们非常容易精通各种各样高效的容器。在游戏开发中,我们很少会重新写基本的数据结构类型,因为游戏引擎已经为我们提供好了大多数的数据结构。...但是并不意味着没有必要学习数据结构,只有当你学习过数据结构,才能熟练地运用游戏引擎为我们提供的容器。这和我们的学习游戏引擎原理于使用游戏引擎的关系是一样的。

    2.2K90

    UE4中程序驱动的LookAt动画

    很多游戏中都有, 就是角色转头+眼镜转动盯着一个目标看, 通常是盯着镜头看用的比较多 UE4里实现这个功能很容易, 直接在AnimGraph里使用LookAt结点就可以了 4个LookAt...实际项目中用的时候, 有个需求是NPC播放一段动画师做的全身动画后, 再盯住玩家, 然后再播, 再盯, 如此循环. 这种情况下, UE4内置的LookAt功能就出问题了....所以这个节点是没考虑当前骨骼的状态的, 每次都是从上一次的LookAt位置开始进行插值. 本着不直接修改引擎代码的考虑, 怎么解决这个问题呢? 1....是不能override的, 已经被父类声明成了final. 3....在PreUpdate里取出当前动画的Bone Transform, 计算出一个TargetLocation, 这样在刚开始更新时开始进行插值的初始位置就是骨骼朝向的位置了, 也就没有了看向不相干位置的问题

    2.3K80

    UE4的枚举

    UE4在C++中和标准的枚举是一样的,支持两种写法,enum和enum class /** Parameter enum for CastChecked() function, defines when...UE4为了解决enum class在做位运算时不方便的问题,提供了一个宏和一些模板函数 // Defines all bitwise operators for enum classes so it...typename Enum> void EnumRemoveFlags(Enum& Flags, Enum FlagsToRemove) { Flags &= ~FlagsToRemove; } 可以看到,宏中声明了各种位运算的运算符重载函数...对象,将枚举自动注册到了虚拟机中。...比如下面的示例代码,会将传入的枚举名中的所有字符串以key-value的方式存入Map中 有一点额外要注意的是,FindObject查找枚举类型的对象,只能在游戏线程运行,在其他线程执行会因为虚拟机状态无法保证会有崩溃

    2.1K20

    【UE4项目】类魂ARPG游戏实现

    演示 https://hctra.cn/file/video/arpg_1_0.mp4 功能实现介绍 【虚幻引擎】实现类LOL缓慢扣血血条 【虚幻引擎】实现锁定敌人与切换锁定 【虚幻引擎】简单三连击实现...补充:因为时间短,目前只做了包括战斗系统的一些基础功能,后续会加入篝火、等级加点、道具拾取、背包系统、界面UI、换装、处决等,逐渐完善。...1, } ​ -- 攻击类型 cls.AttackType = { NormalFire = 1, LeftSkill = 2, RightSkill = 3, } 操控用到的按键...一次打击的伤害计算 = int((攻击力 招式伤害倍数 - 受击方防御力)\ range(0.9, 1.1) )。 伤害倍数在1.5以上的显示暴击效果(黄字伤害)。...FootAttack = 1, ThrowAttack = 2, HandDownAttack = 3, } 优化项 敌人残血可释放处决击 换装、换武器 模块 翻滚可跳过受击倒地的站起后摇

    1.2K11

    UE4的TSparseArray

    UE4里也有一个这样的容器,但是内部实现却跟安卓的版本完全不同,我个人觉得UE4版本的实现,才是名副其实的SparseArray,而谷歌的版本从功能上来说叫SparseMap可能更合适。...其实并不是这样的,只要你在写UE4程序,那么这个容器你就基本上一直在用,因为他是TMap和TSet内元素的容器,你使用TSet和TMap时数据实际就存在内部的TSparseArray中,UE4的TMap...下面具体来说说UE4版本的TSparseArray是怎样实现的,可以重点关注内部是怎样管理已经删除的元素的,这点实现的非常巧妙。...如果链表里有空闲元素,只要找空闲元素,并把这个元素从链表中删除即可。...需要注意的是Num得到的是元素的个数,而GetMaxIndex得到的是内部数组的Num,如果有空位时,这两个值是不相等的。 再说说遍历操作,因为中间有空位,所以不能简单的用索引遍历,要用迭代器。

    1.8K20

    UE4的TripleBuffer

    UE4中有一个特殊的容器TripleBuffer,三缓冲,顾名思义,这个容器内确实是有三个Buffer。...UE4的TTripleBuffer 前面说了这么多,只是为了讲解三缓冲本身的原理,UE4提供了TTripleBuffer容器,就是按照这样的原理,可以让两个线程之间可以高性能同步数据。...额外提到了一点,为了避免交换指针,他用了一个flags来记录Buffer,这一点我觉得是UE4这个容器最有特色的一点,也是将性能优化到极致的一个体现,这个下面会具体解释。...那既然TripleBuffer这么好用,为什么UE4内部用的这么少呢?可以全局搜索,除了一个Test代码,基本没有地方在用。...但TQueue就完全不会有这样的问题,所以这就解释清楚了为什么UE4内部在要求高性能的场景,即使有大量内存碎片也要使用TQueue(其实每次都new问题不严重,因为UE4有实现自己的内存池,重载了new

    1.2K10

    UE4在vscode环境中开发调试

    UnrealVS\VS* 目录下vsix文件,双击运行安装 vs安装UE4.natvis /Engine/Extras/VisualStudioDebugging/UE4.natvis 拷贝到 vs的Common7.../Packages/Debugger/Visualizers目录下,调试时值鼠标移动到变量上,值可见 UE4 使用vscode开发 修改配置后,File菜单项点击生成vscode项目,再启动即可...可以在launch.json中添加如下代码,实现简单的附加调试操作 { “name”: “(Windows) 附加”, “type”: “cppvsdbg”, “request”: “...attach”, “processId”: “${command:pickProcess}” }, c++代码自动补全,改成tag parser(版本较老容易出现错误提示,ue4中个人感觉更好用些,...default是最新版) 或者下载clang(ue4不是标准的C++语法clang和cpp_tool个人感觉都一样) Clang

    2.5K20

    【虚幻引擎|UE4】TArray在C++中的使用

    简介TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。...Element值//Init(const ElementType& Element, SizeType Number)IntArray.Init(10, 5);图片增删改查注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型...Args)InitArray.Emplace(3);两者区别多数效果相同,细微区别:Add(或 Push)将元素类型的实例复制(或移动)到数组中。Emplace 使用给定参数构建元素类型的新实例。...查[]通过下标索引返回对应元素的引用,因为是引用所以可以改变容器元素。...在FString中,此为忽略大小写的词典编纂比较。稳定排序。可自定义比较器。

    2.7K00

    UE4的TArray(三)

    但在实际业务中,有不少情况用堆来实现功能会有明显的优势。最后会具体来说,先来介绍基本用法。...UE4已经封装好了这3个基本操作,如上面代码所示。...那么这里最麻烦的就是怎样从10000只怪物中挑选出血量最少的这100只。 第一反应肯定是对10000个怪物全排序1次,返回前100个就好了。...TArray是UE4最简单也是最常用的一个容器,能在自己的代码里用对TArray,就相当于是写对了大部分的逻辑。...当然UE4除了TArray外,还有许多容器,许多数据结构和类,比如TSparseArray,TMap, TTripleBuffer等,在仔细研究源码后,一样能找出很多非常精彩的设计和深不见底的坑点,等后续有空了也会记录下来

    1.7K21

    UE4的TArray(二)

    1 查询: vector的at, []运算符,在TArray中对应的也是[]运算符,但是UE4会根据Allocator的参数做范围检查,当越界时会触发check(系统的assert)崩溃。...在做一些特殊逻辑时,比如想做UE4的ECS框架,去实现Component结构,在不清楚业务的如何定义元素类型时,可以结合使用这两个函数间接得到类型的大小和内存容量。...UE4的容器迭代器版本的移除直接使用迭代器的RemoveCurrent函数,封装在了迭代器内部,而且相对于STL,不用担心遍历中删除的问题,从易用性来说要更好一些。...5 迭代器 UE4提供了C++返回标准迭代器的begin和end函数,因此可以使用range-for语法遍历。其实看这里代码,能明显感受到C++设计上的槽点和UE4的无奈。...这种迭代器提供了额外的运算符和几个函数,可以做到移动位置,清空,跳到末尾,移除当前等操作,和STL不一样的地方是,RemoveCurrent可以在遍历中操作,不用担心Index越界问题,写代码时候会更加方便

    1.9K30

    游戏开发之UE4添加角色到场景中

    接着上次继续学习,现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中。要这样做,我们必须从UE4的GameFramework类继承它。 一....创建一个从Character类继承的类 从基本框架类继承是很简单的: 1) 在项目中打开你的UE4编辑器。 2) 在文件,选择“新建C++类”。 ?...5) 最后点击创建类来使用代码创建这个类。 6) 然后UE4会自动运行你的VS项目。我们在项目解决方案中打开Avatar.h文件: ?...定义好的宏,UCLASS()宏使得你的C++代码在UE4编辑器中可用。...更好的做法是,可以在运行时改变载入的资源。 下面我们从C++类中创建一个蓝图: 1) 在菜单栏中的窗口-开发者工具-类别查看器。 2) 在类别查看器中,右击Avatar,选择创建蓝图类。

    3.3K50
    领券