unity基础概念

来源:互联网 发布:网络广播方案 编辑:程序博客网 时间:2024/05/21 15:11

1.变量

我们在脚本中写:

1 print(“Hello World!”);
输出的就是:Hello World!

print(3); 输出的就是:3。如果写print(5);输出的就是:5。这些信息都是确定的,但是有时候我们要显示的信息是不确定的,这时候我们就需要定义变量:

01 /*定义一个整数类型的变量count

02
03   初始化为100
04
05   */
06
07   var count:int = 100;
08
09   print(count);//此次输出结果为:100
10
11   count = 90;
12
13   print(“count = ”+count);//此次输出结果为:count = 90
14
15   count = 3*10;
16
17   print(“count= ”+count );//此次输出结果为: count = 30
18
19   count -= 10;
20
21   print(“count = ”+count); //此次输出结果为: count = 20

这段代码之中我们定义了一个变量“count ”,用来储存一个会被改动的值。var 是javascript中的一个关键字,用来定义变量。count是变量名(或叫标示符),(这个变量名是我们自己任意取的,但是注意不要和语法关键字和保留字重名,也不要用数字作为名字的开头。)。然后是一个冒号(:), int 是一个关键字(类型关键字),用来表示定义的count这个变量的数据类型是整数类型,最后不要忘了语句结束时的分号。

定义变量之后,我们就可以使用这个变量,和给变量重新赋值了。

赋值的符号 是一个等于号(=) 。count= 90; 这一句代码,是把count 这个变量中储存的值改为90;等号右边,也可以是一个表达式(如count = 3*10)。还可以用复合赋值运算符如 count-= 10; 表示count 的值等于它自身的值减去10;等价于count = count-10,而复合赋值书写更简单(还有其他一些 += 、*= 等)。

绿色的部分为注释,注释不影响代码执行逻辑,只是为了方便我们阅读代码,适当的注释,可以让代码更容易阅读和维护。“//” 可以注释一行。“/**/” 可以注释多行。

2.运算符 语句

为了实现一些算术和逻辑运算,我们要使用运算符。比如a = (b+c)*d;加减乘除,判断大于小于这些运算符的含义都和在数学公式之中一样,使用运算符时注意运算符的优先级,判断等于用的运算符时两个等号(==)注意和赋值运算符(=)区分一下,判断不等于用的符号是叹号等号( != )。由于自增1,和自减1,的运算比较常用,所以又单独的运算符简化书写。a++; 使变量a的值自增1(等价于 a += 1; 或 a = a+1;)同理有自减运算符a--;让a的值自减1;

比较运算符有大于号(>),小于号(<),等于号(==),不等于号(!=),还有大于等于(>=),小于等于(<=);

逻辑运算:与,或,非,分别用符号 &&,||,! 来表示。例如下边的伪代码:

1 if(条件1 && 条件2)
2
3   {
4
5   //执行一些操作。
6
7   }
8
9   ……//一些其他语句

其中if 是一个语法关键字,表示如果,只有当小括号中的判断条件成立的时候,才会去执行大括号中的语句,如果条件不成立则不执行大括号中的语句,直接执行大括号之后的其他语句。我们用一个与(&&)运算把两个条件连接起来,表示只有条件1和条件2 同时成立的时候,这个if的判断条件才成立。

如果我们写成if(条件1||条件2),或(||) 运算符,表示条件1或者条件2只要有一个成立,那么这个表达式就算成立。而if(!条件1),则对条件1取反,如果条件1为真(true),则取反之后为假(false),条件不成立,而如果条件1本身不成立,则取反之后条件成立。 其中条件1,条件2可以是任意比较运算符等组成的表达式(如:a>b),也可以是一些变量,只要变量的值不为0就当成一个成立的条件(true)。

上边提到if这个语句。我们要解决一个现实的问题,需要把问题转化成一步一步的运算,这些运算步骤有的需要按顺序一步一步执行,这种结构称作顺序结构,有的代码需要在满足某些条件的时候才执行,条件不同导致代码执行不同的分支,这种结构称作分支结构,还有一些代码需要反复执行,一直执行到满足某些条件才跳出循环,继续执行后续的代码。这种结构称作循环结构,面向过程的编程方式中,我们使用这三种结构的组合及嵌套,来解决所有的问题。

顺序执行的代码比较简单,一句一句执行就可以了。

if 语句是分支的一种。一个简单的if语句的例子:
1 if(HP <= 0)
2
3   {
4
5   print(“Die”);
6
7   }

if语句之后需要有一个小括号,括号中是一个判断条件,判断条件的表达式或变量的值会转换成一个布尔值,javascript中布尔值只有两个取值:真(true),假(false)。建议搜索一下布尔代数方面的知识,会让你更了解底层计算。

条件之后跟的是一个语句,语句是否执行取决于条件是否为true。如果这一个分支下有多个语句,我们就要用大括号(“{}”)括起来,组成一个语句块,建议只有一个语句的时候也保留大括号,这样让代码更容易阅读。

if 语句也可以有多个分支,伪代码如下:
01 if(条件1)
02
03   {
04
05   分支1;
06

07   }
08
09   else if(条件2)
10
11   {
12
13   分支2;
14
15   }
16
17   else
18
19   {
20
21   分支3;
22
23   }
24

其他程序语句;

当条件1满足时,只执行分支1(分支2,和分支3被跳过),然后执行后续的其他语句,如果条件1不满足,而条件2满足,则执行分支2,如果条件1和条件2都不满足则执行分支3。可以有0个或多个else if分支,可以有0个或1个else分支。

还有一种switch分支,这里不再介绍,也经常使用到,可以自己去看一下。

计算机能做的操作太底层太有限了,很多操作都要靠不断的重复一些简单的运算来实现。最简单的循环是while循环。形式如下:
1 while(判断条件)
2
3   {
4
5  循环代码
6
7   }
8

当判断条件满足(值为true),则执行循环,直到判断条件不满足或有断开语句主动跳出循环为止,如果判断条件一直满足而且没有跳出语句那这个循环将一直执行,成为一个死循环,一般情况我们会在循环体中改变一些条件,然若干次循环之后条件不再满足以终止循环。
01 var i = 0;
02
03   while(i<10)
04
05   {
06
07   print(i);
08
09   i++;
10
11   }

这段代码讲打印出 0,1,2,3,4,5,6,7,8,9这些值,注意10是不会打印的,另外注意让i每次循环递增1,如果没有这一句,条件将一直满足,变成一个死循环。

for循环是最常用的循环语句:
1 for(初始条件;判断条件;循环后动作)
2
3   {
4
5   循环代码
6
7   }
8

for循环小括号中有三个语句,由两个分号(;)分割,第一个语句是初始条件语句,只会被执行一次;第二个语句是判断条件语句,每次执行循环前都会判断一下,满足条件才会执行本次循环;第三个语句会在每次循环代码执行完之后执行,一般用于改动循环条件。这三个语句每一个都是可以省略的,全都省略也可以for( ; ; )但分号不可以省略,因为分号会被当成空语句,注意这也是有效的语句,虽然不做任何操作。在if、for、或while等关键字的小括号后边跟了分号,执行结果不会是你想要的。这是新手容易犯的一个错误,注意如果这些地方加了分号,那么只有这个空语句被当成分支或循环体去执行了。

一个典型的for循环例子如下:
1 for(var i = 0;i<10;++i)
2
3   {

4
5   print(i);
6
7

  }
输出结果也是从0到9的这10个数字。

每种循环之中都可以使用break语句结束整个循环,也可以用continue语句,跳过本次循环直接开始下一次循环。

另一种常见循环是for… in 循环,常用在数组的遍历之中。
01 var arr = [1,2,3,4,5];
02
03   for(var i in arr)
04
05   {
06
07   print(i);
08
09   }
10

这段代码输出1,2,3,4,5这几个数字,我们定义了一个长度为5的数组arr,可以把数组中的每一个元素单独的使用(如arr[0] = 10; print(arr[1]);等)注意数组的下标,写在中括号中的整数为数组的下标,下标计数从0开始计数,长度为5的这个数组arr最大有效下标为4(长度减1),使用数组的时候要注意下标的取值范围,否则很容易数组越界,这将会是一个严重的错误。

3.函数

只用前边说过的三种控制结构去解决规模比较大的问题是,代码会比较混乱,较难维护,而且有很多重复的代码需要出现很多次。这时候我们需要引入函数的概念。通常情况下,函数是完成特定功能的一段代码。把一段完成特定功能的代码块放到一起,以后使用时就可以调用这个函数,这样就省去了重复输入大量代码的麻烦。

比如定义一个求长方形面积并输出的函数。并调用它:
01 //函数定义
02
03   function RectArea(a:float,b:float):float
04
05   {
06
07   var area:float = a*b;
08
09   print(“area = ”+area);
10
11   return area;
12
13   }
14
15   var rectLen:float = 3.0f;
16
17   var rectArea:float;
18
19   rectArea = RectArea(rectLen,2.0);//函数调用
20
21   print(rectArea);
22

首先要定义一个函数,定义函数的格式:首先要用function 关键字来定义一个函数,然后RectArea 是我们自己定义的函数名,函数名可任意取,规则参照变量标示符的定义,一般定义函数时首字母大写。然后跟一对小括号,小括号中写参数,即使函数没有参数小括号也必须保留。整个函数的返回值写在小括号之后 先写一个冒号,冒号后跟函数的返回值,冒号和返回值可以省略但建议保留,这样代码容易阅读。大括号中的代码是函数体。函数要实现的逻辑计算处理都写在大括号之内。return;语句会让程序返回,可以有零个或多个return语句,但是执行到第一个return语句时,代码就会返回调用函数的地方,return语句之后的语句不会被执行到。return语句可以带返回值,也就是把某一个数值或对象当成这个函数执行的结果返回给调用的地方,上边的代码中我们把矩形的面积,当成函数的返回值,所以rectArea = RectArea(rectLen,2.0); 这一句代码,把函数的返回值赋值给了rectArea变量。

如果函数有参数,调用的时候可以把变量或具体的数字,传给函数,传参数的方式有传值和传引用等。把这些区分清楚函数的使用,主要的东西也就掌握了。简单的说区别是在于在函数内改变参数的值是否影响外部传入的那个变量。当然这一块如果之前没有了解过还是要系统的学习一下。

4.类

我们使用三种控制结构,使用函数的这些方式去解决问题的过程,还是比较贴近计算机的运算和处理方式。现实世界中我们认识世界和处理问题时,还是习惯把物体当成一个整体。我们模拟一个虚拟世界时,如果用一条主线去解决所有问题,我们既要考虑把虚拟世界中的钟表向前推动一毫秒,又要计算世界中汽车的运动轨迹,还要同时考虑用户的输入和网络信息的收发等等会让我们的代码非常难理解和维护,如果因为其中一个小的物件出了错误而导致整个游戏世界都不能正常运转肯定是让人抓狂的。

把每种物体抽象成一个类,比如汽车,房子,NPC等。我们定义一个汽车类,把一些重要的属性和功能抽象出来,如颜色重量速度等,并且实现一下移动停止载人等功能。然后用这个汽车类实例化很多汽车,给每个汽车实例设置不同的位置,颜色等。这样游戏的世界中就可以出现很多不同的汽车。用这种方式去编程和我们现实世界中处理问题的方式比较接近。我们设计很多各种各样功能的类,然后用类或类的实例去组成整个的程序,并且可以方便的替换或改变一些模块而尽量少的影响其他模块的运行,如果有的模块出现错误,也尽可能的不影响其他模块的正常运转。我们定义好每个类有哪些属性能实现哪些功能,把每个类当成一个独立的整体。这种类似于搭积木的方式来开发程序的方式,是一种非常好的编程方式:面向对象的编程。极大的提高了程序的开发效率和软件的维护性。是我们需要掌握的。

编程核心的东西也就这些,只要保证逻辑的清晰和严密,写代码不是什么难事至少入门没那么难吧。当然要熟练的使用这些知识解决各种各样的问题要走的路还有很长。但有这些足以看到方向了。

5.拓展

另外一些需要掌握的概念:数组,指针,继承,重载。

6.脚本

编写完程序源代码之后,通常需要把源代码编译成可执行程序。如果想改动源代码来增加新的功能或改动游戏逻辑,修改之后要重新编译生成可执行程序。对于一些经常改动的功能,如开启一个活动,更改一个任务,等如果每次更改都要重新生成客户端,让玩家每次都下载新的更新补丁是非常不方便的。这时候我们往往把这些逻辑写在脚本里。程序会去加载和解析这些脚本(或脚本编译后的文件),并执行脚本中的逻辑。游戏程序公开一些接口供脚本调用。这样我们可以在脚本中调用这些接口控制游戏程序的执行。而脚本可以灵活的改动而不用修改编译后的主程序。

我们在Unity3D中要写的就是这样的脚本,通用的算法和功能Unity3D已经都已经封装好了,我们只需要通过脚本来调用这些功能就可以。我们只关心游戏的逻辑,不用关心底层的实现和算法,所以用Unity3D开发游戏非常的简单和高效。

原创粉丝点击