

Slate 入门及开发编辑器工具
Slate 是虚幻引擎的用户界面框架,作为开发编辑器工具和游戏界面的模块。然而在实际的开发中,开发者更愿意使用 UMG 来设计界面,在相同的需求中还实现了所见即所得的实时预览效果,而编写 Slate 相关的代码还要经过编译(一般至少 5 秒)才能看到最终效果(热编译有可能无法正确显示),这会在复杂界面或者涉及到对齐组件(涉及 margin 或 padding)时尤为痛苦。所以从个人的角度来看,Slate 代码的编写需求会缩小到一个较窄的领域内,那就是需要在编辑器某个位置(称之为 Extension Point)插入界面类组件时才使用 Slate。如果不是这个需求的话,使用编辑器提供的 Editor Utility Blueprint 或者 Editor Utility Widget 会使开发工具的工作更轻松..
继续阅读道具使用 UObject 还是 UStruct
尽管 C++ 本身视 class 和 struct 都为类类型,区别只在默认访问修饰符(class 默认为 private,struct 默认为 public)。但在虚幻引擎中却有所不同,UObject 使用 class 作为类类型的修饰符,而 UStruct 使用 struct 作为类类型的修饰符(请注意这里没有讨论 Slate 相关的类体系结构),就会在反射机制、网络复制方面产生不同的区分,本博文在构建道具类型的基础下,讨论以下内容: 如何维护它们的生命周期; 如何在网络中复制它们。 物品的信息在绝大多数情况下,物品信息可以用一个结构体来定义(C++中需要派生自 FTableRowBase),然后定义基于该结构体的 DataTable,这种方式不仅可以实现统一的数据管理,还允许从外界来修改物品信息,..
继续阅读

实现昼夜变化
时间系统是游戏世界(尤其是开放类游戏)常见到的机制,除了为模拟现实世界的情况外,也经常作为衬托游戏剧情发展的因素。将它们封装起来并提供可配置的简单参数,有一定的必要性。本博文主要讨论以下几点: 如何自定义日出和日落时间,在此期间可以看到日光,不在此期间时看到月亮; 如何将天空有关的组件进行封装,可以方便地迁移到不同关卡或项目中; 天体相关的组件打开一个基础关卡,在大纲视图中通常可以看到一些组成天体的组件: Directional Light:方向光源,在这里指示着太阳的方向。这种光源在参与光源计算时只会使用其旋转信息,其位置不会影响到光源的计算。在虚幻引擎中,任意时刻都要保证至多一个方向光源可见。本例中在白天中仅 SunDirectionalLight 可见,黑色中仅 MoonDirectional..
继续阅读如何用 InputAction 来触发 GameplayAbility 的激活
GAS 作为管理技能和属性相关的灵活插件,使得开发制作角色扮演游戏、多人在线战术竞技游戏不再那么繁琐。另一方面,虚幻引擎将增强输入系统作为了默认输入组件,这不仅使得按下、按下并按住等常见功能逻辑作为了内置功能,还引入了上下文和优先级机制,使得我们可以将同一个按键在不同的上下文中发挥不同的效果。 如果有机会通过增强输入系统中的输入动作映射到 GAS 的技能激活,那么就可以以很优雅的方式在不同上下文中激活不同的技能。例如鼠标左键在未装备武器时激活挥拳技能、装备枪械时变为开火技能;空格键可以先作为跳跃技能的触发按钮,后期又可以灵活地替换成翻滚技能的触发按钮。本博文将讨论以下几点内容: 何时应该赋予角色技能,以及输入事件的绑定; 如何保证所有技能任务都正确工作,尤其是等待输入 ID 按下和释放的技能任务; 有些技..
继续阅读

进阶运动动画的实现
自虚幻引擎5发布以来,Epic 官方提供了很多实用的工具来处理动画资产,在初学者项目 Lyra 中不仅可以看到这些工具的具体应用,还提供了一个进阶版本的动画逻辑解决方案(相较于第三人称射击模板附带的动画蓝图)。本博文主要讨论这套方案的以下几个要点: 如何修改动画序列数据以满足该解决方案的资产要求; 如何减轻游戏主线程的负担,让动画逻辑不成为性能瓶颈; 如何在运行时灵活地替换部分动画,例如玩家装备武器时,将无持械的动画替换为该武器对应的动画。 为了使这套解决方案可以正确工作,以及方便动画资产的处理,需要项目启用Animation Locomotion Library、Animation Warping、Animation Modifier Library插件。本解决方案对应的角色旋转设置如下: // 角色..
继续阅读

如何将建造功能作为一种技能
(最终效果展示) 在很多提供建造玩法的项目案例中,往往是定义 ActorComponent 类并在那里实现启用建造功能、选择建造位置、轻微调整建筑物、生成建筑物等功能,随后角色类会使用该 ActorComponent 的实例,从而获得建造建筑的能力。这需要开发者处理玩家能否启用建造功能,例如当玩家获得阵亡、沉睡、眩晕等状态时需要阻止建筑功能逻辑的执行,并且停止正在进行的建造进程。 除此之外,很多解决方案还采取了引入若干个碰撞频道来实现建筑物对齐功能,这会至少引发三个问题:1. 迁移代码到其他项目时总是需要添加这些额外的碰撞频道;2. 每次引入新的碰撞频道时,需要检查之前的建筑物是否已经忽略了新频道,避免出现错误的对齐;3. 开发者需要检查每个 BoxComponent 是否正确阻挡了对应的频道,增加了因..
继续阅读