从零开始的 Unity 魔法学堂

你从未见过的魔法式游戏开发学习之旅

Ratings: 5.00 / 5.00




Description

制作这套教程的初衷,是想以一种有趣而独特的形式(或者说一套以比喻构成的外壳),来代替常规编程学习中令新手们困惑的专业概念和名词,以达到降低学习难度、提高学习兴趣的目的。


很高兴课程得到了很多朋友的肯定和支持,但在制作、发布的过程中,也有一些小伙伴表示,这套以魔法概念构成的比喻,反而给自己的学习带来了一些困扰(这样的困扰主要集中在有一些基础的小伙伴身上),如果你在学习过程中也产生了这样的困惑,非常抱歉,我很希望可以帮助大家,你可以加入课程的交流群中随时提问,我会一一解答你的困惑。


出于提高学习效率的目的(这也是课程制作的初衷),我在课程进度过半时,补充了这篇序言,这篇文章不会涉及任何魔法比喻,而是以通俗的语言和例子,讲解编程的基本思想,乃至Unity开发的一些思想,希望能消除理解障碍,帮助你更好地接受课程的概念,再次对产生困惑的朋友们表示歉意。


程序是什么?


程序是对数据进行加工处理的一组操作,计算机专业的同学可能更熟悉这种表述:程序 = 算法 + 数据结构,很凝练,但可能不太好懂。


就拿计算器软件来说,“数据”便是用户输入的数字,以及用户选择的加减乘除等运算符,“加工处理”则是用户按下等于号后,程序内根据数字、运算符,进行的一系列计算,最终计算得到的结果会显示给用户。


这个例子比较极端,因为计算器就是做数据处理的软件,现在来看看你可能更熟悉的聊天软件,“数据”除了用户输入的文本内容,还有存储在设备上的通讯录(当然就通讯录模块来说,联系人也是由用户输入的数据),“加工处理”则是按下发送按钮后,联系人和内容被打包发送给服务器的一系列操作。


再进一步,对于一个角色扮演游戏来说,角色的信息、用户的操作、场景的物件,都是“数据”,而角色和场景中其他角色的交互、角色的成长、装备的获取和升级等等数据的变化,则都属于数据的“加工处理”,只是对于游戏这种大规模的程序来说,数据和加工要远远比计算器复杂,因此要将数据进行分类整理,组成比单个数字更结构化的数据,这也是“数据结构”和“面向对象”解决的问题。


稍微够点规模的程序,必然要拆分成多个模块,各司其职,比如聊天软件的数据收发模块,通讯录模块,文本编辑界面模块等等。这样做有很多好处,比如在开发各个模块时,只需要考虑当前模块如何将接收到的数据处理成符合要求的结果,而不用考虑别的模块怎么运作,当一个模块出现BUG时,也只需要专心修复这个模块,另外这些模块也可以从程序中提取出来,放进别的有相同需求的程序里,就像搭积木一样,比如聊天软件的文本编辑模块也可以放在备忘录软件里。


游戏引擎是什么?


如果把各种游戏比作一个个积木搭建的大厦,想想看,其实很多游戏的“积木”都是一样或者非常类似的,比如模型、贴图渲染,音频播放,物理系统等等,游戏开发者当然没必要每次开发新游戏时,都把这些模块重新开发一遍,就像造汽车没必要重新造轮胎,直接采购现成的就好啦(这也是程序员常说的“造轮子”的出处)。


游戏引擎就是一个样式齐全、整理有序的积木套装,除了现成的积木块儿,还提供了扳手锤子锯子螺丝刀,供你DIY积木块。


严谨一些说,游戏引擎提供了各种常用模块的代码库,可以让你在自己的代码中调用,此外还提供了一套人性化的操作界面,让你可以靠点击鼠标的方式完成很多传统软件行业靠写代码才能完成的工作,这也是为什么一些简单的游戏可以不写代码就做出来。


根据游戏引擎的设计,一个游戏被分成一个个场景,每个场景又包含很多物体,不同物体上挂载着不同的组件,而组件则可以执行不同的功能。游戏开发者可以使用引擎提供的组件,也可以自己写代码,并作为组件挂载在物体上。


面向对象是什么?


模块既然是各司其职的,那就可能会存储数据,并提供一系列与当前模块和数据相关的操作。但模块这个词可能会让你联想到手表里的零件:各有各的功能,各不相同,不过实际情况稍有不同,虽然很多模块确实是各不相同的,但也有很多模块是可重复的。


还是以角色扮演游戏为例,如果程序中有一个“角色模块”,那么这个模块应当存储着角色的姓名、等级、人物模型、装备列表等等信息,并提供诸如“走路”、“攻击”、“死亡”之类的操作,玩家、怪物、NPC都应当具备这样的模块,但你不必为每个角色都写一套角色模块,只需写一个模版,然后用模版来创建一个个实际的模块即可。


当各个角色都有了角色模块,那么想要知道某个角色的信息,或者对它进行什么操作,只需要拿到它身上的角色模块,然后“按下上面的按钮”就好啦!


这种思想就是面向对象,当然面向对象的思想还包含着一些别的东西,你将在之后深入学习。所谓“模块”就是“对象”,而模块的“模版”被称作“类”,类中规定了对象可以存储什么数据,执行什么操作。


场景中物体上挂载的各种组件,其实就是一个个对象,但反过来,对象不一定是组件,组件只是引擎为了方便开发者使用,所提供的一种特殊的对象存在形式。


类里有什么?


类规定了对象可以存储什么数据,以及可以执行什么操作,数据存储在“变量”里,而操作存储在“方法”里,无论是变量还是方法,都称作类的“成员”,类里主要的东西就是变量和方法,一旦定义完成,你就可以通过类创建对象,然后通过对象存取数据,或者调用方法来执行操作(也就是按按钮)。


方法


方法的本质就是处理数据的一组操作,你可以把它想象成一个超小型的程序(实际上某些方法完全可以比肩早期的计算机程序),方法规定了自己可以接收什么类型的输入(即方法的参数),以及输出什么类型的结果,方法内部就是具体的执行语句。


执行语句可以是变量之间的运算,比如两个数的加法,也可以是其他方法的调用,比如执行某个“玩家对象”的“死亡”方法,或者其他一些可执行语句,为了提高效率,可以通过“控制流”来改变语句的执行流程。


控制流


执行语句一行一行执行,就叫做顺序执行;按照某个条件,满足则执行,不满足则执行别的或者不执行,这种方式就叫做条件分支;如果满足某个条件则一直执行某些语句,直到不满足为止,这种方式叫做循环。顺序、条件分支、循环,是各种编程语言都会具备的控制流,也许你在高中的数学课上也学过这些概念(程序流程图)。


变量


变量是用来存数据的,数据都有什么呢?简单来说,有数字、文字、布尔逻辑(真或假)等等,复杂的话,还可以存不同的对象,因此变量在定义时,也要规定它的类型,之后就可以根据类型存入数字、文字或某种对象。


总结


场景 -> 物体 -> 类与对象/组件 -> 方法 -> 控制流 -> 变量,我们从顶到底、从主干到末梢,简单梳理了游戏编程的大概思路,希望能帮助你建立基本的知识体系认知,并在之后的学习过程中,可以将具体的知识填充到对应的骨架上。


祝你学习顺利,早日实现自己的梦想,再次感谢你的支持!

What You Will Learn!

  • 了解 Unity 游戏引擎的基本概念
  • 掌握 C# 编程语言的基本使用
  • 掌握 Unity 引擎的基本使用
  • 独立制作小型案例

Who Should Attend!

  • 适合对游戏开发感兴趣,却苦于枯燥乏味的编程概念难以学习的小伙伴