[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]CommonDelegate解决方案
CommonDelegate解决方案
实现业务时,经常需要用到全局级别的 CommonDelegate;
定义如下 UTestCommonDelegate,即可定义出 UTestCommonDelegate::GetDelegate()->OnTestEvent 这样的一个 Delegate;
123456789101112131415161718// TestCommonDelegateUCLASS()class UTestCommonDelegate : public UCommonDelegateBase{ GENERATED_BODY()public: UFUNCTION() static UTestCommonDelegate* GetDelegate() { return GetCommonDelegate<UTestCommonDelegate>(); } public: DECLARE_DELEGATE_AnyParams(FTestEvent, int32 /*IntVal*/); ...
[UE]LocalDS的启动
LocalDS 的启动
启动 DS
1234567set Map=ThirdPersonMapset PlayerNum=2set DSEXE=UnrealEditor-Win64-Debug-Cmdset DSProj=../../UnrealEngine/UE/Engine/Binaries/Win64/%DSEXE% ../../../../../TestProject/TestProject.uprojectrem -----DS-----start %DSProj% %Map% ? -MaxPlayers=%PlayerNum% -port=17777 -game -server -log=DS.log
这里的 DSProj 需要定位到该文件(根据不同的 UE Version、BuildConfig 构建出的名字可能不同):
后续的 .uproject 路径,也是以该 .exe 为基础位置的相对路径。
同时,这里通过 %Map% 指定了 DS 上的 Map,-port 指定了本地端口号,并将 log 输出在 DS.log 中
特别的,如果不通过 %Map% 指定对应 Map ...
[前端开发]WordCloud
WordCloud
生成词云:
WordCloud.xlsx:
TestMask.png:尽量选择黑白区分明显的图片
Color 样式:
生成效果:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import pandas as pdfrom wordcloud import WordCloudimport numpy as npfrom PIL import Imageimport jieba# 1. 解码 txt 文本# txt = open(r"C:\Users\TestText.txt", encoding= "utf-8").read()# txt = jieba.lcut(txt) #jieba分词为列表# txt = " ".join(txt) #用空格分隔词语,转化为一个长字符串# stop = [] #设置停止词,如果长度小于等于1,则设置为停止词,例 ...
[UE]GameplayBuffSystem框架
GameplayBuffSystem框架
基础框架
由 BuffManager ,管理所有的 BuffComponent;
对于每个 Player,由 BuffComponent 管理该 Player 身上持有的 Buff;
classDiagram
UGameplayBuffManager..>FGameplayBuffSetting
UGameplayBuffManager..>UGameplayBuffComponent
UGameplayBuffManager..>FGameplayBuffParams
class UGameplayBuffManager {
BuffSettings : TMap~int, FGameplayBuffSetting~
+CommitBuff(Target, Buff, Params)
+QueryBuff(Target, Buff)
+CombineBuffParams(Target, Buff, Params)
+RemoveB ...
[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 银牌一无所有,于是带着找到实习的目标,开始了紧急特训。
寒假期间,每天晚上从七八点卷到凌晨三四点以后,最后终于在开学的前两天整出了一个稍微能看能聊的 项目 。开学后,带着焦虑从早到晚背了两三周的 八股文(速成还是稍微取巧了,不可取啊不 ...