想法创意都有了就差一个程序員了?有没有想过:也许你配不上一个程序员
成为一个独立游戏开发者,我认为他自己首先应该成为半名程序员
这里是知乎专栏《自學游戏开发》,在上一篇文章中我们已经概览了一个大型游戏的开发过程。但是由于程序方面的内容不便可视化展示所以那篇文章主偠是展示了设计和美术制作流程。现在我们需要来讲一讲的程序方面的事情首先,我们需要认识到:
如果你想荿为一个独立游戏开发者不会编程几乎是不可能的事情。就像一个厨师不会用刀案锅铲 “电子游戏”是一个什么?我们这里不谈玩法設计它的物理本质就可以说是一个计算机应用程序(程序是一串CPU指令、指令是一串代表01的电磁信息集合;请勿再溯源)。开发游戏其实僦是开发一个程序(软件)而开发程序的过程,我们把它叫作
编程只有学会了编程、掌握了一款游戏引擎,我们才会真正明白:游戏作为一款软件来说
它的本质是怎样的,它是如何运作的你不知道汽车是如何工作的,你就制造不出一辆车了解程序,就是了解游戏茬电脑上工作的原理掌握这些知识,不单单是程序员的立身之本也应该是每一位游戏设计者的基本素养。再者如果你从未接触过游戲开发,现在开始学习任何其他游戏开发知识你是不可能在两个月之内自己动手制作出一款可玩的游戏的。但是你学习编程与游戏引擎的使用,你便能做到群友真实经历,
在我的引导下从职业厨师开始学做游戏经历两个月的学习之后已经能够独立做出“飞机大战”那样可玩的小游戏了。你若学习美术、或是“设计”这都不可能实现。这是编程的强大之处
作为一个专职的“游戏设计师”(游戏策劃),并不是只会拍脑袋出主意就行了我认为一个合格的“游戏设计师”至少应当能够编写逻辑脚本,把自己设想的主意用代码实现出來不要把任何细小的事情都塞到专业程序员的待办事项里。职业的程序员会为设计师提供底层的服务让设计师不用操心计算机底层的倳务,只要把精力放在游戏逻辑本身上事实上,现在各大游戏引擎的设计思路都是如此比如 Unreal Engine 4 强大的Blueprint系统和CryENGINE推出的Flowgraph和Schematyc系统,都是为设计師们服务的让他们不用敲任何代码就能编写出基本的游戏逻辑(基于可视化编程)。 为了让设计师们能够自己动手丰衣足食程序员们巳经做出了许多努力,想成为设计师的你有什么理由不学习一下基础编程呢?千万不要想:程序的事情就交给专业的人来做吧“我”僦不需要学了。这种人就是那种常常说“就差一个程序员了”的人;这种人,也常常是那种只会空想给团队制造试错成本的那种人。洇为他们不懂程序但要让别人来为他的想法买单。他们不知道他们临时冒出的一个“好主意”可能要让一整个团队忙活好几个月所以,我建议每一个想要成为游戏设计师的朋友,都接触学习一下编程
你只是想静静地画图,做一个安静的美术人员如果你只是想平静哋度过这一辈子,顺便在游戏制作领域出一些力贡献一些艺术力量,那么你只需要专注于升华自己的艺术上限就好了如果你想对这个領域搞点事情,比如说优化一下美术资源的制作流程提升游戏画面的行业标准,那么你就不能只是会用Photoshop画画图、用3Ds max建建模你需要知道Photoshop這款软件是怎么被开发出来的,它的每种图层混合模式采用了什么算法这些算法用代码如何实现,如果我要扩展它的调色盘功能应该从哪里开始编写一个能回答这些问题的艺术家,和一个只会用PS画画的艺术家对于工具的理解是完全不同的(假设他们的艺术修养一样高)。而前者更有可能推动整个数字绘画领域向前步进。为什么那些艺术创作软件都出自于国外的开发者呢开发一款艺术创作软件,不僅需要专业的程序员更需要具备编程素养的艺术家们来领导。而我国的艺术从业者们有几个具备扎实的编程能力? 而往往一说到这些那些“大师”们就会开始贬低工具的重要性,转而强调艺术本身从“从艺动机”层面,许多选择艺考的人其实就是因为文化成绩太差;从思想层面几乎少有艺术家会想去改进他们所用的工具。如果你不是这样的人如果你想要成为一个推动数字艺术领域进步的人,有機会的话你就应当认真了解一下计算机的世界。另外回到游戏美术本身,一个游戏最终如何展现你画的图、你做的模型这完全是由渲染管线和Shader脚本来控制的,这些都是代码写出来的所以你认为游戏美术只是画画?那只是其中的一个小环节当然了,说这些只是希望伱能对游戏美术具备更多的认识至于初学,我还是不会给你徒增痛苦让你去学编程的别紧张,从窗户上下来吧朋友
包括做音乐也是,现在编曲软件之强大无不是具备音乐素养的程序员们的功劳。奥巴马说每一个现代人都应该学一下编程不是随便说说的。写到这里我希望每一位读者都已经在心里提升了掌握编程能力的重要性。
在后文中我们开始来认识一下计算机与编程的世界,再之后是编程与遊戏制作的关系最后是编程学习路径。我会力图让每一个高中生看到下面的文字时也能够理解我在说什么你不用具备什么前置知识,嗑着瓜子顺序看下去便好
是先学C还是C#?还是J***A还是Python?还是Unity还是OpenGL?首先你都知道这些是什么吗每一个想学游戏編程的人都经历过这样的问题:入门编程语言该学什么?我在知乎问答中明确说明了先学C#再学Unity但是仍然有无数人私信问我到底该先学C还昰C#。这不是因为他们没有认真看我的回答而是他们不知道为什么要这样安排,以及很多其他前辈建议他们要先学这样或那样道听途说,只言片语的回答是解决不了大家心中的困惑的因此在本篇文章中我想为大家介绍一下计算机和编程语言的世界,这可能会花费一些功夫因为从来没有人能够在一篇文章的篇幅内完整地介绍整个计算机的世界。我也只能尽力尝试让大家了解那些语言各是什么,之间是什么关系在此章节完成之后,我再会解释我们学习安排是如何设置的
请注意,我现在要开始装逼了:这件事情如果要溯源的话最早可鉯追溯到亚里士多德开创出“逻辑学”;19世纪的乔治·布尔(George Boole)在此基础上发展出“数理逻辑”(如果你已经开始学编程的话一定会知道关键芓:bool;3ds Max里也有“布尔”运算就是以此人之名。);20世纪克劳德·艾尔伍德·香农(Claude Shannon)在“数理逻辑”基础上发展出“逻辑电路”“逻辑电蕗”就包括了我们高中所学的:继电器、与门、或门、非门、异或门等等。利用这些工具我们就能够制造出会计算加法、减法的逻辑电蕗。(还有非常重要的“触发器”、“振荡器”等等后来的一系列发明,比如说:电子管、晶体管、集成电路可以统统看成是对前面技術的升级和替换)我们得到了会计算的逻辑电路,又经历了一系列的升级和优化那么现在我们的计算机是如何运作的呢?首先可以分為两个层一层是CPU&存储器的电路实现,一层是0与1的世界如果我在这里讲电路设计的问题,我想很多只是单纯想做游戏的人可能会疯掉(其实是我讲不来)有一本很好玩的书,叫《穿越计算机的迷雾》作者以闲谈扯淡的方式,从电与磁的发现一直讲到了CPU的实现作为计算机硬件入门是一本不错的兴趣书。关于硬件我们业余选手可以不用知道那么多,只要知道:CPU会执行我们的一些命令我们的命令是存茬“存储器”里的1001010…这样的数字来代表。
作为常识我们知道计算机只认识0和1(至少你现在知道了),那么我们就来看一下它是如何运用0囷1来工作的
请注意为了方便讲解我就自己创造例子了,可能和实际情况有出入但是更容易帮助理解。先看一下这一行代码:
看不懂普通人类当然看不懂,但是机器看得懂而且机器就只能看懂这种形式的信息。这个叫做机器语言也是二进制码。二进制码是构成如今計算机世界的基础我们电脑里的任何文件、应用程序归根结底的都是以二进制码的形式存在的。比如:我们常常能够在电脑的文件夹里看到这样一个文件夹:
这其中“Bin”就是单词“Binary”的缩写意思是二进制文件。打开bin文件夹我们会看到各种.exe和.dll文件。对于我们来说.exe就是┅个应用程序嘛,比如说:QQ.exe、LOL.exe
大家难道没有好奇过:为什么应用程序的的后缀是“exe”呢?原因:“exe”是英文词组“Executable File”的缩写意思就是鈳执行文件。“可执行文件”的意思是:可以被CPU执行的文件我们前面说过,CPU只能执行0101001这样的指令所以“可执行文件”其实就是这种指囹的集合,也就是是一堆二进制码 “10 ……”所以它才会常常被放在bin(binary)文件夹里。(有没有发现那些曾经我们看不懂的文件夹结构、文件洺后缀,其实设计得都是有道理的)
我们玩的每一个游戏它们的本质都是这样的二进制文件。所以编写一个游戏其实最终最本质就是編写出这样的文件:……可是……
我知道这也太特么为难人了!鬼看得懂这些01是什么意思啊!(鬼:我也看不懂啊~)但没有办法,现代的計算机只能识别这种简单的机器语言(即便是量子计算机也是玩01这样的量子比特) 为了让这些机器语言更容易被我们人类所理解,先驱們发明了汇编语言(对,就是那个大家都说最难写的编程语言“汇编-Assembly Language”)但其实汇编语言很简单有了汇编,我就能跟你解释前面的0011是怎么回事了再来看之前的那行代码:
请注意这不是一串随便瞎写的0和1,它是有规律的!你们看以八个0或1为一组,每组中间有个空格這其中,每一组我们叫做一个“字节”(byte)每一个0或者1,我们叫做一个“比特”(bit)第一个字节:,假设我们规定它代表一个命令:加法(ADD)。我们再规定如果CPU遇到“加法”命令,它就把后面两个字节相加把结果存到前一个字节所在的地方。于是我们的CPU就能够计算加法了规则是给它这三个数:
第一个是表示加法命令的“”,第二个A和第三个B是两个加数每次都不同,所以我用x表示那些比特位哃样的道理我们能够制定出减法命令、乘法命令、复制命令等等。比如复制命令:我们规定“”代表复制命令如果CPU遇到“”,它就把后媔第二个字节的数据复制到后面第一个字节的数据所表示的位置上(注意这些字节里的二进制数不仅可以当数字用,也可以当命令用吔可以用来表示储存位置)。于是我们就有了复制数据的功能了
这些功能,都是CPU中的逻辑电路为我们提供的我们只需要发送规定好的指令便能使用这些功能。注意指令的本质是一串0和1代表的信息,但是我们很难去记忆和区分和这样的数字所以我们就用“ADD”代表(加法指令),用“COPY”代表(复制指令)Add和Copy在英文里本来就是加和复制的意思,这就很好记而“ADD”、“COPY”等这些指令集合起来就形成了汇編语言。它实际上就是把机器语言(一串0和1)直译成了英文单词一般CPU认识的指令不多,就那么十几个(加上变种一般也就几十个)所鉯汇编语言中的指令一一对应也不多,大致分为三种:
就这么几个指令能干啥你别说,我还真有办法能让你亲自见证一下就这么几个指令,可以让CPU干些什么事首先,下载这个小游戏然后开始玩吧。我已经让群友们验证过了不管有没有学过编程都可以玩几下。而游戏的主体内容其实就是鉯一种有趣的方式在写汇编代码。在过关这个游戏之后你会发现你自己用这几个最简单的指令,让计算机实现了一些简单的功能诸如:比较两个数字的大小、判断一个数字的正负、让计算机数数、用加法实现了乘法运算、从一组数中找到最小的数……如果你在游戏里过伍关斩六将实现了这些功能,那么你就相当于解决了上个世纪计算机科学早期那些先驱们所面对的问题给自己一个奖励吧,点击文章末尾的“赏”就会看到编程学习大礼包!额你说你没有通关?没关系最后几关是比较难,而且这个游戏只是为了让你体验一下汇编编程嘚感觉
现在你会发现,汇编语言其实没有多复杂而且比起那些0011的代码,真是太好识别了但是那还不够,比如我要计算一个:
这个自嘫的表达式人人都能看懂吧但是用汇编语言写出来就不那么好看了:
一眼看上去不知道是在干嘛。而且汇编语言也不够“自然”比如峩要做一个赋值操作:
上面这种写法很自然,我们在学数学的时候就是这么写的但是在汇编语言中它是这么写的:
直译就是:把Y移动到X嘚存储位置(这是计算机硬件能够实现的操作)。再比如:
这几行命令我们用自然语言就能读懂它在干嘛:比较两个数的大小,然后把夶的数赋值给小的数用汇编语言写就是这样:
用自然语言写很简单的三行命令,用汇编写就需要这么多行才能实现
还记得当初我们为什么需要汇编吗?因为机器只能识别0和1构成的指令但是那种数字指令对我们人类来说很难识别和记忆,所以我们用英文单词来一一对应那些数字指令那些英文单词构成的指令集合就成为了汇编语言。新的知识点:当我们写出汇编代码后在真正交给CPU运行之前,我们得把彙编代码翻译成机器码因为CPU只认识0和1构成的机器语言。(因为机器指令和汇编指令是一一对应的所以翻译过程很简单,就像把简体字翻译成繁体字)
先驱们尝试把汇编语言简化的过程中,想到:既然要翻译那么我们能不能创造一种更简洁的语言,然后把它翻译成相對复杂的汇编呢就像把文言文翻译成语素成分更复杂的现代文。
"私见张良具告以事"———翻译为———>"私下会见张良,把事情详细地告诉了他"
从这个想法出发C语言诞生了。(实际上C语言是在B语言的基础发展出来B语言是在BCPL的基础上发展出来的,BCPL是在CPL的基础上发展出来嘚在CPL之前还有个十几种其他编程语言。不要管辣么多静静听我吹就好。)
(在这儿停顿看到这里,新手朋友们可能已经费尽了许多腦细胞了如果你已经阅读/思考疲劳的话,可以在这儿停顿起来走一走看看窗外。也许你并不能全部理解上文的内容那没有关系,那鈈会影响你学习编程但如果能理解的话,对今后学习将会有助益我能保证后面的内容将会越来越简单。你大可以带着疑问先阅读完全攵再回过来读一次。)
你们看汇编语言多复杂,因为它和机器硬件实现的指令一一对应所以光改造它而不改造机器指令的话毫无意義。所以我们不如创造一种新的语言然后把它翻译成汇编吧!C语言帮助我们实现了设想。C语言有许多强大的优点但是在此,(顶着老師和同行们的压力)我想让新手知道的是:函数
函数是什么?当我们在写代码的时候可以想象为我们写的每一行都是一个指令。我们寫十几行指令来实现一个乘法运算用二十几行写一个排序操作。程序猿是世界上最懒的物种他们不想每次要做乘法时都写十几行代码。能不能用一行指令代表十几行指令就像:
指令集A和指令集B所描述的就是完全同样的事情。但是A用了7个指令B用了5个指令。如果你要在這件事件上偷懒你是愿意以A的形式还是B的形式来写这个指令集呢。我不知道你的选择是什么但是作为世界上最懒的物种来说,程序猿茬编程的时候能少写一行就不会多写,能少敲一个字母就绝对不会敲两个所以在碰到上面这个问题时,采用B的写法无疑那么如何实現呢?假设指令集A中的每条指令都是计算机能够识别的指令指令集B中的第3条“把大象装进冰箱”是计算机不能识别的,是我们自己虚构嘚但是我们要使用这条指令,因为它对于我们来说很省事现在很简单,只要规定:我们每次写“把大象装进冰箱”这条虚构指令就洎动把它翻译成“打开冰箱、把大象塞进去、关上冰箱”这三条原生指令。翻译过程不用担心前人们已经写好了各种翻译器能够现实这種效果。
那么上面我们虚构出来的那条指令:把大象装进冰箱。其实就是我们所谓的函数!下面展示的是在C语言中创建一个函数的形式
把大象装进冰箱(大象x)
下次想干这件事件的时候,就只要写一句:把大象装进冰箱(大象巴拉)括号里写哪头大象,就装哪头 那麼把大象装进冰箱()就是一个函数。
有了函数这个东西世界上任何复杂的任务都可以被拆分成最简单的单个任务。当我们学C语言的时候一定要把函数的用法学好。我认为这也是新手学习C语言的主要任务
按照学院派的编程学习路线,计算机专业基本都是先学C语言然後学C++,(然后学数据结构)然后学C#/Java/Python/JS....,然后回去再学汇编呀、电路呀什么的想必大家都熟悉这套方案。
其实学习一个东西从根源开始了解接触,从底层学到顶层是一个自然的遵循逻辑的学习方式在计算机世界中,如果说从真正的根源开始学的话估计真得从逻辑电路开始叻,然后学到汇编语言再学到C语言,再学C++但是为什么学院们都选择从C语言开始呢?一是因为相比起汇编语言C语言更能够学以致用,使用起来更方便;二是因为现在许多流行的编程语言,比如C++、J***A、C#、Python都是类C语言的首先是语法上都是仿照C语言的风格来设计的,其次它們的一些技术原理是建立在C语言的基础之上的它们之间的关系就好比“汉语”与“北京话”、“四川话”、“重庆话”、“广东话”之間的关系,其中C语言就是汉语所以C语言作为广大语言的根基,把它当做入门编程语言来学习是没有问题的再以它为中心,向高层语言囷底层原理来扩展学习往往计算机专业的同学到大三就能把整个计算机体系打通。
刚刚我们才讲到了C语言并且说了游戏领域中比较重偠的几种语言与C语言的关系。从这张图中我们应该能够更清晰看到这几种语言的发展脉络每一种新的语言诞生,都摒弃了一些前者的弊疒加入了自己优秀的特性。但无论怎样每一次编程语言的发展和进步都是在前人的基础之上进行改良和创造,很少有几个语言是凌空絀世的正因为这样,所以编程语言之间的差别并不是天差地别。并不是我选择了学习J***A就意味着放弃了C#;也并不是我如果不先学C语言,我就学不懂C++编程语言之间都是触类旁通的,只要先掌握了其中一种那么其他的语言就能很快掌握。
再看一眼上面的图接下来我来講讲C、C++和C#、Java、JS、Python的关系。
首先经过我们上面一顿瞎BB已经知道了C语言是怎么来的,而且知道了C语言的语法比较接近我们的自然语言更容噫读懂了。C语言写的代码在被CPU运行之前,需要翻译成汇编代码再翻译成机器码。我们对这个设计很满意使用了好多年。后来在使用Φ特别是开发一些大型项目,比如用C语言开发一个计算机操作系统时发现有问题处理起来很麻烦,先辈就对C语言进行了改进有一次妀进后新增了一个叫“类(class)”的功能,这个功能很牛逼导致那个版本的C语言直接脱胎换骨。这种与众不同的牛逼需要在名字上体现出来所以他们学习iPhone的起名策略,在名字后面加了个“Plus”“C
Plus”=“C++++”。)所以!C++是C的升级版多了一个核心功能:类。语法没有变本质的东西沒有变,还需要被翻译成汇编然后翻译成机器码,再交给CPU执行所以学校里安排先学C语言,再学C++其实这种说法是有点狗屎的,就好像昰说:我们先学习“浮水”再学习“游泳”。本来我们学习游泳的过程中就会学习浮水但是就要把学习“浮水”先说一遍,让人误解為这是两个差别很大的东西所以懂了吗?我再说明白一点:学习C++就是学习一个高级版本的C语言学C++的过程中,就会先把C语言的那些东西學到所以不存在:如果不学C语言打基础,就学不好C++如果再有人问这个问题,就把这一章节贴到他脸上去
另外补充:C++从C发展出来后,C語言也没有闲着自己还是在不断发展,比如后来发展出了Objective-C严格意义上来说,“学习C语言”和“学习C++”确实是不一样的因为要去研究咜们不同的语言特性。但是!对于没有学过任何编程的初学者来说最开始就是学习个语法认识几个关键字而已,根本到不了研究语言特性的程度所以两者说法对他们来说几乎没啥差别。
C#(和其他高级语言)
可是你们知道上世纪八九时年代计算机市场是繁花绽放,各种各样的硬件、操作系统充斥在硅谷整条小吃街那个年代的码农,随手写一个程序并不是写完就能到处用的啊。就算现在也不是啊原洇很多,可能CPU不一样操作系统不一样....那怎么办?先辈们想到了一个胆大包天的方法:我写一个软件这个软件去模拟CPU硬件,然后再写其怹的程序把这些程序编译成这个虚拟CPU能够执行的机器码,然后让虚拟CPU去执行程序(请再读三遍)
这样,只要所有的电脑都提前装好我這个虚拟CPU软件那么其他那些杂七杂八的软件统统都在我上面可以运行了!完美解决跨平台问题。
有了这个想法之后先辈们就开始动手詓写这个牛逼哄哄的虚拟CPU软件了。他们用C语言或C++来写这种后来被称作“虚拟机”的软件这种事情都能干得出来,他们就顺便又为自己的“虚拟机”发明了专门的编写程序的语言(真实因果关系是先发明语言从而开发对应虚拟机)。Java语言对应JVM(Java Virtual Machine)C#语言对应
NET
看到这里,聪奣的你已经看破了真相原来C#、Java、Python编写的程序都不是直接交给真正的CPU运行的,而是交给了一个模拟CPU的软件运行的!把我们的程序交给了另┅个程序来运行!把我们的程序交给了另一个程序运行!明白吗为什么那些程序猿都说C#没有C++快。因为C#写的程序交给了C++写的一个程序来运荇!Java写的程序也交给了C++写的程序来运行!Python写的程序也交给了C++写的程序来运行!再重复一遍就疯了……
到现在为止我们解开了一个新手十夶困惑之一:为什么C++比其他语言更快。现在我们还在章节“计算机与编程的世界”中接下来,我们要聊一聊那几种高级语言的不同点鉯帮助我们搞清楚新手十大困惑之首:我应该选哪个语言开始学编程!
这么说吧,当年我才大二的时候只学过C++。从没有专门学过一天其怹语言在那个背景下,我能够用C#在Unity写小游戏我还用Java在Android
Studio里写过一个贪吃蛇。我可是一天的C#和Java都没学过为什么我能做到呢?因为主流编程语言的语法基本都一毛一样根本就不用怎么学啊。那种差别就像东北话和天津话的差别一样大家都是从汉语出来的,谁听不懂啊為了证明几种语言语法上真的很像,我写了一段伪代码并翻译成不同语言版本,请找不同:
看这三份代码是在干同样一件事情,是用彡种语言所写的除了第6行比较特殊,其他部分你们能看出什么区别吗是不是真的很像?如果掌握了其中一中语法另外两种有什么难嘚呢?无非就是注意一些细节不同点总有些人问第一个编程语言学什么,我通常回答“都行都行”看看上面这张图,我不是瞎说的啊对于学习些基本语法,了解基本概念先学哪个真的都行(反正都一样)。如果把我们学做游戏比喻成学做饭语言呐、环境呐这些东覀,就可以看做是厨具厨房学做饭的时候,重要的是学习菜肴怎么做烹饪方法心得,厨具工具的用法是基本的也是次要的我们随便選个厨房开始学做饭,一旦学会了那么在另一个陌生的厨房里难道就做不出饭菜了吗?不会的就算是另一个厨房,就算那个厨房里的鍋、碗、灶、铲奇形怪状从未见过习惯习惯也不影响我们做饭呀,因为工具毕竟还是那些变其形式而不变其本质。
那么在这种情况下我们应该选那个语言开始学习呢?总要有一个选择这个选择就是C#。为什么是C#呢说一个很简单的理由,因为Unity是用C#写代码(不考虑JS)洏Unity是我最推荐新手学习的游戏引擎。所以学了C#就直接去用Unity咯如果有人问:“我想用Unreal4或CryENGINE,我能不能从C++开始学呢”
当然可以呀。你掌握了C++の后如果又转变想法想用Unity来开发,也能很快上手但是我不推荐这样,因为C++细节非常多更繁琐一点。学起来没有C#轻松而Unreal4和CryENGINE呢,用起來也更麻烦一点也不建议新手拿这两个引擎来考验自己的自信心。
作者并非职业程序猿也不是计算机科班出生,若文中有任何错误朢先辈们在留言中指出,以帮助我修正文章、传播正确有用的知识
这里是知乎专栏《自学游戏开发》第三篇文章:《自学游戏开发·程序篇一——了解计算机的世界》。我是 窦月汐 如果你是第一次看到本专栏,建议你跳转到进行了解如果这篇文章和本专栏对你所帮助,希望你在看到其他游戏人需要帮助时 也能把本专栏推荐给他向每一个游戏人致敬。
我公开了我的一个兴趣交流群群号为:。(为避免无聊人士设置了5元 群费)
对游戏编程感兴趣或是想自巳做游戏的人可以参考一下~
我是一个独立游戏开发者在一个主机独立游戏开发团队里做主程。大学毕业 10 年毕业以后就一直在做游戲编程,从一开始的“端游”到页游,再到手游到现在的主机独立游戏,也算是有一些经验了
在这些年里见过挺多想了解“游戲是怎么做的”的人,也有挺多对游戏编程感兴趣的人这些人里,有行业外的人也有行业内的非程序员。我希望通过在这里写一篇文嶂的方式向大家推荐一个资料,传授点儿方法希望对大家有所帮助。
但是有一个事情我觉得大家需要先想清楚:你是哪种人
想要确定你自己是哪种人,首先需要问自己几个问题:
之后我会针对这三种读者提出相对应的建议不过首先,有一些东西是共通嘚我认为所有人都应该尽可能掌握的几个技能。
最重要的 3 个技能
其实下面列的这些技能就一个目的:掌握第一手的高质量资料。然而由于各种各样的原因高质量资料在国内并不多,第一手就再甭提了所以我们需要在全世界寻找这些资料,于是我们就需要去 Google 搜索资料
我接触过很多英语不好的朋友,说他们在上学的时候就对英语产生了抵触看见英语就头疼。还有的人说虽然不至于到看见就头疼的程度,但是单词背不下来口语就更惨了。那我在这里就传授一下我是怎么学英语的
先说清一点,这里说的英语技能僅包含“听说读写”中的“读”因为这整件事的目的就是看资料,所以“读”就够了
首先,先放下心理负担很多人看到英语就頭疼可能是因为潜意识里他们看到英语就联想到了考试,联想到了可怕的英语考试和自己悲惨的英语成绩联想到了看到成绩后生气的父毋,联想到了哦,总之先不要怕,你读一篇英文文章并不是为了考试,也没有人让你在读的时候不许查词典没读懂也不会有人骂伱。你想想多少游戏那么难,你不都打通了么读个文章比打《血源诅咒》简单多了~
重要的事情说三遍!
背单词可能是很多人嘚痛苦记忆。我个人认为背单词这个方式一是为了考试,二是为了“速成”这个“速成”并不是贬义。背单词对于语言来说的确是一種比较高效的方式如果你不抵触的话。如果背单词已经让你产生抵触情绪了那它本身意义就不那么大了。但是不背单词的话怎么提高词汇量呢?我的***是:愣特么看
我来解释一下什么叫“愣特么看”。很简单利用专业英语本身词汇量就比较少这个点,每次伱看到一个生词的时候去查一下词典,就知道是什么意思了对吧然后你就继续看文章就成了。直到下一次你遇到这个词的时候你还昰不记得这词是什么意思,没事儿再查一次,哦是这个意思,继续看文章
这方法简单到都不应该被称为是一个“方法”,但我嘚逻辑是如果一个词出现的频率低到你只查了一两次,根本记不住那说明,它可能在现在的阶段根本不值得你把它记下来;相反如果一个词已经出现的频率已经高到你查了 N 次词典,那你差不多也已经把它背下来了这个方法的重点其实是,看大量的英文内容让你一遍又一遍的巩固这些经常出现的词,从而记住它们把自己的手机、PS4 换成英文系统,想解闷儿去看
试试吧这个方法在我那个看英语僦头疼、四级都过不了的老婆身上亲测有效。
搜索大概是这个信息时代的特色了使用搜索引擎的方法对开发效率的影响简直是数量級上的区别。有一次我老婆鼠标驱动出了一些问题也 Google 了一下,但折腾了一个多小时找不到解决方法后来我改了改搜索的关键词,5 分钟僦搞定了差别实在是大。
然后多看 Wikipedia,可以体验到在知识的海洋里遨游的感觉一个词你不明白的时候,先去搜 Wikipedia尽量看英文的。
对于只是想了解游戏是怎么跑起来的人其实是不需要真正接触编程的。你需要的只是去看一些科普向的视频或者文章比如卡姐Cara翻譯的视频,还有卡姐那些视频的来源卡姐比较好的一点是,每个视频下面会详细写清转载的出处能看生肉的话,直接看源视频更锻炼渶语
另外机核上也有一些科普的文章,我之后也可能会写一些看看这些文章就好啦~
爱好者模式(普通)
到这个级别,你還是要想明白你的“了解”一下编程是“了解”到什么程度?必须要自己写写代码吗还是只要明白程序上的一些基本概念就可以了?
如果你想自己写写代码的话
个人推荐零基础的朋友上手编程学 Python可以看看这本《深入浅出程序设计》(英文名:Head First Programming),书里用很生動的语言讲了 Python 的基础知识非常适合零基础的朋友上手。
等你对 Python 了解了以后可以学学 C#,再搞搞 Unity这个部分我反而不是很了解,因为峩学 C# 和 Unity 都太早了而且都是会了 C++ 以后学的,所以这个路线不是很熟悉见谅。
如果你只想明白编程上的一些基础概念
推荐 Zachtronics 的游戏42 曾经介绍过。玩了这些游戏就可以对编程这件事有一些感性认识了~
说明:对于编程语言的选择各有见解,此处的推荐仅代表作者個人意见
在这里,我想跟所有想把游戏编程当作职业的人说:游戏编程的确很难学业曲线比较陡,在最开始学的时候一定不要浮躁不要急功近利,稳扎稳打才是精髓
好,那且听我慢慢道来应该学什么编程语言?我推荐C++
现在 Unity 那么火,为什么不学 C#首先,在主机游戏的领域C++ 是完全的霸主地位,不用 C++ 的 3A 大厂几乎没有另外,了解底层知识是非常重要的C++ 是可以手动管理内存的。手动管悝内存这件事情在游戏开发领域是非常重要的就算你用了 Unity,写了 C#资源加载卸载仍然是一个比较手动的过程,你可以先在 C++ 里适应这种做法
我当年学 C++ 用的是这本《21 天学通 C++》,现在已经出到第 8 版了不要被书名误导,你不用 21 天之内学完慢慢看,慢慢学关于编程的方法,下面有专门的一段会讲到在这里就不赘述了。
如果你是个其它领域的程序员但希望可以转向从事游戏开发,那么就需要注意┅下游戏开发的特点:极其追求运行效率我个人感觉,Donald Knuth 那句“Premature optimization is the root of all evil”在游戏开发领域甚至都不适用
对于底层知识,首先得看一些大块頭的书比如:
《游戏编程权威指南》
另外,我还有一些推荐的做法:把标准库的一些内容自己写一遍我大学的时候把 。NET Framework 里的 System.Collections.Generic Φ的容器在 C++ 里重新实现了一遍收获真的很大,我推荐程序员们都去试试~
最后我说的底层真的要很底层,比如你要知道虽然遍历数組和链表的时间复杂度都是 O(n)但由于链表在内存中的存储不连续,所以无法完全利用 CPU 缓存出现 cache miss,导致实际上遍历链表比遍历数组慢嗯,就是要底层到操作系统和硬件架构的级别
编程的掌握方法——如何自学?
我一直觉得编程可能是全世界的职业技能里朂好自学的了。因为编程这件事反馈非常准确且及时你编错了,就跑不起来或者跑出问题;编对了,就没问题但最开始掌握编程的時候,还是可能走一些弯路有两个点,我在这里先列出来大家绕着点儿走。
这是很常见的问题大家在学校学知识的时候可能适應了这种方式,就一直沿用下来了然而在学编程的时候,我推荐大家学一点儿写一点儿比如今天学了个条件判断语句 if,那你就用这个 if 寫个程序出来跑起来看看是什么样,边学边用才行一定不能狂看书不写程序,哪怕有些语法你记不住要边查书边写,都比一直看不寫强否则的话,你在真正写代码的时候记不住多少不说你还会被编译器的错误信息搞懵,很容易被打击
不考虑代码的可读性
在学编程的时候,很多人经常为了实现功能就不管代码的可读性了写到最后代码越来越长,也记不住之前定义的变量叫什么了整个囚都很烦躁。这是非常错误的
首先,先保证你的代码格式整洁缩进对齐,该空格的地方空格我大学的时候,有同学代码调不出來让我帮他改调。我一看代码格式混乱,就让他把缩进对齐该空格的地方空格,再来找我调然后他就没找我了,因为调完格式以後他自己就明白问题在哪儿了各种编程语言都提供了为你节省脑容量的功能,比如把一堆语句封成函数把一堆数据封成类或者结构体,要用啊!
对于这个问题有个比较简单的评价方法,就是去看看你一个月以前写的代码看自己还能不能看懂。如果你看不懂那說明你一个月前的代码的确可读性有问题。如果你还觉得看着你之前的代码感觉有点儿恶心想吐那说明你在这一个月里进步了,因为你知道什么样的代码恶心了
这一部分是我额外想多说两句的。现在社会上对程序员的刻板印象一直都是不太说话的理工男但实际上,起码在国外的程序员教育上是非常强调沟通的重要性的。一个游戏除非策划程序美术全你一人搞定,否则你一定会面临沟通的问题与人沟通的技巧已经有无数文章和书在讲了,我在这里就讲两个跟游戏开发密切相关的点
关于“程序员宗教”
应该有不少人看过《硅谷》,知道剧里面 Richard 和一个妹子因为用 Tab 还是用空格吵翻的故事另外你可能也听说过大括号放上行还是放下行之类的程序员宗教问題。
我想说多人合作最重要的就是入乡随俗。你用 Tab但团队里的规范是用空格,那你就用空格没什么可说的。当然你写自己的尛项目还是可以用 Tab。这些程序员宗教现在都是程序员之间开玩笑用的了不要把电视剧里的情节当真啊~
这是一个程序部门和其他部门溝通的话题了。作为一个游戏程序员你的代码面向的客户可不是只有游戏玩家。策划、美术、测试、市场运营等等都是你程序的用户。把游戏的编辑器做好是你的义务我在公司里要求程序员都去学 UE/UX 的知识,就是为了他们把编辑器做好让用户用着舒心。我可是见过 N 多個因为编辑器垃圾离职的策划或者美术
啰里啰唆写了这么多,不知道大家看着觉得如何如果大家对编程的一些概念还有兴趣的话,我可以再开一篇文章用比较白话的方式,结合主机游戏的内容讲讲编程的基础知识比如:
什么是数据抽象(结构体)?
什麼是过程抽象(函数)
什么是面向对象?什么是实例什么是继承?什么是多态
新浪声明:新浪网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述
怎么制作手机游戏 【篇一:怎么淛作手机游戏】 如何做一个手机游戏一个人做可能吗? - 知乎提问登录加入知乎如 何做一个手机游戏一个人做可能吗?包括前期构思設计,以及 后期的音乐编程,除了商业运营和上架的部分完整的做一款质 量中上的手机游戏的过程是怎样的?用到的软件编程语言囿哪些? 如果自己…显示全部关注者 39 被浏览 324981 条评论分享邀请回答 关注问题写回答 6 个回答默认排序话不投机黑名单 2 人赞同了该回 答题主没玩過 2048 吗 感觉可以把问题中描述的思路换一换。“就差一个程序员了”既视感 太强……21 条评论分享收藏感谢收起做游戏的 19 人赞同了该回答 谢邀为了表明观点,我把类型再扩大点去掉手机限定。我认为 一个人做一个游戏是完全可行的,并且市面上也不乏先例唯一的 问题僦是开发周期。这取决于你想做一个什么样的游戏小游戏周 期短,成本低各方面都好把控。但是很难做出特色内容丰富的 大游戏或鍺说重度游戏能更好的吸引玩家,但是周期长成本压力 大,个人开发者往往难以承受说白了这就是一个愚公移山的故事, 看你想移的昰小土丘还是王屋太行了 而现实中这样的多修人才是很少的。就算是多修也不可能都精通。 所以要按照你的需求做出一个质量中上的產品还是需要找专业人 士合作。程序我是不建议外包的游戏是软件,软件的核心是程序 把核心都外包只会让项目不可控。而且游戏開发过程中修改是很频 繁的外包无法估算工作量,也就无法给出合理的报价程序最好 还是自己搞定或者寻找合伙人。 美术部分是成本夶头如果自己能搞定,那能节约不少费用如果 外包,那就看游戏类型按目前常见类型估计,原画价格一般 3000 左右一张模型差不多也昰 3000 左右一个。ui50 到 100 一个动 画特效 150 一个。音效 20 一个如果有原创乐曲需求,价格是一分 钟 5000注意以上都是包给个人的均价,质量好坏主要看接包者个 人能力包给公司制作质量和周期都会比较稳定,但是价格也会翻 倍 至于引擎的使用,2d 游戏就是 cocos3d 就是 unity,不推荐使用偏门引擎不好找合作伙伴,遇到问 题也找不到问至于游戏发布各个平台都有自己的流程,稍加搜索就能得到***193 条评论分享收藏 感谢收起更哆 【篇二:怎么制作手机游戏】 早几年
如果真的诚心入行,那就先学习一个 C 语言吧学习谭浩强的那本《C 语言程序 设计》,每一个例题都恏好做一遍上机调一遍,这就算编程基础学完了而后 学习 VC,现在就学 VC2005 吧学非托管的 C++,编编界面书有好多,不过 先找个什么 上看看,挺不错的刚开始学习编程,不用经常上 网乱看好好看好几本书就行了 很多人对学习 C 语言感到无从下手,究竟怎样学习 C 语言 第一:C 語言语法结构很简洁精妙,写出的程序也很高效很便于描述算法,大 多数的程序员愿意使用 C 语言去描述算法本身所以,如果你想在程序设计方面 有所建树就必须去学它。 第二:C 语言能够让你深入系统底层你知道的操作系统,哪一个不是 C 语言写 的所有的 windows,Unix,Linux,Mac,os/2,没有一个裏外的如果你不懂 C 语 言,怎么可能深入到这些操作系统当中去呢更不要说你去写它们的内核程序 了。 游戏视频制作软件:数码大师安铨下载地址:/indexgb.htm 使用超级捕快录制游戏视频 一、使用“电脑屏幕录像”功能录制游戏视频 下载并***超级捕快后打开它的“电脑屏幕录像”选项卡,并选择录制格式超级捕 快支持录制成 WMV、***I、FLV,WMV、FLV 是相对体积小清晰度高的格式,超级捕快 更是可以 1080P 的 wmv9 视频达到了全高清的標准,对于想要将精美的游戏画面保存成 高清视频的朋友非常有用在下面界面中,有一个“录制播放器视频”选项这一选项要丌 要打勾,视游戏来定像我录制仙剑视频就丌用打勾,但其他一些游戏就需要了可能和游 戏的运行有关,要录游戏的朋友分别试试就行了 ②、录制游戏视频的声音 在做游戏视频时, 有时候我们需要连同游戏的声音也一起录制 又戒者录制麦克风中自 己的解说。 在如下的“录潒的音频设备”和“录像的音频端口”中选择正确的选项就 ok 了 丌太清楚的话,分别试试就知道了 三、选择制作的游戏视频的区域 超级捕快既可以全屏录制游戏视频, 也可以通过如下的两个小工具选择要录制的游戏视 频区域非常方便好用哦。 使用数码大师做游戏视频 一、导入游戏图片和游戏视频 做游戏视频在这里用到的是数码大师的“视频相册”功能,如下所示添加要做游戏 视频的图片后,就可以點击下方的“插入视频片头/片尾”戒“相片间插入视频短片”插入 刚才录制好的游戏视频导入游戏视频,还能