自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 如何正确高效的在Unreal中截图

我们支持了两种方式(Viewport和Capture)的截图,两种方式能够满足不同的截图需求。Viewport能够获取真实的显示画面支持含UI截图,Capture支持自定义后处理材质并且有更好的截图性能。对于截图性能的关键因素Texture导出耗时,我们通过修改Texture格式、异步读取像素和保存FColor中间数据三个方法大幅减少了这部分的耗时,让我们能够支持30fps甚至60fps的截图需求。此外如果需要以视频输出,可以通过OpenCV等第三方库来直接将每张图的FColor数据转为视频格式。

2025-03-26 17:16:12 977

原创 Unreal开发问题总结(近期)

在编辑器中的GC频率和game中的GC频率有很大不同,编辑器中的GC间隔非常长,甚至只有在打开其他地图和重新编译代码等情况下才会GC。那么可能是你继承的基类所属的模块没有加入依赖,而且对于继承问题还有一点需要注意,当一个类支持导出(有XXX_API)但它的某个基类不支持导出时,这个类也不能被导出,一个典型的例子是UE4中的UAnimSequence(它的基类AnimationAsset不支持导出)如果想让其他模块也能使用此模块内定义的LogCategory,需要在声明时加上模块API。

2025-03-18 12:17:44 300

原创 深入理解Unreal中的AI感知系统

UE中提供了几种基础常见的感知类型(视觉、听觉和队友等),游戏中涉及到的每种Sense都会唯一的初始化保存在PerceptionSystem中并对应一个SenseID每种Sense都有自己的更新时间间隔,在PerceptionSystem的每个Tick中都会通过ProgressTime更新时间间隔,然后到时间后就Tick更新。

2024-09-18 15:25:37 1153

原创 Unreal游戏初始化流程

本文主要是总结Unreal在游戏启动时的初始化流程,包括讨论PIE和Standalone的区别,避免把一些初始化逻辑放在不合适的位置,比如我希望在所有Actor BeginPlay后执行某个逻辑,那我如果把它放在Subsystem的initialize中显然就会搞砸。

2024-09-13 20:16:13 1437

原创 Unreal LevelSequence功能扩展

Track、Section、EvalTemplate、EvaluationData和ExecutionToken就是我们在扩展轨道时需要接触的几个概念,我们不仅可以显示对话文本,如果我们有对话选项等系统的话也可以按照相同的方式与Sequence结合起来,更好的将Sequence融入到游戏中关于更加详细的源码分析可以参考其他大佬的文章UE4 LevelSequence源码剖析(一)UE4 LevelSequence源码剖析(二)UE4 LevelSequence源码剖析(三)

2024-03-08 14:18:49 1355

原创 Unreal ACL动画压缩库解析

ACL是一个由社区开发的动画压缩插件,包含了多种压缩算法,在UE5.3中被官方纳入为引擎自带插件,并设置为默认动画压缩方案。相比于此前UE的提供的各种单独动画压缩算法(移除线性帧、重复帧等),ACL支持了一些新的动画压缩技术(可变压缩率、分段压缩等)并且一次性可以使用多种压缩算法。ACL支持无损和有损压缩,并且支持指定最大误差等参数。ACL是目前游戏动画压缩一流的库,能够大幅降低动画在游戏内存中的占用并保证视觉正确性,支持多种引擎和语言。

2024-03-05 15:54:18 1965 1

原创 从源码深入理解Unreal动画系统

整理了一下引擎是如何从SkeletalMeshComponent一步一步执行到每一个动画蓝图节点的,分析以源码主要流程为重,像RootMotion等附加功能后续遇到问题再来补充。

2023-11-21 11:37:49 1029

原创 Unreal开发问题总结(9,10月)

如果是在插件模块中添加ProjectSetting可以创建一个自己的Setting类(继承UObject),除了为类和变量加上config宏外,需要注意必须手动在ISettingModule中RegisterSetting才能在ProjectSetting中创建对应的目录,可以在对应模块启动和卸载时执行RegisterSetting和UnregisterSetting,同时所有的注册代码以及对ISettingModule头文件的引用都要加WITH_EDITOR,否则打包会失败。

2023-11-10 17:13:27 348

原创 从源码深入理解Unreal中UObject的构造流程

在Unreal中创建一个UObject可以大致分为三步,前两步和传统的c++一样分别为分配内存和构造初始化,分配内存部分会判断是否已有旧对象并对可能会对旧对象做回收操作,构造初始化本质上就是直接调用我们写的构造函数只不过多了几步通过模板和宏的转发。第三步是Unreal独有的属性初始化,会通过CDO和Config等来初始化新建对象的UPROPERTY属性。这里其实还有很多内容,包括这些过程中的很多判断我都没有分析是为什么,以及一大堆的Flag,此外还有Archetype与CDO有什么不同?

2023-10-06 22:17:28 991

原创 Unreal蓝图进阶

所有蓝图节点类型都直接或间接派生自UK2Node,更进一步的说是派生自,所有编辑器节点(行为树节点、状态机节点等)的基类,每个节点上的输入输出都是一个,Pin可以分为Input和Output分为两类,也可以按照数据类型分为若干中甚至包括容器等。在对这些有了基础的了解后,我们可以开始定制一些自己的蓝图节点,虽然UK2Node中提供了大量的虚函数可以重载,但这样做未免太复杂了,实际上有大量的节点类型我们可以去参考甚至直接使用。这里以比较常见的需求即怎么创建一个有ExecPin类型输出的节点为例,分析一下和。

2023-09-03 19:02:31 502

原创 如何正确在Unreal中创建Component

显然方案二是最差的,除非有特殊情况否则应该尽量不使用方案二去创建Component在一些确定的情况下,比如DialogueComponent以来于音频组件,但每个Character拥有音频组件是很合理常见的,那么可以使用方案三去创建依赖的Component,这点Unreal应该向Unity学习,提供一些支持依赖的宏来在编辑器界面提示这个组件需要哪些组件,就像Unity支持在Attribute中设置RequiredComponent来自动添加需要的组件方案一。

2023-09-01 20:26:49 920

原创 Unreal开发问题总结(7,8月)

格式大概是ActorName_ComponentNameX(X是个数字),在这个函数内,如果你先修改了Actor名字然后再通过该参数调用这个组件(图中调用了组件上的函数SetDialogue)就会访问到旧的已经删除的Actor名字和已删除的组件,Log中会显示该Actor已经被删除(TRASH)ue中json格式可以分两种解析,一种是JsonValue代表的是任何类型的Json结构,另一种是JsonObject代表的是用{}围起来的键值对结构,然后利用AsArray方法就可以处理多层嵌套。

2023-08-24 16:56:05 496

原创 使用Protobuf+Websocket构建Unreal与Python服务器的通信

在unreal客户端这边,主要需要注意下protobuf的解析为字节流形式的问题,以及websocket使用binarymessage进行发送和接收python服务器不需要关心类型问题,注意下需要先收到客户端消息才能获取到对应的websocket,然后需要保存下来用于之后主动发消息就可以了。因为发消息本身是异步,如果直接由逻辑类型发送就需要大部分函数都是async,可以考虑逻辑类型仅将消息放进队列中,然后有一个独立的线程以一定时间间隔发送消息。

2023-08-08 17:06:57 902 1

原创 从源码深入理解Unreal的AI寻路系统

Unreal为AI寻路提供了非常完善的支持系统(NavigationSystem、PathFollowingComponent等),并且和AIController、MovementComponent以及AITask等其他模块间有密切的调用关系,很多参数都支持定制化,但学习成本较高,本文旨在结合源码以浅显易懂的方式分析一次AI寻路流程中涉及的各个模块和数据类型。

2023-08-07 18:52:04 1851 1

原创 DLSS和FSR超分辨率技术解析

本文主要从引擎源码的角度分析DLSS、FSR这样的超分辨率技术是如何接入到游戏的渲染管线中以及如何使用渲染管线中的资源完成超分算法,而不过多深入超分算法以及Shader代码本身,对于超分原理部分DLSS和FSR官方都有很详细的文档,全文是建立在对DLSS、FSR在Unreal引擎中的插件代码分析上完成的,由于DLSS的源码大多不开源,所以主体分析以FSR2为主

2023-06-16 20:55:46 4839

原创 从源码深入理解Unreal渲染管线

最近在搞超分相关的工作,发现自己对Unreal渲染管线的理解还是太浅,于是边工作边整理了此文,整篇文章比较长,建议边打开Unreal源码边阅读,跟随文中的顺序能够将Unreal渲染管线错综复杂的源码模块化串联起来,以后有新的发现也会持续更新此文,如果对文章内容有疑问欢迎指正。

2023-06-16 12:05:45 5397 3

原创 深入理解UE常用类型--SpringArmComponent

深入理解unreal中的SpringArmComponent

2022-10-27 16:15:09 1601 1

原创 3D沙盒游戏开发日志12——Prefab和GameComponent

日志本篇将详细讲解第10篇日志中的Prefab与GameComponent部分(一定要先看第10篇)如果说上一篇决策层的Brain和EventController是适用于其它生物和人物的话,那么本篇的Prefab和GameComponent就适用于整个游戏世界中所有物体(一颗树,一个斧头,一头狼,以及玩家角色)。这也是为什么角色和其它生物的决策层和动画层都要依靠GameComponent来实现功能,将整个游戏中的功能性代码与数据都集中在GameComponent中,模糊了生物与非生物的界限,也大大提高

2022-02-26 11:44:05 2758

原创 3D沙盒游戏开发日志11——决策层设计(行为树与优先级)

日志本篇来详细讨论上篇中所简单介绍的决策层(一定要先看上一篇)为了方便观看,也把上篇的框架图贴过来之前已经说过在决策层上玩家和其它生物是由区别的,玩家使用的是简单的优先级决策EventController,其他生物使用的是复杂的行为树系统,玩家添加决策层只是为了结构上的对应,所以我将主要分析的是决策树部分。决策树也称行为树,实际上也不一定要用在决策层,用在动画层也是可以的,可以理解为加强版的状态机,它就是为了解决复杂的AI使用状态机会造成非常复杂的状态图而设计出来的,与以往一样我不会讲概念上的

2022-02-24 19:52:11 4696

原创 3D沙盒游戏开发日志10——设计世界中所有物体的工作方式

日志回顾之前的内容基本都是在处理和人物相关的事情,现在是时候放眼全局来考虑整个游戏世界的物体是如何工作的以及他们之间是如何交互的,这个部分涉及到的内容很多,有很多都值得单独分析,所以这篇只记录整体的设计思路,至于其中的具体部分会在接下来的日志中会逐个分析,先了解整体规划后就更容易明白在每个部分中的一些细节处理的原因代码结构这个图描绘了整个世界的中生物的工作方式,我将从这张图中逐个分析,至于非生物(物体)的工作方式我也会简单介绍因为它们也是设计中的重要考虑部分现状和期望世界中的生物分为两类,

2022-02-23 23:45:40 2050

原创 3D沙盒游戏开发日志9——寻路模块优化附带网格建筑系统修改

日志之前实现了一个简单的寻路模块PathFinder,但它的所有部分都很粗糙,只是将A*算法转变成为实际,现在我已经完成了游戏主体的大部分,是时候着手改造它使它变得更精确和高效了。改造它的同时自然也就顺带优化了相关的MapManager和Building系统优化策略一. 用精确坐标+实际碰撞体代替网格坐标+网格大小旧方案之前的PathFinder和MapManager中,几乎一切都是使用网格坐标(整数)计算的,使用的是GridPos+模型长宽多少个Grid这样的方案去确定需要检测的网格这

2022-02-14 19:12:04 1023

原创 3D沙盒游戏开发日志8——系统化的人物功能模块(3)

日志此篇为人物action系统的最后一篇,挑选了所有action中最经典的CraftController来展示ActionController系统的魅力CraftControllerCraftController主要负责的是人物的捡起动作以及采集和工作(伐木,挖矿等),至于为什么要把这些动作全都放在一个Action中,原因主要是他们都是通过相同的输入触发的,按下键后根据手上是否装备了对应的工具以及可操作对象的远近来选择具体进行哪个动作,这些判断显然放在一个action内比放在inputcontro

2022-01-18 22:35:56 1888

原创 3D沙盒游戏开发日志7——系统化的人物功能模块(2)

日志此篇主要是将ActionController应用到之前已经写过的LocomotionController、ConstructController并做适当修改,本篇代码部分将只记录与之前不同的修改LocomotionController实际上LocomotionController是所有Action中最特别的一个,回顾之前写的内容,主要有两类移动一类是鼠标点击后自动进行寻路的协程移动,这类移动和其它行为一样只需要一次或者很少次数的输入并且可以被打断。另一类是通过键盘的输入,显然这类输入是频繁并且

2022-01-10 00:28:56 1952

原创 3D沙盒游戏开发日志6——系统化的人物功能模块

日志终于放假了,这两天会把前面做的东西没写的日志都补上(大概3-5篇),然后恢复正常三天一更前言之前写了几个功能像人物的移动及视角控制、攻击、建筑物放置,接下来还会有背包,以及人物的各种行为如吃东西,捡起东西丢东西等包括与环境物体和怪物的交互,并且攻击等行为都会和背包里的装备情况联系起来。但当我去做这些的时候尤其是人物的各种动作,我意识到有必要写一个系统化的人物控制器来协调人物各个模块之间的关系了,之前我们只有建筑物放置和攻击会调用移动模块,关系很简单也不用担心耦合问题。但接下来人物的动作会有

2022-01-04 17:11:39 2634

原创 Unity的新动画系统(animator)在脚本中的操控

前言 今天在做人物攻击的部分时遇到一个问题,因为攻击动画是东平西凑的素材,所以每个clip的时长并不符合我项目中的实际武器攻击时长,对每一个clip做帧的删除和添加又太过麻烦,我希望能够通过我期望的攻击间隔(攻击动画播放时间)和当前的动画时间计算一个动画播放速度来动态的修改animator中state的speed,原本以为很简单的操作却扯出一片我以前都不知道的动画脚本操作。Animator为我们提供的与state和clip有关的操作少的可怜,你只能通过GetCurrentStateInfo和G

2021-11-23 21:52:31 8543

原创 Unity所有UGUI组件的基础——Layout Element

问题背景在我制作人物背包的过程中,需要当鼠标放在物体上时显示一些字符串表示物品的信息,所以我希望所显示的文本框大小以及背景图片大小都能随我填入的文字多少而变化,并且我需要有一个最小宽度,即超出宽度后应当换行竖向增长而不是无限制的横向变长,并且文本应当在背景的中央。解决方案层级关系:我们先分析一下问题,父物体Inspect Window中包含image背景图,它要能够随着子物体Inspect Text大小变化而变化,Inspect Text大小需要根据组件Text中的文字数目变化,并且Inspect

2021-10-25 18:30:59 4784 2

原创 3D沙盒游戏开发日志5——人物的基本攻击与鼠标事件监测

日志 是时候用我们写的PathFinder做一些很酷的事了,首先我们来拓展一下人物的移动,之前已经完成了使用键盘实现自由的移动,现在我们再来写一个常见的用鼠标实现智能寻路移动。MouseController人物要监听很多有关鼠标的操作,不只是点击地面移动,还有点击敌人、点击拾取物品,以及当鼠标放在某物体上时可能需要有特殊的效果(高亮显示等),所以我们创建一个单独的controller来负责和鼠标相关的输入控制。void FixedUpdate(){ Ray ray = viewContro

2021-09-25 00:00:19 269

原创 3D沙盒游戏开发日志4——网格寻路系统

日志 这篇我们要来实现网格游戏中最普遍也是最重要的算法基础——寻路算法,如果你只想使用寻路算法,可以直接使用Unity提供的Navmeshagent和AI命名空间下的工具,不过因为这个项目尽可能不适用插件,并且我希望寻路算法更贴近我的项目,尽可能更高效和可定制化,所以来自己实现一个A*寻路算法在这里我不会写A星寻路算法的原理,网上有很多A星寻路的实现,我只会写我在把他运用到我的实际项目中遇到了哪些问题,做了哪些改进和定制化,在最后会贴上寻路代码从c++到c#在这个项目之前我已经学习过A寻路算

2021-09-16 20:59:28 522

原创 3D沙盒游戏开发日志3——饥荒风格的战斗第三人称控制器

日志 好多天没写日志了,其实最近做了很多东西,只是一直懒得记录而已,所以这两天先把前面的日志补完再继续开发好了,值得一提的是最近又找到了几款合适的资源,日子真是越来越有盼头了^_^ 之前在第一次的时候我们制作了一个探索风格的第三人称视角,但沙盒游戏中更多的时候是战斗,所以我们需要开发一个一般状态的操控器,之前的那个可以留在一些特定的场合使用。在战斗方面我觉得饥荒给我的感觉最舒服,所以我决定模仿饥荒的人物操控来制作。我们依然是在之前的两个脚本LocomotionController和Vie

2021-09-16 20:00:39 699

原创 3D沙盒游戏开发日志2——网格和建筑物放置系统

日志沙盒游戏的灵魂当然是足够高的建筑自由度来打造自己的世界,所以我就先来制作一个初级的建筑系统。观察各个沙盒游戏(饥荒,我的世界)等,他们的建筑物放置都是以网格为单位的而不是精确的浮点数坐标,我想原因无非是节省内存上的开销并且给玩家提供更好的游戏理解(只需要记住几格就好),所以在制作建造系统前需要先制作网格世界网格首先思考哪些物品是以网格为坐标单位的,人物的移动肯定不是,我们自己建造的建筑和地图生成的建筑物肯定是,游戏中的某些生物也是以网格为单位表现行为的,还有我们生成世界时也是以网格为单位

2021-09-06 17:18:50 2688 3

原创 3D沙盒游戏开发日志1——制作一个有探索感的第三人称视角

前言背景 学习unity以及其他相关内容(游戏服务器,lua,shader等)已经有一年的时间了,并且c++算法水平也在这一年里有所提升,决定是时候耐心的做一款合格的游戏来总结和提炼自己了,因为只有课余时间并且目前只有我一个人,所以项目的开发预计会持续至少4个月以上,目标就是能把游戏发到steam上(毕竟以前做的游戏都只有发给朋友玩) 这个项目的所有代码,shader甚至部分美术我都会尽可能的从头做,不会引用一些以前的老代码或者现成的插件,并且会尽可能的保证代码的规范性和清晰的注释,这个日志

2021-09-03 22:18:51 1698

原创 Unity学习-协程

一、协程与多线程直接贴两篇大佬文章https://blog.youkuaiyun.com/qq_35647121/article/details/95105476https://blog.youkuaiyun.com/Cheng_MY/article/details/102875707?utm_term=c#协程与线程区别&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-102875707

2021-07-15 23:54:18 308 3

原创 Unity学习-委托代理Delegate

Unity 学习总结学习背景 距离上一篇文章已经过去8个月了-_-,其实上次的2D早就做完了,之后又做了很多东西,不过一直懒得写博客,这个假期来把前面的都补上顺便复习^_^。[上一篇文章在这里](https://blog.youkuaiyun.com/hacning/article/details/109996565?spm=1001.2014.3001.5501)问题解决 先来解决上一篇文章作为初学者遗留的问题,回看上篇文章发现当时对游戏制作方法的理解还是可以的,关键在于对c#认知不足导致协程和代理完

2021-07-14 23:43:32 534 1

原创 unity学习-2Dmobilegame(1)

unity学习总结1学习背景边上课边学了三个月unity,最近在跟着unity的一个2D手机游戏教程学习,到现在大概学习了65%,第一次制作2D游戏(实际上是第一次制作完整游戏hh),遇到很多bug和困难,很多时候不想完全跟着教程走,走了很多弯路但也收获许多知识,在此做总结并记录未解决的疑惑等待未来解决知识点1.关于update与fixedupdate fixedupdate默认是每秒50次,但对于现在制作的小游戏来说若不加限制update可以达到几百甚至几千,导致把跳跃、攻击等检测输入放在fix

2020-11-24 00:21:13 2005

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除