虚幻5 , 魂like更牛逼的框架 的学习过程!!!!!!!!!!!!!!!!!!1
https://soulslike-framework.isik.vip/getting-started/quickstart
价格也是更贵, 2k
- 先看这个工具的使用:
![image]()
点这个红色部分.
他会等效于调整下面的部分. 这个红色按钮只是一个例子. 等效的你找到相关蓝图就可以修改底层了.比如这里面武器只给了太刀的,你可以根据这个类比改其他武器.

_Utility是项目专门用来存放「编辑器扩展工具」的目录,前缀下划线是 UE 项目常用习惯:把仅编辑器内生效、游戏运行(打包 / PIE)不会执行的工具资源单独归类,和正式游戏业务资源做隔离
utils蓝图在这里看:

- using-a-custom-character
使用blender, tab键可以切换为编辑模式, 才能改mesh
- Creating & Editing Actions
都是先点下面的create action,再点browser action设置.

openlogic

- 改boss mesh
![image]()

所有场景中最终极的东西就是blueprint class. 最终设置的都在这里找.
蒙太奇不能改retarget
动画sequence可以改retarget
好像蒙太奇底层的动画sequence设置好retarget,蒙太奇自动会替换好?
积累差不多了. 开始从0读所有蓝图:
先看蓝图库:
默认情况下,项目内所有蓝图(关卡蓝图、Actor 蓝图、Widget 蓝图、其他 BFL 函数库)都能直接调用 BFL 里写好的纯函数 / 普通函数,无额外绑定、无继承要求
编辑器里随便放哪个文件夹都能正常调用
只要资产在项目 Content/ 目录下(子文件夹任意层级),所有蓝图都能搜索并调用该 BFL 的公开函数,不受文件夹路径限制。
先看这个:
/Game/SoulslikeFramework/Blueprints/BFL_Helper.BFL_Helper

遍历全部的按键绑定mapping, 如果有输入里面的target ia. (ia,表示input action),那么就返回这个target所对应的按键.

World Context Object(世界上下文对象) 是 UE5 蓝图里的特殊对象引用,本质是能访问当前游戏世界(UWorld)的任意 Actor / 对象。
引擎通过它获取当前关卡、玩家、子系统、时间、场景资源等全局游戏信息。

就是用来打印状态信息. 方便玩家看.

输入一个数组, 去重后再返回去重后的数组.

返回一个保存文件的名字的字符串, 保证这个字符串不是跟之前的保存名字重复.后面索引是递增排序的.

返回savedata的信息, 具体这个tag什么意思, 现在还没理解. 这个里面是save game tag.

savegame tag是一个gamelplay tag类型. 具体这个gameplay tag是做什么的还没理解.
好像是游戏里面的一种标识符类型. 一种树结构.

向量的二范数是否大于一个值.

判断是否可以背刺, 返回布尔值.

判断是前方打击到敌人还是后方还是左边还是右边.

跟上个差不多, 根据被击打部位, 写入死亡不同方位的tag.

返回特定类型的location actor.

从actor reference 找到他的hud
正确层级关系(顺序、归属完全纠正)
GameMode → PlayerController → HUD
PlayerController → Pawn(Actor)
controller包含:
- HUD
- Player State
- Input Component 输入组件
- Camera Manager 相机管理器
几个核心概念!!!!!!!!!!
GameMode:全局规则、生成玩家控制器、全局 AI、一局游戏总逻辑;不存玩家 UI、输入;
PlayerController:玩家专属枢纽:输入、相机、HUD、玩家状态、操控角色;
Pawn/Character:只负责角色实体:模型、动画、碰撞、移动物理、血量计算;不管理输入、相机、UI;
HUD:只负责 2D UI 绘制,纯显示层,不处理输入、角色逻辑。

技能释放之后,冷却. 冷却好了才返回is cooled=True.表示冷却走完了.

效率更高的宏写法.
用户指定array 和loopbody即可.
看见sequence里面,执行完loopbody之后会继续迭代array

同理逆向迭代数组.
/Game/SoulslikeFramework/Blueprints/BML_StructConversion.BML_StructConversion
结构体宏.
/Game/SoulslikeFramework/Blueprints/_AI/Misc/B_PatrolPath.B_PatrolPath

效果就是人物在0-5 这6个节点来回走(0,1,2,4,5,4,3,2,1,....). (5是举例子)
这里面route是spline物体. 是一个数组.
/Game/SoulslikeFramework/Blueprints/_AI/Misc/AIC_SoulslikeFramework.AIC_SoulslikeFramework
ai_controller父类
aic: ai controller
/Game/SoulslikeFramework/Blueprints/_AI/BT_Enemy.BT_Enemy
Event Receive Execute AI 节点详解(UE 行为树蓝图任务入口)
一、节点作用
这是自定义行为树 BT 任务的主执行入口事件:当行为树运行调度到当前这个蓝图任务节点时,引擎会自动触发该事件,后续所有任务逻辑(你之前写的焦点开关、转向处理)都要从这个事件的执行输出引脚往后串联。
二、两个输出引脚含义
Owner Controller
输出当前 AI 对应的AI 控制器(AIController)实例,也就是你项目里的AIC_SoulslikeFramework对象,绝大多数 AI 控制接口(SetFocus、ClearFocus、寻路指令)都要以它作为调用目标。
Controlled Pawn
输出该 AI 控制器所操控的怪物角色实体(Character/Pawn),可用来读取角色位置、动画状态、韧性值等角色自身数据。
/Game/SoulslikeFramework/Blueprints/_AI/Services/BTS_DistanceCheck.BTS_DistanceCheck

这个根据设置的compareType,判断两个actor之间的距离关系.返回布尔值.
/Game/SoulslikeFramework/Blueprints/_AI/Services/BTS_SetMovementModeBasedOnDistance.BTS_SetMovementModeBasedOnDistance
ai跟玩家距离来判断是否是跑还是走


获取角色周围随机一个位置然后写黑板target变量里面.

解释这个蓝图.
首先在0到最大值之间取一个值,a 然后我们要把这个值对应的真实method算出来.
方法是把遍历这些score.如果a<当前score. 那么就是这个score对应的method.
如果当前a>score, 那么a减去score,再循环.通过这种方法就把这个method随机抽样出来了.

这个图就是简单的读取patrol地址, 然后ai走过去.

把key和keydata根据类型写黑板里面.

moveto函数的视线, 对于ai来说先判断target是一个actor吗. 如果是,直接走过去.
如果不是那么target是一个vector.按照坐标走过去.

查看是否已经focus了.然后获取一个focus对象, 已经有了那么就pass, 如果没有那么就锁定一下target指定的这个对象.
/Game/SoulslikeFramework/Blueprints/_Characters/B_BaseCharacter.B_BaseCharacter
核心最底层的玩家蓝图-----------很大的一块蓝图.

SPAWNING / DESTROYING RELATED:生成、销毁 Actor 相关的节点分组,专门收纳生成物体、销毁物体、出生 / 死亡触发的逻辑
MONTAGE RELATED:动画蒙太奇(AnimMontage)相关逻辑,比如动画播放结束回调、蒙太奇事件绑定
NIAGARA RELATED:Niagara 粒子特效系统的专属逻辑,特效生成、参数修改、特效结束事件都归这里
GAMEPLAY RELATED:常规游戏玩法逻辑,战斗、移动、交互、数值计算等通用玩法代码
charcter interface: 接口的视线.
VARIABLES(变量区)
存放该蓝图所有成员变量:
Components:该 Actor 挂载的所有组件(胶囊体、网格体、AI 控制器、音频组件等)
Caches:缓存变量,一般存反复读取的计算结果、引用,避免每帧重复查询计算,优化性能
Bind Event to On Rotation Lerp End: 会触发event disaptcher里面的 On Rotation Lerp End
Call On Location Rotation Lerp End: 触发事件,主动推送信号,唤醒所有订阅过该分发器的逻辑
下面一个一个看:
第一个自定义事件:

就是在spawnactor函数前面套一层变成event.建立一个捡东西的actor.

同上.

服务端跟客户端同时保持生成actor.

这个是异步加载:
高频、核心资源(主角武器、常用技能):用硬引用 / 预加载 使用上面的方式
低频、稀有、大量可选资源(稀有道具、大招特效、场景隐藏物件):软引用 + 用时异步加载,就是这个异步加载的soft模式.

Should Stop All Montages(红色布尔勾选框)
勾选 = 播放本次蒙太奇前,强制停止该骨骼体上所有正在播放的其他蒙太奇;取消勾选则允许多个蒙太奇叠加播放。

load加载的资源, 一定要手动cast

进行优先蒙太奇的动画播放.

生成附着型一次性 Niagara 特效
Auto Destroy 特效播放完自动销毁(一次性特效必开)
Auto Activate 生成后立刻播放粒子,无需手动触发激活
Pre Cull Check 相机看不到时直接不生成特效,优化性能
所有带spawn的函数都是生成一个object的.

名字叫set speed, 实际上的意思是设置最大速度. 用户移动是慢慢加速的.

swtich has authority表示当前是否是服务器端, 如果是服务器端那么直接跳跃就行. 如果是客户端, 那么再调用srv 服务器端跳跃.让服务器跟客户端保持一致.

受攻击停顿: 俗称卡肉
SET Custom Time Dilation=0 表示全局静止.
duration传入多久就是全局暂停多久, 然后set timer by event.
是过了多久后触发event,这里面触发的event是把 SET Custom Time Dilation=1,
表示恢复正常速度.

线性平滑移动旋转

显示锁定的白色图标

软加载声音素材然后播放.
下面我们看他的子类:
/Game/SoulslikeFramework/Blueprints/_Characters/B_Soulslike_Character.B_Soulslike_Character
begin play:

每0.1秒我们就读取控制器的方向控制, 然后设置角色的方向为这个方向.

过0.25秒然后设置这个变量为true
create event:
动态创建一个带指定函数签名的自定义事件

根据选择的人物进行


旋转的设置.用x轴跟z轴.设置rotation.第三人称都这样.

这里面要赋值2次.
第一次处理x轴的方向, x轴负责玩家左右走.
第二次处理的是y轴的方向,也就是前后走.前后走是z轴的控制.他的分量z, 控制z轴.

玩家移动的时候更新雷达, 不移动的时候不要更新雷达. 节省算力.

控制鼠标移动控制视野的.
首先如果交互情况下, 视角锁定

鼠标中键重置相机视角.

运行camera动画, 用于处决, 背刺.
交互

当射线检测到npc时候, 我们进行显示e图标.如果检测不掉就触发隐藏.

按下交互键e
按下交互键瞬间,执行流进入 Do Once,走 Completed 调用交互事件,Do Once 立刻锁死,防止长按重复触发交互;
因为玩家可能会疯狂按e. 所以这里面用doonce.来保证指令不会重复.

激活篝火逻辑:

actor先移动到门的位置, 然后播放开门蒙太奇.
核心移动节点 Generic Location and Rotation Lerp Target = self(玩家角色,真正移动的主体)
蓝图里面写的self, 他就表示这个蓝图所属的actor

爬**, 开箱子都是这个逻辑,
绑定location rotation lerp吸附之后,触发move to event
玩家先触发location rotation lerp吸附, 把人吸附到**上,
触发move to event, 然后这个event 触发解除location rotation lerp吸附.
逻辑就是先绑定吸附之后一个事件, 这个事件是取消绑定,设置正在爬.
所有交互都大概这个逻辑.

输入锁定触发.

Is Locally Controlled(UE4/UE5 蓝图节点)
核心定义
这个节点属于 Pawn / Character 自带函数
✅ 作用:判断当前这个 Pawn(角色)是否被本机本地控制器操控
多人联机场景真值对照表
假设:联机,你操控玩家 A,能看见玩家 B
你的电脑(客户端)
你的角色 A:Is Locally Controlled = True
其他玩家 B:Is Locally Controlled = False

动作都是

queue action是整个动作体系的核心.
所有动作都按照一个队列进行存储,进行播放.居然代码这么短.
逻辑是如果buffer open了.如果队列打开着, 那么就把动作入队. 让他自己安排什么时候播放.
如果队列关闭了,那么直接队列head进行播放队首的动作. 也叫consume. 整体就是生产者消费者模型.

背刺逻辑. 先进行胶囊检测.找到target目标.

查看目标是否实现了背刺接口, 然后判断是否背对.

这里面逻辑是先蹲下然后进行背刺.

这里面是处决, 任何敌人都可以处决, 只有人类敌人可以背刺.
处决用的是球胶囊, 判定更宽松.
碰撞的东西:
数组第 0 项 = 最先碰到(离起点最近)

重攻击写的过于简单, 蓄力重攻击还没有实现.
可以蓄力重攻击跟他一个动画.

input_buffer的使用. 如果玩家没死,那么就执行这个动作.

更新建模的建模片.
dataload

第一步是加载存档的玩家位置和旋转, 然后赋值给玩家.

重新在召唤actor

chaos:用来做物理打碎的.
Sphere Trace For Objects 关键结论
✅ 是的!这个节点最多只返回【第一个碰撞命中结果】,只能拿到 1 个 Hit(Out Hit)
Sphere Multi Trace For Objects:数组输出,返回沿途全部命中对象(Out Hits 数组引脚)

构建模块化的模型动态构建.

根据鼠标移动, 计算camera的偏移量.

重置摄像机.
/Game/SoulslikeFramework/Blueprints/_Characters/Enemies/B_Soulslike_Enemy.B_Soulslike_Enemy
下一个核心的类:
敌人基础类:
他是继承base character
VFX = Visual Effects 视觉特效(视效)
loot
战利品.
2种不同被攻击的动画:
IK Hit Reaction(当前逻辑):叠加扰动,不打断原有动画,轻受击
【原有动作继续播放 + 骨骼微微扭曲晃一下】
AnimMontage 受击:切换动画,打断当前动作,重硬直
【停止现在动作,播放独立受击动画】
父类子类蓝图:
先说核心结论:不会直接覆盖!但是要区分两种情况(蓝图继承规则)
先看懂你这张图逻辑:
On Death 是来自父类 AC_AI_CombatManager 的委托 / 事件。
你在子类蓝图绑定 / 重写这个事件,和父类里面同一个事件写逻辑,互不覆盖。
情况 1:如果是【Event Dispatcher 调度器(委托绑定)】(你图里这种 On Death)
父类:绑定 OnDeath → 执行 A 逻辑
子类:再次绑定 OnDeath → 执行 B 逻辑
✅ 结果:触发死亡时,A、B 两套逻辑都会运行,互不覆盖!
不是覆盖,是叠加执行。
⚠️坑:
如果你不想要父类逻辑同时跑,不能单纯在子类写新逻辑;
要么父类加开关控制,要么子类解除父类的绑定。
情况 2:如果是【Override 重写事件(Override Event)】(蓝图左上角绿色 Override)
这种才会覆盖!
父类:Event ReceiveDamage 写逻辑
子类:Override ReceiveDamage
👉 默认只跑子类代码,父类逻辑不再执行,除非你手动调用 Call Parent Function。
/Game/SoulslikeFramework/Blueprints/_Characters/Npcs/B_Soulslike_NPC.B_Soulslike_NPC
然后看npc的处理逻辑

对npc进行移动.

用来判断一个uuid是否有效.

播放开场动画
创建动画acotr,然后播放, 播放完销毁.
/Game/SoulslikeFramework/Blueprints/_WorldActors/_Items/B_Item.B_Item
item的父类.不做什么逻辑.
/Game/SoulslikeFramework/Blueprints/_WorldActors/_Items/Usables/B_Item_Lantern.B_Item_Lantern
贴身的小灯:

使用这个贴身的小灯的逻辑:
Get Instigator(获取肇事者 / 发起者)
返回值类型:Pawn(人物 / 可被控制器操控的 Actor)
简单理解:这个 Actor 是谁造成的、是谁扔出来的、是谁发起这次行为的那个角色。
和 Owner 的区别(非常容易搞混)
Instigator(肇事者):谁做的这件事(人 / 角色 Pawn)
例子:玩家扔手榴弹,手榴弹的 Instigator = 玩家角色
手榴弹爆炸造成伤害,系统就知道是这个玩家造成的伤害,用于计分、击杀判定、友伤过滤。
Owner(拥有者):谁拥有这个对象,可以是 Controller/Actor。
手榴弹:Owner 可以是玩家 Controller;Instigator 是玩家 Character(Pawn)。
所以第一步先拿到玩家的对象.然后加载这个台灯mesh到latern socket.
Set Timer by Event(按事件设置定时器)UE 蓝图
作用:延迟指定秒数之后,触发绑定的 Event 事件;
Set Simulate Physics(开启 / 关闭物理模拟)UE 蓝图
Target 目标是 Primitive Component(图元组件,例如 StaticMeshComponent 静态网格体组件)
作用:控制组件是否开启物理引擎模拟,勾选后物体会受重力、碰撞、外力影响,会掉落、滚动。

切换他的材质
/Game/SoulslikeFramework/Blueprints/_WorldActors/_Items/Weapons/B_Item_Weapon.B_Item_Weapon
继续看武器
先看武器的基类.
第一个函数. 装备武器事件:

prio是优先级高的动画, 这里面是受击动画.

ai武器:
/Game/SoulslikeFramework/Blueprints/_WorldActors/Interactables/B_Interactable.B_Interactable
交互物品的父类.

加载游戏时候触发:

带黄色齿轮的是实现了的
不带黄色的,而是白色齿轮的是不实现,而是继承父类的.
普通门:

开门蓝图.
Get Actor Location
Target 要求:Actor 对象本身
含义:获取Actor 根组件的世界坐标位置,本质等价于 Actor.RootComponent.Get World Location
Get World Location
Target 要求:任意场景组件(Scene Component,包括静态网格、胶囊体、骨骼网格、子组件等)
含义:获取该指定场景组件自身在世界空间的坐标
两个函数的区别. 就是target的类型不同.
向量1是门的前向量.
向量2是从门的前向量指向玩家.

两个向量做X乘机.
UE 左手坐标系 + 左手叉乘定则实操举例
一、先明确基础规则
- UE 默认轴向规范
X 轴:角色向前
Y 轴:角色向右
Z 轴:角色向上 - 左手叉乘定则操作步骤
伸出左手,四指先指向第一个输入向量 A;
四指朝着第二个输入向量 B的方向弯曲(小于 180° 夹角转动);
大拇指竖直指向的方向,就是 A Cross B 最终结果向量方向。
经典用发: X乘
经典示例 2:判断敌人在玩家左侧 / 右侧(游戏高频用法)
步骤拆解
玩家自身前向向量 ForwardVec(A 向量)
玩家指向敌人的方向向量 DirToEnemy = 敌人位置 - 玩家位置(B 向量)
计算 CrossResult = ForwardVec Cross DirToEnemy,只看结果 Z 分量:
左手判断逻辑
Z>0:大拇指朝上,敌人在玩家右侧
Z<0:大拇指朝下,敌人在玩家左侧
/Game/SoulslikeFramework/Blueprints/_WorldActors/Interactables/B_BossDoor.B_BossDoor
boss门:

UE Set Collision Enabled 6 个选项完整详解(适配你的门组件场景)
- No Collision
含义:完全关闭碰撞,无物理阻挡、无射线查询、无接触事件
门场景用途:开门后设置此项,玩家、物体可直接穿过门板门洞
特点:彻底屏蔽所有碰撞逻辑,不会产生任何阻挡与检测 - Query Only (No Physics Collision)
含义:仅支持射线 / 扫描查询(LineTrace、SphereTrace),无物理阻挡
门场景用途:开门后保留交互检测(比如鼠标 hover 识别门),但不挡角色走路
特点:能被射线命中做交互判定,角色 / 物体不会被门板挡住 - Physics Only (No Query Collision)
含义:仅物理刚体碰撞生效,射线查询完全失效
门场景用途:静态房门几乎不用;仅带物理可碎门板、可推动门板会用到
特点:角色会被门板阻挡,但鼠标射线无法选中、识别这个门组件 - Collision Enabled (Query and Physics)
含义:完整开启碰撞,同时支持射线查询 + 物理阻挡,组件默认标准碰撞模式
门场景用途:关门状态必备选项,关门后门板挡住角色,同时支持交互射线选中门
特点:房门常规默认配置,兼顾通行阻挡和交互检测 - Probe Only (Contact Data, No Query or Physics Collision)
含义:只触发接触事件(OnComponentBeginOverlap 重叠事件),无阻挡、无射线查询
门场景用途:极少用,仅需要检测角色路过门洞触发事件、不需要阻挡和选中时使用
特点:角色穿过会触发重叠回调,但挡不住人、也没法鼠标选中交互 - Query and Probe (Query Collision and Contact Data, No Physics Collision)
含义:支持射线查询 + 重叠接触事件,无物理阻挡
门场景用途:开门后想保留鼠标选中门 + 角色过门触发提示事件,又不阻挡通行
特点:可交互选中、可检测角色重叠进门,角色不会被门板挡住

解锁boss门
解除碰撞, 然后删除组件.

打开箱子

物品移动向玩家然后销毁.
/Game/SoulslikeFramework/Blueprints/_WorldActors/Interactables/B_Ladder.B_Ladder
**
/Game/SoulslikeFramework/Blueprints/_WorldActors/LevelDesign/B_DeathTrigger.B_DeathTrigger

死亡触发区域:

拥有这个tag就被高damage杀死.

construction script:是做摆放用的.
self物品摆放的场景之后就会运行这个脚本进行配置.
文档
https://soulslike-framework.isik.vip/getting-started/quickstart/setup-locomotion-blendspaces
先把文档学了. 好像需要10个小时来学会.
先学会框架,然后再研究框架底层实现.
- 蒙太奇:
notify state需要使用ANS_InputBuffer: 这种Input Buffer Notify 可以在触发时候让键盘输入无效化并且新输入写入buffer,这样才符合魂游的逻辑.
![image]()
ANS_InvincibilityFrame Notify State : 这个用来触发玩家无敌状态.
虚幻引擎蓝图断点完整教程(UE4/UE5 通用)
一、添加普通断点(最常用)
- 给单个节点打断点
打开蓝图编辑器(关卡蓝图 / 角色蓝图 / 函数蓝图均可)
右键任意执行节点(带白色箭头输入输出的节点)
菜单选择:Add Breakpoint(添加断点)
节点左上角出现红色圆点,代表断点生效
当前窗口的蓝图, 快速定位他在content browser里面的位置:
ctrl+b即可].
-
删除过场动画.
改成下面这样就能跳过过长动画逻辑, 不播放过长动画
![image]()
这个蓝图我是调试找到的. 目录里面没找到. 奇怪 -
自定义角色:
![image]()
左边对号是玩家属性, 右边是玩家的建模.
先把两个项目advanced combat system, 融合进这个soullike framework里面. 这两个里面都有特色. 融合一下.
ue里面添加素材的东西. 都要放到content/developes目录里面,然后打开

这样素材就可以不影响编译.
1. 查找函数.
这种cast to xxx的:

不存在这个函数定义.
只能看xxx的蓝图定义.

这样搜索就行.
compile打开, 方便调试

添加新的武器.
如何破解任意软件 - Daniel Hirsch
objdump -s test
修框架bug:
PIE: Error: Blueprint Runtime Error: "Accessed None trying to read (real) property CallFunc_GetOwnerAnimInstance_AnimInstance in not an UClass". Node: Branch Graph: IsValid Function: Execute Ubergraph B Action Guard Start Blueprint: B_Action_GuardStart
目前还是处决之后,玩家静止了,无法移动.
先不管bug, 继续看框架源码
/Game/SoulslikeFramework/Blueprints/AnimationRelated/Notifies/AN_AdjustStat.AN_AdjustStat
先看notify 动画的蓝图:

先是返回名字函数, 直接返回字符串的名字.

notify蓝图核心的逻辑要写在这个函数里面.
叫Received Notify.
/Game/SoulslikeFramework/Blueprints/AnimationRelated/Notifies/AN_AI_SpawnProjectile.AN_AI_SpawnProjectile
第二个,扔投掷物.
/Game/SoulslikeFramework/Blueprints/AnimationRelated/Notifies/ANS_WeaponTrace.ANS_WeaponTrace
看一下这个最核心的.!!!!!!!!!!!!!!!!!!!!!
/Game/SoulslikeFramework/Blueprints/Components/AC_ActionManager.AC_ActionManager
直接看component部分.
第一个action manager:

stamina loss:

带 f 的 Is Valid(纯函数)
只有蓝色对象输入引脚、绿色布尔返回引脚,没有 Exec 执行线引脚;
只能把结果给到 Branch、Compare Bool 等节点做判断,本身不能串联执行流程;
示例用法:把返回值塞进 Branch 的 Condition 做条件判断。
带?的 Is Valid(流程判断节点)
自带左侧 Exec 输入、右侧 Is Valid / Is Not Valid 两条执行输出引脚;
直接串联蓝图执行线,对象有效走右侧主线,无效走 Is Not Valid 分支做兜底、Return 终止流程;
日常蓝图空安全校验最常用,一步完成校验 + 分流。
/Game/SoulslikeFramework/Blueprints/Components/AC_AI_Boss.AC_AI_Boss

boss的二阶段.

object 的东西用的是

actor的东西用的是
spawn 来调用.
/Game/SoulslikeFramework/Blueprints/AnimationRelated/Notifies/ANS_InputBuffer.ANS_InputBuffer
/Game/SoulslikeFramework/Blueprints/Components/AC_InputBuffer.AC_InputBuffer

/Script/Engine.Blueprint'/Game/SoulslikeFramework/Blueprints/Components/AC_SaveLoadManager.AC_SaveLoadManager'
非常重要的保存加载.
主要结构是save Game entry

初始化状态.
widget 部分:
Animate Horizontally ✅勾选 开启横向 UV 自动滚动,画面水平持续移动
设置gamestarter 激活哪个人物蓝图:

修框架bug:
PIE: Error: Blueprint Runtime Error: "Accessed None trying to read (real) property CallFunc_GetOwnerAnimInstance_AnimInstance in not an UClass". Node: Branch Graph: IsValid Function: Execute Ubergraph B Action Guard Start Blueprint: B_Action_GuardStart
目前还是处决之后,玩家静止了,无法移动.

先处理速度. 打开这个蓝图之后点graph

处决后
先进入这个蓝图:

调试的时候, 鼠标放在节点上看:

stat 是 属性
status 是状态,: 出血冻伤.
控制特殊状态的蓝图:
/Game/SoulslikeFramework/Data/StatusEffects/StatusEffectClasses/B_StatusEffect.B_StatusEffect
buildup 游戏战斗场景释义(适配你的魂类 Status 状态系统)
基础释义
buildup = 累积、叠层、逐步积攒进度,在动作 / 魂类游戏里专指异常值累积进度
How do I completely stop the Editor from making calls to URL https://www.google.com/generate_204 ?
框架改进优化:
https://soulslike-framework.isik.vip/updates/rigvm-packaging-issue-related-to-struct-conflicts
解决处决之后掉落地板的问题
我懂了, 就是这个disable root导致的. 因为我处决之后我又瞬间普工了一下. 触发了这个diable root. 瞬间就掉了

蒙太奇右边打开floor, 看角色是否z<0摔出地板.
我的改进:

下面测试5次.看看效果.

搞定了!!!!!!!!!!!!!!!!!!!!
还不对, 再试试/
LogInterchangeEngine: Error: [C:/Users/sdf/Desktop/basic_sucai/Combat Animations/SwordAttackCombo.FBX : '', AnimSequence] Animation length 3.529 is not compatible with import frame-rate 30 fps (sub frame 0.875). The animation has to be frame-border aligned if the 'Snap to Closest Frame Boundary' pipeline option is disabled.
LogInterchangeEngine: [Pending] Importing - Operation Completed.
LogInterchangeEngine: Error: [Failure] Import Failed
方法一:在 UE 导入设置中开启“自动吸附”(最快)
重新把 FBX 拖进引擎,在弹出的导入设置(Import Settings)窗口中:
展开 Animation 或 Pipeline 相关的高级选项。
找到 Snap to Closest Frame Boundary(吸附到最近的帧边界)这一项。
将其勾选(启用)。
重新点击导入。引擎会自动把那多出来的 0.875 帧微调对齐,允许成功导入。
下面我们处理存档的bug.
存档之后好像游戏没反应.
看看篝火逻辑进行debug
虚幻事件分发器教学
学习动画资产
-
Skeleton
所有针对这个角色的动画(动画序列、动画蒙太奇 AM_、动画蓝图)都必须绑定并依赖于这个骨骼资产才能正常播放。它定义了角色所有的关节、骨骼层级结构(比如脊椎、手臂、腿部骨骼节点)以及 Socket(插槽,用于挂载武器或特效)。 -
skeleton mesh, pysics asset
一个是骨骼上面的面片, 一个是物理碰撞的设置.
子蓝图问题:
空节点拦截了父类逻辑: 哪怕图表里只是摆了一个没有任何连线的空事件(比如 OnExecutionStarted),引擎也会认定你“重写”了它,并直接屏蔽父类写好的处决、锁 Z 轴和物理控制代码。 这么坑吗
先看原生的敌人设置:


选中创景中的敌人后.
设置参数.
第一个是


设置speed, 血量,

stance, 架势条.

攻击buff

攻击动画

ui

破防设置

行为树
下面跟教程再走一遍更细的设置:
https://soulslike-framework.isik.vip/workflow/creating-an-enemy
Loot Drop Manager

研究一下ai ability:
创建之后在:
/Game/SoulslikeFramework/Data/AI_Abilities/DA_AI_Ability_Myability.DA_AI_Ability_Myability
学习一下他的参数.
最后添加到enemy上:

高级: 自定义技能释放的规则:
该框架提供了两条规则——距离(FAiRuleDistance)和状态(FAiRuleStat)。这些规则是包含相关数据的结构体,位于/SoulslikeFramework/Structures/AI/Rules 目录下。
通过使用实例化结构,您可以创建一个包含相关数据的新结构,并调整AC_AI_CombatManager中的EvaluateAbilityRule()函数,从而创建自己的规则。
创建新的规则:
/Game/SoulslikeFramework/Structures/AI/Rules/ST_SLF_AiRuleStat.ST_SLF_AiRuleStat
调整AC_AI_CombatManager中的EvaluateAbilityRule()函数,从而创建自己的规则。
示例 2 - 输入读取规则
读指令的实现, 这个比较难.
这里面用的就是事件dispatcher.
学习Using Motion Warping
https://soulslike-framework.isik.vip/extending-functionality/using-motion-warping
相机臂的卡顿问题.

在 Soulslike 游戏开发中,通常有以下两种更合理的处理方式:
改变相机的检测通道(最推荐):
在相机臂(Spring Arm)的属性里,把 Probe Channel(探测通道) 从默认的 Camera 或 Visibility 改为专门的通道(或者在碰撞设置里,把角色胶囊体和敌人的胶囊体对 Camera 通道设置为 Ignore(忽略))。这样相机只会避开墙壁和地板,完全忽略角色和敌人,既不穿墙,贴身肉搏时镜头也不卡顿。
学些存档,读档:

ffloat 是啥
在虚幻引擎 C++ 代码规范中,首字母 F 代表这是一个 结构体(Struct)。所以 FFloat 本质上是一个用结构体(Struct)包裹起来的 Float 浮点数。
gameplay tags理解:
等于一个字典数据库?
非常精准!你的理解完全正确!
Gameplay Tag 配合底层存档系统的这一套逻辑,本质上就是一个基于 字典(Dictionary / Map / Key-Value 键值对)的轻量级数据库。
在这个“字典数据库”里,它们的角色分工是这样的:
Key(键 / 查找字典的单词):就是这个 Gameplay Tag(比如 SoulslikeFramework.Saving.MyNewVariable)。它在整个游戏里是独一无二的,用来当做索引。
Value(值 / 单词对应的解释):就是后面的 Instanced Struct 数据(被包装好的变量值)。
Database(数据库本体):就是框架里的 SaveGame 存档文件。它的底层数据结构通常就是一个 TMap<FGameplayTag, FInstancedStruct>(即以标签为 Key、实例化结构体为 Value 的字典)。
gameplay tag的添加:
搜不到这个myvariable啊
搜不到是因为在这一版虚幻引擎中,它隐藏在那个绿色加号后面。既然我们之前分析过它是“字典数据库”的 Key,那它现在在数据库里还不存在,必须由你来手动创建(新建)它。
请直接在当前弹出的这个窗口中,跟着我进行操作:
🛠️ 两步直接创建并选中它:
点击那个绿色的加号 +
看见搜索框左边那个绿色的 + 按钮了吗?直接用鼠标左键点击它。
在弹出的新窗口里输入名字
点击加号后会弹出一个叫“Add New Gameplay Tag”的小窗口:
Format text 如何长出引脚
怎么让它长出下面那个绿色的 value 引脚?
刚召唤出来的 Format Text 节点默认是没有任何输入引脚的。
你需要在它的 Format 输入框里打字输入:MyVariable loaded! Value = {value}
关键点:文字里必须要包含大括号 {},括号里面的名字(比如 value)就是引脚的名字。
输入完敲击回车,节点下方就会自动魔术般地长出那个绿色的 value 引脚了!接着把你的变量连上去就大功告成。
虚幻几大获取信息函数
Get Controller (获取自身控制器)
它是谁的函数:它是 Pawn(或 Character) 类内部特有的函数。
干什么用:获取当前这个 Pawn 正在被谁控制。
返回值:Controller 基类对象(可能是 PlayerController 玩家控制器,也可能是 AIController AI控制器)。
大白话理解:你在角色蓝图里用它,就代表“控制我(当前这个身体)的那个大脑是谁?”。如果这个角色是玩家,它拿到玩家控制器;如果是怪物,它拿到 AI 控制器。
Get Player Controller (获取玩家控制器)
它是谁的函数:它是一个全局静态函数,在任何蓝图里都能搜到。
干什么用:通过索引 ID 直接去世界里抓取某个玩家的控制器。
参数 Player Index:默认是 0(代表本地第一个玩家)。在单机游戏里,0 就代表唯一的玩家。如果是本地双人同屏(如《双人成行》),才会有 1。
大白话理解:不管你在哪个蓝图里(甚至在一个莫得灵魂的石头、或者UI里),只要调用它并传个 0,它就会直接把地图里唯一的那个主角玩家的大脑(PlayerController)给你揪出来。
添加新种类的武器动画
https://soulslike-framework.isik.vip/extending-functionality/extending-weapon-animsets
Resetting Enemies After Resting
写度盘逻辑
Get Actor Transform(获取整个演员的坐标)
操作对象:只能对 Actor(场景中的独立个体,比如玩家、敌人、一把插在世界里的宝箱)使用。
返回结果:返回这个 Actor 的 根组件(Root Component) 在世界坐标系下的 Transform。
大白话理解:比如你的主角蓝图(Actor)里有胶囊体、有狐狸模型、有武器模型。当你调用 Get Actor Transform 时,拿到的就是以胶囊体(根组件)为基准的整个人在地图上的绝对位置。你没法用它去单独拿主角右手或者衣服的坐标。
Get World Transform(获取某个具体零件的绝对坐标)
操作对象:只能对 Scene Component(场景组件) 使用(比如 Actor 内部的 Mesh、StaticMesh、Camera、Arrow 等组件)。
返回结果:返回这一个具体组件在世界坐标系下的绝对 Transform(它已经自动把 Actor 自身的位置以及组件的相对偏移全部叠加计算好了)。
大白话理解:你的主角在跑动并挥剑,你想知道剑尖此时此刻在地图上的什么位置(比如要生成个火花特效)。这时候你就不能用 Actor Transform,而是要拉出武器的 Mesh 组件,调用 Get World Transform,就能精准拿到这把武器在世界里的绝对坐标
guid:
00000000-0000-0000-0000-000000000000
Snap to Target 挂载后子组件直接匹配父组件 / 插槽的世界位姿,自身原有世界位置、旋转、缩放直接覆盖重置,完全贴合父节点
Keep Relative 保留挂载前子组件相对父组件的偏移值,挂载后维持原有相对位置,不会强行对齐父原点
Keep World 挂载后子组件保持自身当前世界坐标不变,父子层级绑定,但子组件位置不跟随父组件初始位姿变动
Sweep(碰撞扫描,当前未勾选)
关闭(当前状态):直接瞬移到目标坐标,全程不做碰撞检测,物体可以穿墙、嵌入地形 / 其他模型内部,不会阻挡位移。
开启勾选:物体从当前位置移动到新位置时,沿途做碰撞扫描,碰到碰撞实体就会停下,禁止穿模;碰撞详情会输出到右侧Sweep Hit Result。
Teleport(瞬移,当前已勾选✅)
专门针对开启了 Simulate Physics(物理模拟)的刚体组件:
✅勾选 Teleport:物理刚体瞬间跳转目标位置,不会产生位移速度、不会触发物理惯性、不会因为长距离瞬移出现物理抖动 / 飞脱、不会被物理引擎修正位置。
❌取消勾选:带物理模拟的物体长距离位移会被物理引擎判定为高速移动,产生冲量、甩飞、位置回弹、物理错乱,日常物理物体位移强烈建议保持勾选。
换地图. 我目前怀疑我地面处决之后穿模因为地图原因. 因为这个框架自带的地图是动态生成的.不是静态纯在的.
完全可以!只要是高版本(5.7)去用低版本(5.4)的模型资源,99% 的情况下都是一路畅通的。
虚幻引擎在资产兼容性上一直遵循 “向下兼容(Forward Compatibility)” 的原则——即高版本引擎可以完美读取和升级低版本引擎做出来的基础资产(如模型、贴图、材质)。
不过,在具体操作和后续处理上,有几个细节你需要注意:
- 怎么把 5.4 的资源弄进 5.7?
由于 Fab 或商城里的插件/资源包可能还没来得及标上“支持 5.7”的标签,你在下载时可能会遇到无法直接添加到 5.7 项目的情况。
解决方法:在 Fab/Launcher 资产库里点击“添加到项目”时,如果找不到你的 5.7 项目,勾选 “显示所有项目”。
然后选中你的 5.7 项目,并在版本下拉菜单中手动选择 5.4(或者当前能选的最高版本,比如 5.5 或 5.6)。虚幻会强制把资产塞进去,项目升级时会自动把它们转换成 5.7 格式。
2. 迁移(Migrate)大法
如果你觉得强制添加不放心,也可以先用 5.4 引擎建一个空白项目,把 Fab 的模型放进去,然后使用虚幻标准的 Migrate(迁移) 功能:
在 5.4 项目的内容浏览器里,右键点击模型资产的文件夹。
选择 Asset Actions \(\rightarrow\) Migrate...。
把目标路径选为你 5.7 项目的 Content 文件夹。这样拷贝过去的资产极其干净,且不容易出错。
3. 变成 5.7 之后需要注意什么?(潜在的小坑)
虽然模型(Mesh)和贴图(Texture)绝对不会坏,但有两点在 5.7 中可能会因为底层渲染器的升级而产生视觉变化:
材质(Materials)可能需要微调:5.4 到 5.7 期间,虚幻对 Lumen、基色(Base Color)冷暖色调优化、以及 Subsurface(次表面散射)的计算进行过底层微调。如果模型使用了特别复杂的着色器(比如带有很多特殊连线的皮肤、玻璃或特殊发光材质),升级到 5.7 后可能会显得比在 5.4 里更亮或更暗一些,需要你进材质球微调一下参数。
骨骼模型(Skeletal Mesh)的重定向:如果这个模型是带骨骼的(比如怪物的角色模型),5.4 和 5.7 的 IK Rig / IK Retargeter(IK重定向系统)界面和底层有一些小重构。资源包里自带的重定向资产在 5.7 里可能会报错,你可能需要自己在 5.7 里重新创建一下 IK Rig 来做动画重定向。
一句话总结: 放心下载!模型本身在 5.7 里用起来嘎嘎香,万一材质变样了,顺着连线调一调贴图强度就行。






浙公网安备 33010602011771号