[UE]TeamSystem框架
TeamSystem框架
一个简单的组队系统:支持玩家的 加入、退出 队伍,以及维护队伍的各种数据(比如 Members、Score)。
首先需要一个全局的 TeamManager ,以及一个在 Player 身上的 TeamComponent 负责维护 Player 相关的组队信息;
同时,将业务拆分为多个 TeamSubSystems。
以及最重点的 数据同步,根据不同的数据类型,进行不同方式的数据同步。
TeamSubSystemBase
首先,需要将业务拆分为多个 SubSystem ,通过 TeamManager 持有 SubSystemCollection 来实现这个功能。
需要一个 TeamSubSystemBase ,在这里传入 System = TeamManager 以及为后续同步数据的分发做准备。
参考:[UE]GameSubSystem简单实现
123456789101112131415161718UCLASS(Abstract)class UTeamSubSystemBase : public UGameSubSystemBase{ GENERAT ...
[UE]GameplayBuffSystem框架
GameplayBuffSystem框架
设计
首先我们需要一个 BuffManager ,管理所有的 BuffComponent。
(实现的时候,可以让 BuffManager 作为一个 GameStateComponent;BuffComponent 作为一个 PlayerStateComponent )
对于每个 Player,需要一个 BuffComponent 管理该 Player 身上持有的 Buff;
对于 Buff,需要一个 BuffBase 作为 Buff 的基类;
classDiagram
UGameplayBuffManager..>FGameplayBuffSetting
UGameplayBuffManager..>UGameplayBuffComponent
UGameplayBuffManager..>FGameplayBuffParams
class UGameplayBuffManager {
BuffSettings : TMap~int|FGameplayBuffSetting~
+CommitBuf ...
[UE]GameFeature浅析
GameFeature浅析
一套支持动态增删游戏玩法的框架,往 CoreGame 里 Add/Remove 其它游戏资源/逻辑;
以 Lyra(UE5.3) 为例,GameFeature 提供了很好的解耦资源/逻辑的方案,可以看出这里的 ShooterCore 被实现为了一个相对比较独立的 Plugin。
初始化
首先在游戏内,GameFeaturesSubsystem 管理着所有的 GameFeature,看到对应的初始化 UGameFeaturesSubsystem::Initialize,可以分为几步:
加载Policy:根据 GameFeaturesSubsystemSettings->GameFeaturesManagerClassName 加载对应的 GameSpecificPolicies
注册资源回调:UAssetManager::CallOrRegister_OnAssetManagerCreated
注册 ConsoleCommand 方便 Debug
在资源加载完的回调后,会走到 UGameFeaturesSubsystem::OnAs ...
2023 年度总结
2023 年度总结
一月
今年的记忆,从跨年和家人一起在海边放烟花开始,绚烂而又短暂的烟花就好像今年的故事一样,美好也夹杂着一些可惜。
一月底,随着网易和暴雪的合同到期,国内暴雪的时代正式结束了,好像人生一样,总是一次又一次的离别。看到了 link 发的回忆录,上面写着他的游戏策划之路从 War3 的疾风忍法帖地图开始,就好像我当初也玩 OW 玩到入迷。
虽然游戏不在了,但游戏带来的朋友,对人的影响却不会消失。好的游戏真的可以改变一个人一生的轨迹。
同时也更加坚定了自己对游戏行业的看法,游戏行业从业者,不单单只是从业者,更是热爱者、逐梦者,是一个 浪漫 的职业。
二月~三月
在工作中沉沦,写了 Gameplay经分框架、接了卡车玩法,优化了 DisplayInfoSystem。各种业务框架、性能优化、代码重构…… 日子一天天过去。为了出包、Showcase 更是一次又一次的爆肝。
但哪怕如此,最高通缉第一次 CE 测,也还是被喷烂了,玩家表示甚至不知道要进去要干啥,又感觉自己的辛苦毫无意义,这一切会不会是在感动自己呢?
那天晚上,一个人坐在人才公园的岸边发呆了两个小时。左边是体 ...
2022 年度总结
2022 年度总结
一月~二月
打工前最后的时光。
印象深刻的是看了乃琳的 50w 粉纪念回,她说:“喜欢,就是一件细水长流且滔滔不绝的事情呀~”。
一年结束回望过去,感情是这样,工作是这样,人生也是这样。
月初,投了下朝夕光年的江南工作室,结果被刷了;还被天美 L1 给捞了,结果也没有面过。
当初还很愤慨,觉得自己这么猛,肯定是面试官没有眼光。现在看来,当初的自己也十分青涩,自以为才高八斗,实际上连半桶水的水平也没有,连UI都不会拼,没有面试通过也很正常。
不过现在感觉也没什么,或许年少就该轻狂点,自负总比自卑更接近自信。
今年行业不景气,寒气传给了每一个人。和几个朋友都聊了聊,聊了下计划,聊了下未来,发现大家也都很焦虑。保研、考研、工作,大学最关键的一年,种种事情纷至沓来,DDL 仿佛近在眼前。
想了一想,果断接着逃学,在家准备面试和溜去实习。
寒气从年初开始找实习时就已经可见一斑,各大厂纷纷开始锁hc,连实习岗位都寥寥无几。幸运的是,或许是因为投简历投得早的原因,在锁 hc 的前一天,终于拿下了天美的实习 offer,十分感激 天美 F1 工作室 给了我实习的机会。
或许运气占 ...
[UE]PushModel属性同步
PushModel属性同步
优势
PushModel 是对 Replicate 的一个优化。
对于属性的同步,原有的 Replicated 属性,在 Replicate 之前需要通过反射对一个 Actor 的所有属性进行 diff,对比所有的属性是否发生变化,变化的属性才进行同步。
而用上了 PushModel,我们可以主动 MARK_DIRTY,在 Set 时主动将其设置为脏,相当于给该属性上了一个Flag,底层会自动通过这个Flag 来判断是否需要同步,省去了 diff 这个高消耗的操作。
需要注意的是,对于一个 Actor,如果采用了 PushModel,则需要将所有需要同步的属性都挂上这个 PushModel,否则如果存在非PushModel的需要Repilicated 的属性,可能会该功能不生效,退化到原来的情况。
UE5 中还对 PushModel 做了更进一步的优化,添加了一些新的宏以及对更多基础组件的支持。
实践
设置依赖
首先,我们需要在 Build.cs 中添加 NetCore 模块的依赖。
1PublicDependcyModuleNames.AddRange ...
2021 年度总结
2021 年度总结
一月 ~ 三月
开年好像并不是十分顺利,先是挂了 雅思听力 这门课(也是唯一一次挂科,幸好补考过了)。
给 ACM 的学弟讲课、准备补考、沉迷小说…… 日子总是在浑浑噩噩中就这样过去了,没什么成长也没什么收获。
就这样平平淡淡结束了这个学期在学校的日子,踏上了返乡的飞机。
回到家,躺了三天,想了很多,各种头脑风暴与纠结。最后终于坚定了自己的选择: 毕业直接打工 ,从事 游戏客户端开发 。
既然有了选择,那就动手!怎么在来年的秋招拿到个好 Offer 呢?水了水知乎,看了看那些面试的人,发现最有用的东西:实习经历。
发现大家都是大三才去找实习,那时候肯定很卷 QAQ,不行,得想个办法卷过他们!这时候我的内心萌生了一个想法:我要在这个 大二暑假 就去游戏大厂实习!
怎么找到实习呢?自然是 奖牌、项目、八股文 ,但这时我手里除了一块 ACM 银牌一无所有,于是带着找到实习的目标,开始了紧急特训。
寒假期间,每天晚上从七八点卷到凌晨三四点以后,最后终于在开学的前两天整出了一个稍微能看能聊的 项目 。开学后,带着焦虑从早到晚背了两三周的 八股文(速成还是稍微取巧了,不可取啊不 ...
Live2D模型的简单制作
Live2D模型的简单制作
准备工作
下载 Photoshop ;
下载 Live2D Cubism :https://www.live2d.com/zh-CHS/。
PS
首先我们在 PS 中制作好已经分层好的图层,为了方便后续在 Live2D Editor 中的使用,每个图层可以单独移动。
保存好 .psd 文件,后续使用。
Live2D Editor
导入文件
打开 Live2D Cubism Editor。
将制作好的 .psd 文件导入到 Editor 中。
应用模板动画
点击 文件 -> 应用模板 。
在显示的各种模板中选择一个合适的模板。
调整参数
调整模板参数,尽可能地保证五官、身体对应。
由于自动绑定不一定合适,我们在 应用模板预览 中手动绑定对应部位
点击一侧的部位,然后点击另一侧需要绑定的部位后,点击 对应所选元素 即可。
绑定后点击 OK 确认。
制作纹理
点击 可编辑纹理集 并导出纹理。
导出
点击 文件 -> 导出运作档 -> 导出为 moc3 文件 即可。
这个 moc3 文件即可投入使用。
骨骼动画原理
骨骼动画原理
基础知识
骨骼动画(Skeletal Animation) 是模型动画中的一种,通过改变骨骼的朝向和位置来为 模型 生成动画。
模型(Model)由一个个三角面组成,这种三角面也被称为 网格(Mesh),网格上有一个个 顶点(Vertex) 。
对应在骨骼动画中, 网格(Mesh) 也被称作 皮肤(Skin);骨骼之间的连接处称作 关节(Joints),骨骼可以绕着 关节 旋转。
骨骼动画的制作,我们一般先进行 蒙皮 ,然后运动时根据提前制作好的 关键帧 与在两个关键帧之间的 插值 进行 姿态调整 生成动画。
蒙皮
基础知识
对于两脚兽,一般使用 T-Pose 进行蒙皮,因为大部分姿势不会偏离它太大。
蒙皮 就是将 网格(Mesh) 的 顶点(Vertex) 给 绑定 在骨骼上,骨骼动画的本质就是用 骨骼 来操控 Mesh 动起来,Mesh 动起来的本质是 顶点 位置的改变。
一个 顶点 可能被多个 骨骼 影响(大部分情况一个顶点只会被一个骨骼影响,但是比如接近关节的顶点,单纯由一个骨骼影响可能会出现缝隙)。
确定被影响的方案就要使用 线性混合蒙皮(Linear Bl ...
[图形学]基础图形绘制-直线裁剪
基础图形绘制-直线裁剪
Cohen-Sutherland
Cohen-Sutherland 裁剪算法 是最常用的直线的裁剪算法,用于直线在矩形框的裁剪。
首先,给空间编码:
根据点所在的位置我们可以获得其编码。
接下来考虑几种情况:
完全在矩形框内:将端点编码按位或,若为 0,则完全在矩形框内,直接全部保留;
完全在矩形框外:将端点编码按位与,若不为 0,则完全在矩形框外,直接全部舍弃;
其它情况:计算线段与矩形框的交点,获得新的线段,继续判断。
对于 情况3,我们获得新的线段后接着判断。
这样可以有效减少计算次数,同时,遇到下图这种情况时:
我们会保留得到 AC 或 BD (取决于计算交点的顺序),然后在下一轮计算中舍弃该线段,不会出现问题。
123456789101112131415161718192021222324252627282930313233343536373839const int IN_SIDE = 0x0000;const int LEFT_SIDE = 0x0001;const int RIGHT_SIDE = 0x0010;c ...