声明:
1.推荐给原型程序和需要高效实现东西的人,比如毕业设计,或者体量不是特别巨大的游戏,有很高职业追求的程序员绕道。
2.这里需要使用游戏引擎开发(自己从零做你倒是真的需要个架构...)
一、框架的陷阱
偶然得知友人在大公司做实验性小游戏(TMD好羡慕这种工作,但是他们要996...淦)。然后同事给搞了个MMO框架过来:“这就是我搞来的尚方宝剑!”
当然去使用这个框架给他带来了巨大的困难,需要从头开始理解一些比较“高级”的代码。
当然这个学习的过程能学到不少东西,但是对于这位策划老兄也倒是有点“技大压身”了。(除非你改行做程序,不然大概下辈子才能再用到)
突然觉得,我这个写的一手绿皮代码的人,有必要给大家说说绿皮代码的好处了。
因为所谓的好游戏的好框架,好代码,是为解决一个问题反复优化过的
而游戏的游戏需要对一个新玩法进行反复的修改打磨,当然代码依然可以写的更优秀,但更优秀的代码不一定能给玩家带来更优秀的体验,也可能在追求优秀代码的路上浪费很多时间。
有机制革新的好游戏代码,一开始很可能是绿皮,一是因为它超越了现有框架,二当然是因为还没整理...... ——某位不知名的开发者 狗头
PS:对于独立开发来说,你的需求是可以相对自由改变的,这就意味着,你或许可以调整带来代码难题的那个设计。
游戏如此难做,引无数英雄写绿皮。
惜侠盗猎车,加载循环;
我的世界,社区重构。
EA传说,太吾绘卷,只识if、else、for循环。
俱往矣,数绿皮代码,还看今朝。
写代码就只是if、else和for循环而已
你可能嗤之以鼻,但是这句话出自传奇程序员,3D图形渲染的先驱者!
约翰·卡马克
的小儿子。
Coding is basically just ifs and for loops. ——约翰·小卡马克
二、什么人,什么项目应该写绿皮
小明大学毕业之前开发过一个DEMO,那还是2017年,意气风发准备承载前辈衣钵一毕业就搞一个大事情。
还记得那时一款开放世界废土、驾驶可以改装的载具、在危机四伏的荒野击败强敌、运送重要货物、建设避难所的游戏。
为了让宏伟蓝图有坚实基础,他大四下学期重构了一遍代码......然后......然后他发现游戏越写越看不懂,参加工作,全剧终。
这里总结一下这个悲剧的几个问题:
- 当事人很菜
- 当事人想做的项目超出自己的能力
- 当事人找了一个框架想实现代码阶级越迁
如果解决了任何一个问题:
- 当事人很强,什么鸡儿框架直接魔改
- 当事人做了个鹌鹑蛋大的项目,还没用上框架已经写完了
- 当事人认真的学习研究自己的游戏,自己写出了绿皮但是能跑的代码,开发出一代神作
解决 1 是梦想
解决 2...人还是得有点追求
解决 3 的话,只要你肯把自己的时间奉献给游戏开发,大概率能做到
每个人都能写五分钟绿皮代码 ——纸飞机维修工
三、绿皮火车也是火车,有引擎,也有轮子
(以下基于Unity)
可以没有宏伟框架,但需要有一些基础
我们就称之为,“担架”吧。
“担架”就是在一个叫 Manager 的物体上挂一堆 XXXManager管理所有事情
这个很愣的做法我认为其实非常好使。(单例模式什么的都闪一边去,能不用就不用)
这样好处是你的脚本之间可以自由互相调用,性能可以有需要再优化,大部分情况都没什么问题,时代变了,现在低端机都很强
有时候判断碰撞和判断射线什么的需要在游戏场景中的很多物体上挂脚本,最好把这些物体都在某个Manager里批量管理。
尽量不要在物体上挂脚本,因为多了很难控制。
如果必须在物体上挂脚本,你最好确保在未来任何时候,你都知道这里有一个脚本。(所以如果项目很简单倒是无所谓)
如果你的游戏需要线性逻辑
人习惯用时间顺序思考事物,而 Update方法 其实破坏了这一点,计算机是每帧刷新的,这不是人类的思考方式,Update 应该只用来监测需要即时触发的东西,比如按钮输入事件等。
我们可以用协程来写线性逻辑(协同程序的代码可以按照时间顺序进行,A发生完了再发生B)
具体用法建议从简单的文档开始,那些大牛程序写的文档写的很细,可以先有一点概念了再看
https://docs.unity3d.com/cn/2018.4/Manual/Coroutines.html
这样你想象的游戏规则可以按照时间顺序在代码中呈现,这可以降低不必要的抽象思维
(即时触发也可以用放在协同程序中,比如等待玩家走到目标点再刷新下一阶段的怪物)
有些游戏整个流程都可以用一个协程解决 ——某节奏游戏开发者
但是注意要及时杀死会影响其他逻辑的协同程序。否则会出现“跨越时间”的BUG。比如死去的BOSS继续放大招。
(很多演出性的游戏逻辑也可以用Timeline做,不过我个人觉得用好Timeline学习成本高于用好协同程序,除非包含大量混合游戏机制的演出,不然还是不要在Timeline里加入代码控制)
非线性逻辑
我以前懒到找状态机插件,后来发现直接用Animator当状态机还挺好用,里面可以直接创建代码......我开发了好几年才发现......
用法可以参考这个视频,B站没找到,去油管看吧,毕竟科学上网也是很重要的开发技能
四、造绿皮火车也是个工程
整洁代码CleanCode
读《代码整洁之道》或者直接简单看这个视频,没有整洁代码,我可能这辈子都开发不了比Gamejam游戏完整的游戏
使用git
任何人都会犯错,习惯使用git让你罪不至死
建议直接 githubDesktop+gitHub 界面简洁,菜鸡优选
插件
如果实在觉得自己驾驭不了或者觉得浪费时间造轮子的功能,就可以直接爽爽使用一些插件或者现成的代码。
选大部分都是好评的,卖了很多年的,网上能解答很多问题,可能这个插件也有专有社区。
有的好插件其实很复杂,可以评论区看看这些插件的使用者都拿它干啥,和你有没有相似性。
我自己用的一些插件(开一个项目直接往里一扔):
1.对象池插件:LeanPool
你可以用把音频播放都扔到对象池里,播放一个音频出一个音源物体,都调用一个AudioManager.Play()
2.Dotween 不止可以做淡入淡出动画,用Dotween.To来处理一些数值过渡也是很好的
3.对话插件我目前没找到小而美的,我目前用比较重型的 DialogueSystem,这玩意可以顺带当本地化插件用,但是体量比较大,很多时候需要在他的社区里找解决方案。
最后
祝绿皮开发者们也能做出好游戏~
一个说法是天赋异禀的人不用任何架构降低难度也能凭借超强的记忆力和推理能力来管理大量的 if else代码,在实验室做科学计算相关的尤其常见。。。
@mnikn:嗯,汇编语言这类天然就是为这种人准备。不过现在的抽象语言一般人只要书写有条理也能写好绿皮。
标题问了什么是绿皮代码,整个文章却没说什么是绿皮代码,说啥呢
@Nova-Q2imbx:嗯,的确说的不明确,其实就是小卡马克的话啊😂,就是只会基本语法直接硬写出来的代码。
@Nova-Q2imbx:没有代码“设计”意识的代码