[UE]CommonParams解决方案
CommonParams解决方案
在实现业务框架的时候,经常需要支持传参的功能(比如 Buff 系统中,AddBuff 的时候,通常需要支持外部传入一个 BuffParams ,在内部解析出各种 Param 使用。)
这个参数需要支持基本的数据保存、同步等。
初始的想法
一个最简单的想法,是打包一个结构体,支持各种类型的传入,比如:
12345678910USTRUCT()struct Params{ UPROPERTY() uint64 uVar0; UPROPERTY() int iVar0; UPROPERTY() float fVar0;}
这样虽然很简单,同时可以通过反射来同步。
但是有一个巨大的问题,那就是在解析参数的时候,只知道 Var0 这种没有名字的抽象的概念,使用者需要记住 Var0 对应的是什么数据,很不直观。
CommonVariantParams
维护一个 CommonVariantParams,通过 TMap <FString, FVariant> ValueMap 来保存数据。
为了方便使 ...
[UE]TeamSystem框架
TeamSystem框架
基本架构
支持基本的加入、退出 队伍,以及维护队伍的基本数据(TeamID、 MemberUIDs)
提供继承扩展,维护自定义业务逻辑与队伍数据;
对于挂载组件:由 Manager 级别的 TeamManager ,与 Player 身上的 TeamComponent 组成;
以及队伍数据同步,自定义不同方式的数据同步;
classDiagram
UTeamManager..>UTeamBase
UTeamManager..>UTeamSyncDataBase
class UTeamManager {
SubSystemCollections : FGameSubSystemCollection~UTeamCommonSubSystemBase~
Teams : TMap~uint64|UTeamBase*~
TeamSyncDatas : TArray~UTeamSyncDataBase*~
CreateTeam(TeamID)
D ...
[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 ...