LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

年糕老师的ue4小课堂(第一期)

2022/3/7

在ue方面笔者完全是个萌新,糕糕前辈在我进入某大佬群时主动加了我的好友(现在想来感动的能哭出声)

在我学习ue时不吝赐教,为我提供了许多资料,语气也十分的和蔼温柔

每次遇到什么问题发消息几乎都是秒回,解答了我的许多疑惑(我哭死)

这篇博客会做成一个对话的专栏形式,会记录一些前期学习遇到的疑问

不会有固定的大纲,记录的风格是诙谐轻松的(顺利的话会一直写下去?)

最重要的是这些遇到并得到解答的问题我不希望今天获取然后明天就失忆了

这些知识对初学者应该是很有帮助的(确信),所以我很乐意记录这样一个快乐的过程


让我们有请今天的嘉宾,糕糕老师!

糕糕:大家好,我是一个工作不到两年的菜鸡(看来糕糕老师确实很谦虚呢)


第一幕 2.23

某天晚上我新建了个了第三人称模板,想找个项目做做重温一下act的感觉,在搞动画蓝图的时候有了以下一幕:

四月:那个人向哪里走就向哪里转向的,是在哪里设置的?

糕糕 :MovementComponent 还是 Character的默认属性那里忘记了

四月:我还是开中文吧,感觉用英文很多东西反应不过来

糕糕:建议是开中文语言,节点的名字和变量的名字英文

img

img

糕糕:嗯对是这样

四月:奇怪了,我在blendspace里面看都是正常的,有很多个方向的移动,连上去之后,怎么跑怎么动都是一个样子

image-20220304194659446

糕糕:白色那里选场景里的Character,这可是蓝图调试基础

四月:呜呜呜基础

糕糕:没事,我也是自学才看到这个功能的

四月:算了我把速度打印到屏幕吧,这样方便一点

四月:我草,破案了,他的速度只有正值,我是傻逼啊

糕糕:哈哈哈哈哈哈哈,这个就是做项目的好处了,能学到解决问题的思路,所以即使之后做的不是这个类型的游戏之类的也能做

四月:他这个自带模板有大病啊,怪不得要设置成自动旋转,速度怎么可能会没有负值啊,然后blendspace只做了前进的

糕糕:速度一般都是0~动画的实际速度,看设计的。


次日:

四月:完了,我是怎么说出昨天晚上那些话的,正常来说速度怎么可能有负值呢

糕糕:所以我没多想

![image-20220304200942589]image-20220304200942589.png)

四月:这样,感觉好缺编程经验,断言,调试,句柄,宏这些我都没学过,怎么恶补

糕糕:你是想刚毕业就有10年经验吗

四月:啊可是这个难道不是毕业生标配吗,我怎么感觉别人都会(事实上这个傻逼在过度焦虑)

四月:哈哈哈哈哈哈哈哈哈,你这一说我就放心了

糕糕:嗯 我的意思就是,这些其实都是在做项目过程中学的,所以没有恶补的方法

四月 :噢噢这样,之前精力基本上都在看理论,怪不得都不知道这些,实操少了


由此可见,gameplay的实操本身就是最好的学习资料


第二幕 2.25

这篇特别长但我觉得特别有营养,是经典

有天下午在图书馆看大象无形(确实是真的看不懂),看到一半回忆起当时面试被问到的问题

四月:gamemode和gamestate的区别是什么,关卡蓝图又是什么

糕糕:终于到这里了

四月:没有,还没到这里,是我在读书的时候想起了面试官问我的问题。

糕糕:这些东西都是属于Gameplay框架里的一部分,Gameplay框架的定义,它是一个“房间制多人联机回合计分对战游戏框架”,所以你做单机游戏的时候,实际上是用不到的。

四月:所以做单机游戏的时候 ,是不是我把规则写gamemode和gamestate都可以

糕糕:是这样,但是你一旦做多人游戏,这俩的网络同步状态,以目前游戏用得比较多的UE联机方式,DS服务器架构下,
一个游戏房间里拥有一个中央服务端只处理服务器逻辑不处理渲染,而所有玩家都是客户端。在这种架构下,服务端跑了一个UWorld,客户端也跑了一个UWorld,但是只有服务端的UWorld是真实的,其他所有的都是复制品。

四月:所以说客户端是对服务端的拙劣模仿,有看到这样的形容

糕糕:对的,然后 Gamemode Gamestate都是继承actor的,Gamemode仅在服务端上生成,不复制到客户端,Gamestate在所有端均生成,以服务端为准,其他为复制品

四月:噢噢原来是这样,那关卡蓝图呢

糕糕:关卡蓝图纯本地,一般不使用关卡蓝图,关卡蓝图不是Actor哦

四月:原来是这样

糕糕:Gamemode是UE的Gameplay框架的一部分,所以 Gamemode 的设置里的这些东西也是

糕糕:先不看Pawn,先看PlayerController,只在拥有的客户端上生成,服务端拥有所有客户端的 PlayerController,所以,玩家在自己的PlayerController,修改了值啊,执行了什么事件啊之类的,只有服务器知道,其他客户端是不知道的,所以又来了个PlayerState

四月:啊这

糕糕:https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Framework/

你的问题文档都有,只是“计分多人游戏框架”这件事是我自己总结的,网上没有的,你先理解了这个定义,用这个定义去理解他的框架应该会更容易些,不然容易误解某些功能233。

四月:虚幻引擎真的好难学啊

糕糕:成也Gameplay框架败也Gameplay框架,成在,你作为没有经验的,不是架构师,理解它用它,就能出游戏了;

成在,你作为没有经验的,不是架构师,理解它用它,就能出游戏了。

四月:我该怎么做呜呜呜呜

糕糕:开整!现在就用它整个多人联机fps

糕糕:Gamemode用来写当前游戏模式的服务器要执行的事件,比如LOL,假如在10分钟出大龙,这件事就是写Gamemode里的。

而游戏已经进行了10分钟,大龙已经被击杀了多少次,是在Gamestate里面。

四月:gamemode是写事件,state是记录信息条件,这样吗

糕糕:这样,大龙例子不是很好,那就红buff吧。红BUFF有个特点,你没视野的时候被打死,你不知道红BUFF没了。没错,他的生成和存在状态就是存Gamemode里的。

四月:所有野怪都这样

糕糕:因为Gamemode不在客户端同步,你可以设置只在客户端有视野的时候,Gamemode才把对应状态通过RPC发过去

四月:那gamestate还是记信息嘛,每个客户端一份,然后服务端的是真的,其他都是复制品

糕糕:嗯,gamestate记全场客户端人尽皆知的事,游戏持续时间……大逃杀的话,剩余人数。但如果是LOL的话,

玩家杀人数可以记到gamestate,但是补刀数 装备在 playerstate,可以理解吗

四月:不太理解诶,补刀数不是和杀人数战绩按理说不是一样的吗

糕糕:不一样的哦,你观察下打野英雄,不露脸不显示补刀数的,防止你知道打野英雄的发育情况了

四月:噢噢,所以补刀并不是全场客户端人尽皆知的事情,所以就并不是记录在Gametate而是在Playerstate里面。这样我就明白了


这个专栏感觉还是很生动的,打算以一星期一次的频率更新一次(前提是有提问)

这一期太长了剩下就放到下一期来吧!2022.3.7