[UE]夺旗模式框架
夺旗模式框架
描述
夺旗模式:
场景里会按照一定的规则刷新出不同类型的旗帜(不同类型的旗帜有不同的得分、血量、表现等);
玩家会被分成若干个队伍,抢夺刷新出来的旗帜,将旗帜带到自己队伍目标点进行销毁,则可以获得分数;
玩家持有旗帜时,旗帜可能会掉落或被抢夺:被其它玩家撞击到则旗帜被抢夺到其它玩家身上;旗帜的血量归零则会掉落回场景;
有正式赛与加时赛两种类型的比赛,首先会开启正式赛;对于正式赛,率先达到目标分的队伍获胜;如果平局则开启加时赛,否则进行结算;对于加时赛,率先得分的队伍获胜,如果平局则以两队平局进行结算;
要点总结:
旗帜实体:旗帜本身有自己的类型、得分、血量;
旗帜刷新:场景内根据一定规则(倒计时刷新、旗子上缴)会刷出不同类型旗帜;
旗帜传递:玩家可以拾取场景里的旗帜、相互抢夺旗帜、掉落旗帜(持有旗帜血量归零)、将旗帜送给终点得分等;玩家可以组队,共享队伍得分;同队伍之间的玩家可以传递旗帜;
单局流程:所有玩家就绪分队后,传送到起始点准备开赛;如果一局比赛平分,一定条件下可以触发下一场比赛继续;
模式基础
单局流程
首先,一个完整的夺旗赛,由若干个子比赛构成,子比赛 ...
[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 : FGameplaySubSystemCollection~UTeamCommonSubSystemBase~
Teams : TMap~uint64|UTeamBase*~
TeamSyncDatas : TArray~UTeamSyncDataBase*~
CreateTeam(TeamID)
...
[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 工作室 给了我实习的机会。
或许运气占 ...