自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 学习做动画7.跳跃

⑧FallLand->EndInAir与EndInAirSources->EndInAir是当角色接触到地面时。④从JumpSelector->JumpApex则为正在处于“掉落”状态、并且z轴的速度小于0,则直接过渡。这里的DistanceCurveName我们需要进入到动画里去找,distance代表角色到地面的距离。先进入JumpStart动画层。①进入到JumpStart需要人物处于"掉落状态",且z轴的速度大于零,代表我们正在起跳。③当速度与加速度的一个除数小于某个值的时候,就算到顶点了。

2025-08-29 17:35:33 578

原创 学习做动画6.瞄准偏移

在这之后,因为这个动画层有两个输入,我们需要为其进行绑定。然后打开我们的动画层接口ALI_AnimLayersBase,新建一个动画层AnimOffset,并为其添加两个输入。搜索mf pistol idle ao ,批量设置资产,将基础姿势动画设置为有cc的动画。新建好后,我们打开ABP_CharacterBase,在动画蓝图内添加这个动画层。打开ABP_LayersBase,打开AnimOffset动画层。再打开刚刚新建的瞄准偏移,如下图将右侧的动画资产设置。首先新建一个瞄准偏移的动画。

2025-08-28 23:37:29 187

原创 学习做动画5.原地转身

此时,我们还需要一个float变量用来记录在TurnInPlaceRotation状态的动画播放时间,使其在过渡到TurnInPlaceRecorevy时继续从这个时间播放。这一步我们先需要对进入TurnInPlaceRecorevy状态的条件进行说明,进入到这个状态的条件是由动画的曲线值来进行判断。接下来到HoldOn的情况,因为HoldOn的情况是,我们希望不对其进行操作,所以在这里不做处理。紫色的值代表我们当前的这个动画的“权重值”,通过这个值来判断何时处于旋转何时处于旋转后。

2025-08-28 03:48:27 865

原创 学习做动画4.回转运动

然后在函数UpdateIsMovingPerpendicularToInitialPivot内,我们需要对当前速度的方向与当前加速度的方向进行判断,得出的bool就是当前角色是否有与回转运动垂直的加速度。新建一个状态别名,状态别名的简单作用就是,可以代表某一个状态过渡到另一个状态。如何触发这个回转的条件呢,简单来说,是当前角色的速度(角色当前朝向某方向的速度)与角色当前的加速度(玩家输入的移动方向)相反时。这样子,在出现与玩家回转运动相垂直的加速度的情况时,会过渡到Cycle而不会进入回转。

2025-08-26 19:33:41 819

原创 学习做动画3.八方移动

在Start内,我们只需要在绑定的函数“变为相关时”进行方向的判断。其中,执行“变为相关时”的函数仅在进入这个状态时执行一次,而“更新时”则是每帧都执行。接下来呢,我们回到LayerBase内,打开Start部分,我们需要为Start与Cycle添加一个朝向扭曲。我们在ABP_LayerBase内设置好后,打开其子类,可以发现我们可以分别设置他们的动画了。现在我们有了角色当前前进的方向,接下来需要设置对应方向的动画逻辑。接着呢我们需要由这个计算出的方向来设置前进的方向的枚举。对Cycle也是一样的操作。

2025-08-25 21:19:41 318

原创 学习做动画2.距离匹配与步幅适配

在细节面板内序列仍绑定Start动画,另一个值“显式时间”代表的是当前动画播放的时间(比如动画长度为10,此时动画播放到4,则显式时间为4)。这时,当Start过渡到Cycle时,若有相同的标记,则从此标记开始(假若在Start的动画时,落脚点是L,此时过渡到Cycle时,会寻找同样的标记并从此标记处开始)。接下来设置Cycle的部分,因为Cycle是循环的,所以设置其动画进度是没有意义的,需要设置的是动画的播放速率。同样的,在false端,我们就不进行距离匹配,直接设置到动画末尾就好。

2025-08-25 11:31:26 763

原创 学习做动画1.简易行走

选择Idle->Start的过渡规则,选择FastFeet(此处表示脚比身体的其他部位的先混合,根据骨架上的一个混合权重进行配置)(需要进行创建的话,在骨骼界面的齿轮设置里创建关于时间的混合描述文件,命名为fastfeet,接着按照同样手法打开lyra谷歌的混合描述文件时间,对比他们的权重对创建的混合权重进行修改即可)在此处创建时间混合权重,命名为fastfeet即可(这一步对没有混合描述的做)这是我们另外创建的动画蓝图的父类,我们在其子类内设置了具体的动画,再将他们关联起来。使得角色可以使用子类的动画。

2025-08-24 20:59:12 815

原创 RPG增容4(失败版).向玩家的技能自定义冷却缩减时间

在这里面实现的思路是,通过使用UIComponent的委托,告知这个图标:我们要中止当前传入的CooldownTag对应的技能插槽的计时,并且在中止后应该按照传入的时间重新计数(在代码里完成)。玩家在使用技能后,GA会将冷却GE应用并生成一个GESpec来代表正在应用着的GE,这个GESpec存在玩家的ASC内(谁应用了这个GE谁就有)(我的理解是这样)。所以接下来的思路就是,我们根据设置冷却GE的标签在ASC内查找,获取他的周期并移除这个GE,然后我们手动新建一个GE再添加回ASC内,实现冷却。

2025-08-12 19:22:40 961

原创 RPG增容4.向玩家的技能增加冷却缩减(一)

打开XMBWarriorFunctionLibrary.h,创建两个函数,一个是本地版本,一个是蓝图版本(区别在于有参数需要输出)打开WarriorPlayerGameplayAbility,添加一个用于设置技能冷却的变量。这里我们拿GA_Player_LightWeaponAbility_Axe作为例子。打开XMBAttributeSet.h,添加玩家冷却缩减的属性。下一步是制作平a减技能cd。话不多说,原文在这里。

2025-08-06 01:11:42 488

原创 RPG增容3:尝试使用MVC结构搭建玩家升级UI(一)

我们在里面绑定XMBState内的函数,当State进行这些函数时,就会触发在OverlayWidgetController内绑定的函数。通过这些绑定的函数,我们就可以告诉UI这些属性发生了改变,并且将改变后的值广播给UI,我们再在蓝图内接收这些值,就可以实现UI的更改了。好,接下来我们需要记住,我们在XMBState内对玩家的等级进行了加、查、改,在CharacterInterface内制作了一些有关等级与经验的函数,在WarriorPlayer内进行了实现。在HUD的InitOverlay()内。

2025-08-03 14:59:17 1081 1

原创 RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物属性(三)

内,第3步,我们已经创建了一个基于自定义计算生命的mmc,从中我们可以捕获到当前的游戏难度(基于AbilityApplyLevel / 2)(这个可以有更好的计算方法,以后我也会改),以此来修改敌人的最大生命值。我们知道,目前手上有的信息是,一个自定义计算属性倍率的MMC,一个BP_MMC,一个用于修改敌人StartPpAttribute应用策略为“无限”的GE.在这个GE内,我们尝试修改了敌人的最大生命值(不舒服的地方在于是,敌人的生命是基于这个系数,后续我会使用表格进行设置)(所以这个GE也重命名。

2025-08-02 21:34:53 391

原创 RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物的属性(二)

前景:捣鼓到半夜头晕,躺床上突然想到原来的做法是根据GameMode的难度来给怪物内的AbilityApplyLevel值。因为在之前有获取到当前发起者的ASC,故从asc内再获取到当前的OwningActor或AvatarActor(因为应用者是自己),再将其转换成EnemyBase即可获取到其中的AbilityApplyLevel。③:下一个断点在末尾,因为没有switch倍率,所以预期中level=4,并且基于在GE_Infinced内的系数为100,所以预期敌人的生命值为400。

2025-07-29 15:10:00 407

原创 RPG增容2.尝试使用mmc根据游戏难度自定义更改怪物的属性(一)

②:敌人在游戏加载时才会初始化AttributeSet,在AttributeSet内,我们直接通过获取当前的GameMode内的游戏难度。制作的逻辑是:玩家在选项里更改难度后,将设置好的难度分别都存储在savestate内和当前的gamemode内。通过对难度的筛选调整当前的倍率,他们分别的倍率对应为0.5,1.0,1.5,2.0。原来已经能做到在表格内直接进行设置,但是后面还需要引入玩家的等级,再依据玩家的等级进行属性的设置,所以需要自定义一个mmc对每个属性进行设置。先添加能获取到当前游戏难度的函数。

2025-07-29 00:27:53 810

原创 RPG67.制作胜利画面(一)

打开survialgamemode。在allwavesfinished分支。1.将losescreen复制一份。

2025-07-28 03:11:22 180

原创 RPG68.保存难度数据

接下来需要将难度存储到gamemode内。打开XMBSurvialGameMode。

2025-07-28 03:08:19 147

原创 RPG66.制作死亡画面(二):实现按钮逻辑

1.在玩家死亡后,面板里将会有“重来”的选项。计划用这个按钮打开新的level。但是考虑到将来需要在许多不同的地图内选择“重来”,这时候我们需要选择的关卡就不能是一个固定的值,我们需要在一个地方可以选择这一个值。“游戏实例(GameInstance)是一个很好的地方,它的生命周期与启动游戏后 游戏的生命周期相同。打开WarriorEnumTypes,我们需要创建一个枚举用来设置玩家的输入状态。创建完后,我们需要在函数库里写获取当前level实例的方法。启动项目,创建刚刚创建的游戏实例的子类蓝图。

2025-07-25 15:50:00 354

原创 RPG65. 制作死亡画面(一):制作ui

创建父类为XMBButton的用户控件,命名为TPBWBP_PauseScreenButton。创建一个WarriorWidgetBase的控件,命名为WBP_LoseScreen。1.创建一个父类为“按钮”的蓝图,然后设置样式。打开关卡蓝图,在关卡蓝图内添加到视口。

2025-07-24 17:44:23 265

原创 RPG64.制作敌人攻击波数四:优化

然后再WarriorPlayer.cpp的PossessedBy函数内,这个函数式对玩家的属性和技能进行等级定义,所以要根据难度来设置定义的等级。添加难度设置,根据gamamode的不同难度,将会对玩家的技能等级和属性等级、敌人的技能等级和属性等级造成不一样的影响。优化:当前处于最后一波袭击时,在生成敌人前倒计时结束后,会显示最后一波袭击的提示。为此,我们需要知道倒计时的总动画长度,并以此为延迟生成最后一波袭击的ui提示。所以我们需要计算两个动画的总时长,稍作调整。在枚举的第二个引脚后设置。

2025-07-24 15:20:31 323

原创 RPG63.制作敌人攻击波数三:处理敌人生成

在函数TrySpawnWaveEnemies()内,我们需要在敌人死亡后触发刚刚创建的函数。用来判断当前场上的敌人数量是否达到预期数量或者达到本波次敌人总数。添加新函数,用于在boss召唤的敌人身上注册ondestroy以便于在由召唤生成的敌人身上能触发gamemode里的onenemydeestroyed函数。完成上面步骤后,在测试的时候发现即使敌人死亡,不会进入到下一波次。我们需要在生成前对需要生成的敌人进行异步加载。所以我们需要接受这个广播然后用来做敌人死亡的判断。在生成敌人后为他们注册。

2025-07-21 17:18:23 205

原创 RPG62.制作敌人攻击波数二:攻击ui

经典创建userwidget,使用xmbtextblock,结构如下。然后设置动画与音频,上下的参数是一样的,打开BP_SurvialGameMode。2.再创建一个widget,

2025-07-20 18:33:20 284

原创 RPG61.制作敌人攻击波数一

创建一个gamemode的c++类。然后更换地图里的gamemode。接下来制作敌人来袭波数的定义。继续设置与波数有关的配置。

2025-07-20 15:40:32 183

原创 RPG60.生成可拾取物品

我们需要在敌人死亡后、actor销毁前进行一个生成,所以暂时需要一个delay来顶替一下。启动项目,创建一个gameplay蓝图,命名为GA_EnemySpawnStone_Base。然后的话呢,打开CT_GuardianStats,新的曲线表示掉落概率。下面这一块的前半部分是用于设置生成的石头的种类。再创建生成石头base的子类蓝图,进行数据设置。创建生成石头base的子类蓝图,然后设置数据。接下来是为每一个种类的敌人都做的事。上面这一块是用于设置生成位置的。后半部分就是用于一个生成。

2025-07-18 21:58:09 211

原创 RPG59.玩家拾取物品三:可拾取物品的提示UI

我们还需要获取player的uicomponent,打开WarriorPlayerGameplayAbility.h。然后打开PlayerGA_PickUpStones,处理广播事件,这样子我们就将bool广播出去了。以WarriorWidgetBase作为父类,创建一个子类的userwidget。情况为:当玩家触发与可拾取物体的重叠时,我们将广播一个bool值用来显示可拾取提示。然后我们需要想办法,在合适的位置,用bool来控制此控件的显示与隐藏。我们需要获取当前用来拾取物品的键位。

2025-07-18 18:35:03 261

原创 RPG58.可拾取物品二:处理玩家拾取事件

打开PlayerGA_PickUpStones.h,创建函数,用于在蓝图内接收事件后调用。打开XMBStoneBase,覆写父类的函数,在重叠时尝试激活玩家拥有此标签的能力。设置完ge后,我们需要分别进入healstone和ragestone蓝图内进行设置。为了设置玩家在接触石头后需要进行输入才能拾取并应用效果,我们需要添加一个输入。启动项目,创建一个此类的gameplay蓝图,设置tag和实例化策略。启动项目,打开DA_InputConfig,新建一个IA。制作一个曲线表格,用于设置ge的数值。

2025-07-18 17:45:33 316

原创 RPG57.创建玩家拾取物品类一:创建可拾取物品类的基类

再根据创建的子类创建一个蓝图,做为蓝图的基类,往里面添加一个niagara。再创建该类的子类,用于制作玩家可拾取的功能性石头道具。在创建此蓝图的子类,用于分类不同功能的可拾取性道具。新建一个基类,用于玩家可拾取物品的父类。

2025-07-18 13:34:19 239

原创 RPG56.制作HeavySpecialAbility

然后打开PlayerHeavyAbility,在里面监听tag然后进行范围检测,并且对范围内的hitactor通过applygameplayeffecthandletohitresults进行伤害设置。然后打开XMBGAmeplayAbility.h,创建为目标赋予aoe伤害的函数。打开DA_InputConfig(复制一份light就好)然后打开蒙太奇,设置sendgameplaytag。1.一样的准备工作,创建新的GA,然后设置tag。然后跟light一样创建一个新的图标。4.接下来设置其冷却。

2025-07-17 17:13:11 336

原创 RPG55.冷却UI篇二:制作冷却时间未正确读取

我们设置的冷却时间是通过在GA里设置冷却GE,所以我们有办法从GA内或取到当前ABility的冷却时间,故有办法在ga内制作冷却函数。打开TPWBP_AbilityIconSlot,先更改玩家在卸下武器之后,我们需要隐藏specialability的图标与冷却。我们需要在这里制作玩家装备武器后,刚刚创建的函数来判断当前ability是否处于冷却状态,若是,则显示时间与设置冷却图标的效果。其中主要用到了这个,查询当前ability的冷却时间,然后再通过查询出来的结果来设置输出值。然后在卸下武器的后面引用它。

2025-07-17 12:58:29 254

原创 RPG54.冷却UI篇一:设置冷却ui与计算冷却时间

在处理广播武器的分支里,从武weapondata结构里或取到specialweaponabilities的结构数组,通过在循环内广播specialability来设置当前的图标。然后打开TPWBP_AbilityIconSlot,我们需要在这里绑定冷却的函数,在这里完成冷却数字的读取与改变。做完这些后,我们同样需要在GA_Player_UnEquipAxe做一样的事情,这时我们不需要设置图标了。在library里做完了计算时间的部分,接下来我们将要制作计算时间的过程。如何控制这个时间呢?

2025-07-17 12:12:24 877

原创 RPG53.制作冷却

再打开GA_LightWEaponAbility_Axe设置冷却的ge,再添加commitability节点就好。然后打开CT_PlayerWeaponStats,创建及缴纳一个cooldowm的曲线。1.创建一个ganeplayeffect。

2025-07-16 16:17:10 181

原创 RPG52.制作GA_WeaponAbility_Light

设置SpecialWeaponAbility_Light会与原来的LightAttack的输入发生冲突,所以需要添加一个触发器,即trigger。获取到碰撞目标后,需要将伤害的spechandle发配给target。然后进入LoghWeapinAbility,添加waitgameplayevent节点,等待ans发送碰撞通知。然后打开XMBStructTypes,我们需要创建新的struct,并且修改原来武器的data。启动项目,制作蒙太奇,新建一个插槽位于武器中间。然后将被攻击的标签发配给target。

2025-07-16 14:31:10 306

原创 RPG51.激活愤怒状态二:Rage的激活条件与效果

在函数PostGameplayEffectExecute()内找到rage的部分,修改为每当rage的值发生改变时,按照当前rage的值进行不同逻辑的判断。然后打开LightAttack,在这里我们处理从蒙太奇的通知,还有气波的伤害。这样子就可以完成当player在激活GA_rage时进入短暂的无敌状态。玩家在进入rage状态时,会通过当前sequence激活当前状态。因为GE的"无限“状态在GA内是需要手动移除的。然后打开玩家的蒙太奇lightattack_1。

2025-07-15 16:17:13 493

原创 RPG50.激活愤怒状态一:成功激活并进入状态

3.我们需要设置在激活这个GA后玩家进入rage状态,则需要添加这个tag,在结束时则移除。也需要在其他的ga内进行设置,在其他的ga进行时不可激活player的rage状态。打开ga,添加waitgameplayevent,发送带参数的gc的tag。4.接下来制作在player进入rage状态时的fx。在蒙太奇内添加一个sendgameplaytag事件。启动项目,创建玩家的gameplayGA。创建一个gameplaycue_Actor。然后创建蒙太奇(需要更改插槽)

2025-07-14 04:55:41 157

原创 RPG50.敌人入场效果

1.老步骤,找到动画序列,创建蒙太奇。2.打开BP_Enemy_Base。

2025-07-14 02:18:17 150

原创 RPG49.召唤技能

②:修改boss使用此技能的方式,将更改为血量到达一定时候将使用此技能。①:boss召唤敌人的蒙太奇添加ns,boss在使用技能时朝向玩家。在boss用于召唤的行为树这里添加刚刚创建好的服务和装饰器。启动项目,一样是准备蒙太奇,创建ga,添加到da。运行时,boss使用这个技能时就可看到bebug信息。4.接下来制作boss在使用召唤技能时,敌人的生成。然后打开boss的召唤技能,添加后面这一部分。然后启动项目,在对应的蒙太奇内添加事件。打开boss的行为树,新建一个黑板键。然后修改boss的行为树。

2025-07-14 02:10:51 387

原创 RPG48.制作boss近战攻击及连击

测试之后发现玩家有些难躲避,建议roll改成1.25倍,然后进入MeleeAttack_Base找到GC的发送延迟。先打开MeleeAttackBase,我们需要把发送gameplaycue事件的节点换成另一个带参数的节点,然后将其中一个参数转换成变量。大概就是自己找准时间添加对应的事件,然后找对资产就好。要注意一下的是,后面第二次攻击的动画的ns需要做一个小便宜才能让其显示正确的位置。再打开不可阻挡攻击的GC,将偏移的距离换成对应参数的输入。一样的步骤,找到动画转换蒙太奇。然后创建combo的GA,

2025-07-11 17:30:35 237

原创 RPG47.创建boss行为树以及boss的近战攻击

启动项目,打开boss的攻击蒙太奇,添加一个togglecollision的ans,并且设置当前是左手,这样子boss在使用这个蒙太奇的时候才会开启左手攻击插槽上的boxcollision。首先,打开PawnCombatComponent,对原来写的碰撞检测进行更改。原来的碰撞检测仅有武器,现在boss用的是双手,所以我们要创建一个新的函数用于区别武器和手部的攻击。启动项目,在这里填入骨骼的名字就可让box附着到对应的位置。找到对应的动画序列,创建蒙太奇。我们需要在此实现武器的碰撞。在构造函数内进行设置。

2025-07-11 12:38:26 241

原创 RPG46.制作boss的受击和boss的死亡

如下图设置为玩家在攻击boss后无法中断boss当前的行为,boss也不会在受击后转向玩家。从shared的abilitysystem内创建hitreact的子类。打开DrawBossBar_Base,把属于boss的ui加载进去。接下来为了解决boss在死亡之后,血量条不会消失的情况。打开shared文件夹找到enemydeathbase。打开EnemyDeath_Base,在死亡时移除他们。打开EnemyUiComponent.h。创建boss的受击反应。2.创建boss的死亡。

2025-07-09 19:05:12 223

原创 RPG45.BOSS的准备

创建WarriorEnemyGameplayAbility。调整水平坐标,然后拖入idle和walkfwd的动画。创建ABP_Enemy_Base的子类。创建BP_Enemy_Base的子类。设置ForstGiant的属性表。接下来制作boss的血条ui。以此作为显示boss血条的板子。然后创建一个1d的混合空间。这个是boss名字的设置。回到abp内进行设置。然后创建此GA的子类。

2025-07-09 17:03:33 191

原创 RPG44.远程敌人的近战防卫

然后打开GA_Enemy_MeleeAttack_Base,添加对这个tag的判断。1.先创建gameplay蓝图(从Guaradian复制一份Melee_2)然后新建一个GC用于提示玩家:敌人将要释放不可格挡的技能。在蒙太奇里创建新的插槽。

2025-07-08 17:49:29 212

原创 RPG43.敌人远程攻击的准备

首先,为了避免总是去同一个点,需要将运行EQS的这一部分设置为在筛选出来的点里再随机。启动项目,创建此c++类的蓝图,再创建此蓝图的子类用于制作敌人的远程攻击炮弹。创建好后,打开Glacer的骨骼,为这个projectile建立一个插槽。打开Glacer远程攻击的Montage,添加攻击时的声音。然后打开BP_Projectile_Glacer。然后打开BTTree_Glacer,做一下调整。打开GA_Glacer_Projectile。打开对应的表格,创建此技能伤害的数据。创建一个Actor的c++类。

2025-07-08 16:45:59 323

空空如也

空空如也

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

TA关注的人

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