1.虚幻插件GAS分析09 TargetData、TargetActor和WorldReticle
2.iOS音视频开发——FFmpeg库编译
3.UE记录GAS中AttributeSet初始化流程
4.死磕以太坊源码分析之挖矿流程
5.UnrealGAS——GameplayTag(玩法标签)
6.虚幻四Gameplay Ability System入门(5)-冲刺奔跑和深入Attribute
虚幻插件GAS分析09 TargetData、TargetActor和WorldReticle
各位好,我是阿棍儿。本篇将深入分析虚幻插件GAS中的TargetData、TargetActor和WorldReticle概念。源码不会用
引言
在GAS中,技能往往涉及指向性和目标过滤。例如,抛射直线或抛物线子弹的技能需要确定方向或参数;范围技能则需筛选目标范围内的Actor。在瞄准阶段,往往需要选中目标表现。例如,抛物线子弹可见轨迹的显示。选中表现与命中表现不同,后者在技能命中目标后通过GameplayCue实现。
本文将探讨选中表现的解决方案,涉及TargetData、TargetActor和WorldReticle的概念。
在GAS中,目标选择和表现需求引出了这三者的配合使用。它们通常通过以下步骤协同工作:
由技能选择目标并在此过程中的表现需求,我们讨论的概念如下:
由虚幻官方提供的参考资料和GASShooter项目的实例,我们可以学习如何正确应用它们。
Confirm和Cancel
在GAS源码中,Confirm和Cancel是常见但含义不明的词汇。它们涉及技能绑定输入时的特定操作。
通常,Confirm和Cancel用于表示目标选择过程中的确认和取消。它们在技能输入处理中扮演关键角色。例如,在AGSHeroCharacter::BindASCInput中配置输入,以正确接收确认或取消输入。
此外,Client预测激活技能时的状态,如Confirmed或Rejected,与Confirm和Cancel概念紧密相关。
核心类TargetActor
AGameplayAbilityTargetActor类是实现目标选择逻辑的基础。它需要子类实现选择目标的逻辑,通常在确认目标时通过代理将TargetData广播出去。
在实际应用中,推荐在选择目标逻辑触发时,通过代理将TargetData广播出去。群活跃源码GASShooter项目展示了如何实现枪械子弹和火箭发射器选择目标的逻辑。
TargetActor生成时可以使用FGameplayTargetDataFilterHandle过滤目标,通过自定义过滤器实现更精细的选择。官方建议复用TargetActor以提高效率。
TargetData
FGameplayAbilityTargetData结构体定义了数据访问方法,但未定义数据本身。GAS提供了常见情况适用的子结构体。广播TargetData时,应使用FGameplayAbilityTargetDataHandle实例。
在GASShooter项目中,展示了如何正确封装和广播TargetData。
WorldReticle
AGameplayAbilityWorldReticle类实现选择目标时的表现,如准星指示。其主要功能在FaceTowardSource函数中。
WorldReticle主要用于表现,逻辑应集中在TargetActor上。GASShooter的实例展示了如何实现单目标准星的自定义。
iOS音视频开发——FFmpeg库编译
在进行iOS音视频开发时,首先确保您的设备上安装了Xcode,这是苹果官方提供的开发工具,可以从App Store下载安装。
接下来,为了安装所需的包管理工具,需要安装Homebrew。Homebrew是Mac平台上的便捷工具,用于获取系统中可能缺失的Linux工具,安装过程只需一行命令即可完成。如果安装成功,终端会显示相应的反馈。
为了编译适合iOS的FFmpeg库,我们需要gas-preprocessor脚本文件。将gas-preprocessor.pl复制到/usr/local/bin目录,并赋予执行权限。同时,了解Yasm的作用,它是一个NASM汇编的替代品,支持多种平台和格式的编译。
接下来,运行FFmpeg-iOS-build-script脚本,这个脚本会自动下载并编译最新的FFmpeg版本,生成iOS可用的库。在终端中,二改源码切换到脚本目录并执行命令,以完成编译和打包过程。
编译完成后,FFmpeg源码和所需的lib文件就会出现。将这些文件集成到你的开发工程中是关键步骤。在Build Setting中,更新header search Path,确保它指向包含FFmpeg头文件的工程目录。
至此,你已经成功地安装和集成FFmpeg库到你的iOS项目中,为音视频开发提供了必要的工具支持。
UE记录GAS中AttributeSet初始化流程
本文旨在清晰阐述AttributeSet初始化流程,并附带部分源码解析。若需跟随操作,请确保准备了自定义的AttributeSet、ASC以及挂载位置,如Actor、武器或角色等,才能执行初始化。
FAttributeMetaData初始化流程:
创建DataTable,RowStruct设定为AttributeMetaData。添加行,RowName设为[AttributeSet].[Attribute],并保存DataTable。注意,尽管官方及注释使用UAttributeSet,但此处的AttributeSet指属性集名称,而非类名。Attribute为属性集中的属性,如Health。
在Character蓝图中,选中ASC,在细节面板的Attribute Test栏下,配置Attributes为对应的Class,Default String Table为创建的DataTable。
至此配置完成,运行游戏,即可查看效果。
读源码流程:
初始化DataTable逻辑位于ASC的OnRegister函数中,该函数直接调用InitFromMetaDataTable函数。InitFromMetaDataTable函数通过迭代AttributeSet下的所有属性,处理数值或FGameplayAttributeData类型。wordpress小说源码
最终,创建的AttributeSet被缓存至SpawnedAttributes的TArray中。实际缓存的是引用而非对象。
评价:
一般,无法配置属性的Level。可通过创建不同初始的AttributeSet来解决,但较为繁琐。使用AttributeSetInitter可简化此过程。
AttributeSetInitter初始化流程:
创建UCurveTable,选择Linear插值类型。配置[GroupName].[AttributeSet].[Attribute],并保存。Group为自定义组名,AttributeSet为属性集名称,Attribute为属性名。
创建并打开UCurveTable,根据配置添加数据。回到代码中,添加初始化UCurveTable的代码。
配置完成后,运行游戏,即可查看效果。
深入源码解析:
在ASC初始化时,OnRegister函数调用FGameplayAbilitiesModule并获取AbilitySystemGlobals。通过接口,获取GlobalAttributeSetDefaultsTableNames内的SoftPath,并加载对应的CurveTable。
加载完成后,CurveTable被缓存,执行ReloadAttributeDefaults函数。在该函数中,通过SoftPath加载CurveTable,缓存后执行InitAttributeDefaults函数。
InitAttributeDefaults函数执行AllocAttributeSetInitter,并通过PreloadAttributeSetData加载CurveTable。PreloadAttributeSetData函数分割配置字符串,查找对应数据集和属性,存储于FAttributeSetInitterDiscreteLevels。
总结:
AttributeSet初始化流程包括自定义DataTable配置、ASC配置与源码解析。AttributeSetInitter提供简化配置方式,而通过GameplayEffect初始化则提供动态属性修改。andlua布局源码整体流程清晰,但需注意配置管理与效率问题。
评价:流程有效,但配置管理需优化,考虑集中化配置与简化流程。
死磕以太坊源码分析之挖矿流程
以太坊的挖矿流程主要由miner包负责,它通过miner对象来管理操作,内部使用worker对象实现整体功能。miner决定矿工的启动与停止,并能设置矿工地址以获取奖励。
worker.go文件中的worker对象负责挖矿的细节,其工作流程包含四个主要循环,通过多个channel完成任务调度、新任务提交、任务结果处理等。
新任务由newWorkLoop循环产生,此过程中,resubmitAdjustCh与resubmitIntervalCh两个辅助信号用于调整计时器的频率,resubmitAdjustCh根据历史情况计算合理的间隔时间,而resubmitIntervalCh则允许外部实时修改间隔时间。
mainLoop循环则负责提交新任务并处理结果。TaskLoop提交任务,resultLoop则在新块成功生成后执行相关操作。
启动挖矿的参数设置定义在cmd/utils/flags.go文件中,提供了一系列选项,如开启自动挖矿、设置并行PoW计算的协程数、配置挖矿通知、控制区块验证、设置Gas价格、确定Gas上限、指定挖矿奖励账户、自定义区块头额外数据、设置重新挖矿间隔等。
可以采用多种方式启动挖矿,例如通过控制台命令、RPC接口等。设置参数时,可参考官方文档或相关指南进行调整。
分析代码从miner.go的New函数开始,初始化canStart状态以控制挖矿流程。若Downloader模块正在同步或已完成,则启动挖矿,否则停止。随后进入mainLoop处理startCh,清除旧任务、提交新任务。
生成新任务通过newWorkCh完成,进入CommitNewWork函数,其中包含组装header、初始化共识字段、创建挖矿环境、添加叔块等步骤。添加叔块时进行校验,确保区块符合规定。若条件允许,任务会提交空块、填充交易,并执行交易以生成最终块。
交易执行成功后,块数据被存入数据库,并广播至网络。若执行出错,则回滚至上一个快照状态。成功出块后,新区块被验证、确认,并纳入未确认区块集中。若新区块稳定,将正式插入链中。
整个挖矿流程相对简单,主要由四个循环相互协作完成从挖矿启动到新任务生成、任务提交、成功出块的全过程。共识处理细节将在后续文章中详细阐述。
UnrealGAS——GameplayTag(玩法标签)
GameplayTag(玩法标签):玩法标签是一种层级命名,由GameplayTagManager进行注册与管理,形式为Parent.Child.Grandchild...。这些标签被用于明确描述对象的状态。例如,当一个角色处于击晕状态时,我们可以为其贴上State.Debuff.Stun的玩法标签。
FGameplayTag:此标签在UE中的类名为FGameplayTag,由FGameplayTagContainer进行存储与管理。通过搜索源码,FGameplayTag的注释说明了它的表示形式与功能。
FGameplayTagContainer:此容器用于存储FGameplayTag集合。它与FGameplayTag共同受UGameplayTagsManager管理。
UGameplayTagsManager:该管理者通过GameplayTagNodeMap成员,将FGameplayTag存储在FGameplayTagNode节点中,并通过构造节点树来管理不同的玩法标签。
FGameplayTagNode:此节点结构展示了UGameplayTagsManager如何组织并管理玩法标签。
UGameplayTagsManager::ShouldImportTagsFromINI:这个函数涉及到UGameplayTagsSettings对象,因此我们接下来会探讨UGameplayTagsSettings类。
UGameplayTagsSettings:这个类继承自UGameplayTagsList。从源码解释中,我们可以看出其主要功能与用途。
虚幻四Gameplay Ability System入门(5)-冲刺奔跑和深入Attribute
在深入探讨虚幻四Gameplay Ability System(GAS)的实现细节前,先分享一段小插曲:我在源码中不慎添加了两句注释,竟导致项目编译失败,面临+错误。这让我意识到GAS的复杂性和严谨性。在这篇文章中,我们将聚焦于实现角色的冲刺奔跑功能,以及对GAS中属性(Attribute)的深入理解。如有疑问,欢迎在评论区提问或私信交流。 实现冲刺奔跑功能分为以下几个步骤:点击shift后激活冲刺技能。
激活技能后,添加一个Gameplay Effect(GE),以提升角色的移动速度属性。
在角色的Character.h/cpp中实现一个函数,将移动速度改变的事件绑定到该函数。在该函数中,提高角色Movement Component的移动速度。
当shift键松开时,发送Gameplay Event以终止冲刺能力。
接下来,我们创建MoveSpeed属性。 在AttributeSetBase.h/cpp中添加MoveSpeed属性。此操作已多次执行,假设读者已掌握流程。重要的是了解属性数据结构,查看AttributeSetBase的父类AttributeSet.h。这里展示了属性包含Base Value和Current Value两个浮点值。 Base Value是永久属性的基础值,而Current Value是临时值。例如,加速奔跑功能实际上改变的是Current Value,当效果结束后,Current Value会恢复至默认值。类似地,增益效果会暂时提升角色的生命值或护甲等属性。 与Base Value不同,角色生命值的扣减直接作用于Health属性的Base Value。攻击造成的伤害被视为永久改变,除非有其他影响,否则生命值不会改变。 Base值与Current值的变更方式取决于Gameplay Effect(GE)的Duration Policy。Instant模式改变Base值,Infinite和Has Duration模式改变Current值,因为这些效果有持续时间。当Duration policy包含period时,同样改变Base值,因为Period Duration可视为每个period触发一次的instant。 创建完毕后,给MoveSpeed属性赋予初始值。 实现Sprint技能。创建名为GA_Sprint的游戏能力,作为冲刺技能。创建名为GE_Sprint_SpeedUp的游戏效果,负责提高移动速度。在GE_Sprint_SpeedUp中设置技能效果为永久性,提高MoveSpeed属性,同时添加标签Ability.Sprint.SpeedUp。 在GA_Sprint中,向拥有该技能的角色申请一个GE,并等待带有标签Ability.Sprint.EndAbility的Gameplay Event。接收到该事件后,移除带有Ability.Sprint.SpeedUp标签的GE,然后结束能力。 在角色蓝图中,添加能力(Give Ability),绑定输入。当shift松开时,向自己发送带有标签Ability.Sprint.EndSprint的Gameplay Event,作为能力中等待的事件。 实现MoveSpeed属性的改变处理。在CharacterBase.h/cpp中创建一个函数,用于处理移动速度属性值的改变。注意,直接通过GetCharacterMovement()修改移动速度可能导致性能问题。在BeginPlay中将该函数与MoveSpeed的Change Delegate绑定。 处理属性改变的响应。GAS系统提供了接口,在属性值发生改变前进行预处理。重写PreAttributeChange和PostGameplayEffectExecute方法,以设置属性值的范围。例如,确保生命值始终在0到之间。 通过本文,我们不仅实现了角色的冲刺奔跑功能,还深入探讨了GAS中的属性机制。希望这些知识能帮助你更好地理解和利用GAS系统,以创造更丰富、更细腻的游戏体验。GNU 工具链开发入门(一):工具链介绍
进入GNU工具链开发领域,首先需认识到GNU/Linux世界中,GNU工具链扮演着不可或缺的角色。尽管在代码耦合程度和可读性方面,GNU工具链可能不如使用Apache协议的LLVM广受欢迎,但只要GNU/Linux系统持续存在,GNU工具链的使用不会停止。作者自年开始深入探索GNU工具链开发,并通过系列文章整理知识体系,分享个人经验。
GNU工具链主要由三个部分构成:GCC、GAS和LD。GCC作为编译器集合,包含多种编译器,如用于C语言的GCC、用于C++的G++等,而GAS是汇编器,负责将汇编代码转换为机器代码。LD则是链接器,将生成的模块链接成可执行文件或共享库。
在GCC的使用中,编译过程可以被详细拆解。一个简单的示例为使用`gcc hello.c -o hello`命令编译hello.c文件并生成hello程序。这里实际涉及多个步骤:首先,GCC调用C语言编译器cc1将源代码编译为汇编代码;随后,GAS将汇编代码转换为对象文件;最后,LD链接库文件,生成最终的可执行文件。
在构建程序时,GCC通过调用AS和LD完成汇编和链接过程,具体参数的传递可能依据不同后端的设置。此外,BFD(Binary File Descriptor)是Binutils仓库中用于底层操作的工具集,包括as、ld等。
GLibc作为GNU C Library,在构建GNU/Linux和Linux内核时扮演关键角色。它包含几乎所有的UNIX标准,对构建过程至关重要。作者对GLibc的理解仍停留在浅层阶段,专注于RISC-V后端相关工作,对C库的具体实现不敢妄加评论。
构建GCC的过程通常基于上游最新代码进行,步骤包括配置、编译、链接和安装等。具体步骤可参考相关指南或教程。构建GCC时需要注意版本兼容性、依赖库以及构建环境的设置。
总结,GNU工具链作为GNU/Linux生态系统的核心组成部分,为用户提供强大的编译和链接功能。了解其构成、使用方法以及构建流程,对深入参与GNU/Linux生态系统的开发工作至关重要。