出如今脚本中的方法,不管是在定义的时候,仍是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别方法的做用吧。既然C#的语法规定方法就应该这么写,确定是有必定道理的。若是是上升到战略意义的道理,连做者也不是很明白,可是做者知道这对括号里能够添加“参数”。spa
要说明参数的做用,就必须从方法提及。方法能够处理变量中的数据,进而影响游戏对象的行为逻辑,这是本章前面一直在强调的。可是就前面脚本中一直在使用的,方法的括号里没有参数的状况而言,方法老是在处理特定变量里的数据。例如,下面是前面一个示例中定义的方法:orm
int AddTwoNumber() 对象
{教程
return number1 + number2;游戏
}图片
这个方法的括号里没有参数,它处理的数据老是变量number1和number2里的数据。既然这只是一个用于求和的方法,没有必要指定它只计算变量number1和number2里的数据和。若是有其它变量的数据也要求和的话,就只能再定义一个方法了。为方法引入参数就能够很好的解决这类的问题。ip
开发者定义了一个方法,能够控制一个游戏对象的逻辑行为。若是其它对象也须要作出与之相似的行为,就没有必要再定义一个方法了。例以下面的游戏示例所作的那样。游戏开发
(1)为游戏场景添加Cube、Cylinder和Directional light,这3个游戏对象。前二者将做为脚本方法控制行为逻辑的游戏对象,最后一个游戏对象负责游戏场景的照明。合理设置它们各自的位置,获得的Scene和Game视图,如图4-8所示。开发
图4-8 在Scene和Game视图里,查看各对象的相对位置,以及游戏视图的效果文档
(2)在Project视图里,新建脚本文件,命名为MyScript,打开此脚本并添加下面的代码:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 public GameObject myCube;
07 public GameObject myCylinder;
08 void OnGUI()
09 {
10 //当鼠标左键按下的时候
11 if(Input.GetMouseButton(0))
12 RotateObject (myCube);
13 //当鼠标右键按下的时候
14 if(Input.GetMouseButton(1))
15 RotateObject (myCylinder);
16 }
17 //改变游戏对象朝向的方法
18 void RotateObject(GameObject myObject)
19 {
20 myObject.transform.Rotate(Vector3.right*100,Space.World);
21 }
22 }
q 脚本代码的18~21行,是有参数方法的定义部分。从代码来看,传入的参数是一个游戏对象,而方法中的语句,就是经过修改游戏对象Transform组件下的Rotation属性,实现改变游戏对象朝向的目地的;
q 脚本代码的12、15行,调用了两次方法RotateObject(),前后传入的参数也是不同的;
(3)将脚本MyScript赋予Main Camera对象,并在后者的Inspector视图里,设置My Script组件里的My Cube和My Cylinder属性为游戏场景中的Cube和Cylinder对象,属性的设置方法是,直接拖动Hierarchy视图里的Cube和Cylinder对象到对应的属性框中便可,如图4-9所示。
图4-9 设置My Script组件下的属性
(4)运行游戏,在Game视图里,一直按下鼠标左键,读者会看到立方体对象在原地滚动。若是一直按下鼠标右键,那么原地滚动的就成了圆柱体。若是同时按住鼠标左键和右键,立方体和圆柱体就会同时滚动了,如图4-10所示。
图4-10 游戏效果展现图
(5)游戏中,控制游戏对象滚动的方法是RotateObject(),它是一个须要传入参数的方法。正是由于须要传入参数,因此它才能被用于游戏场景中,全部游戏对象滚动的行为逻辑控制中。而不仅是单独的控制一个对象的行为逻辑。
脚本中的方法,对于游戏对象而言,意义在于它能够控制游戏对象的行为逻辑,这是方法对于游戏效果的意义。方法对于脚本代码的书写,一样具备意义,那就是它能够帮助减小代码的重复书写。
本章在介绍方法时,曾将方法与变量作了简单比较,对比的过程当中说过,方法也能够看作是一个存储单元,只不过里面存储的不是数据,而是一条或者多条语句。就这个意义而言,能够认为若是在方法中放入多条会在脚本中被重复使用的语句,并使用方法名做为这些语句的指代。那么,脚本中全部须要书写这多行代码的地方,均可以使用方法名(即方法的调用)来代替。例如,脚本中有下面的代码:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 private int number1;
07 private int number2;
08 private int number3;
09 private int number;
10 void Start()
11 {
12 number1 = 3;
13 number2 = 5;
14 number3 = 4;
15 number1 *= number1;
16 number2 *= number2;
17 number = number1 + number2;
18 Debug.Log("number1*number1 + number2*number2 = " + number);
19
20 number1 = 3;
21 number2 = 5;
22 number3 = 4;
23 number1 *= number1;
24 number3 *= number3;
25 number = number1 + number3;
26 Debug.Log("number1*number1 + number3*number3 = " + number);
27 }
28 }
脚本中有3个变量:number1、number2和number3。为了计算number1与number2的平方和,代码中使用了12~18行,一共7行的代码。一样的,为了计算number1与number3的平方和,代码中使用了20~26行,一共7行的代码。若是在脚本中定义方法的话,就不用书写这么多相似的代码了,使用定义了方法的脚本之后,脚本中的代码以下:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 private int number1;
07 private int number2;
08 private int number3;
09 private int number;
10 void Start()
11 {
12 number1 = 3;
13 number2 = 5;
14 number3 = 4;
15 Debug.Log("number1*number1 + number2*number2 = " + AddTwoNumber(number1,number2));
16 Debug.Log("number1*number1 + number3*number3 = " + AddTwoNumber(number1,number3));
17 }
18 int AddTwoNumber(int i1,int i2)
19 {
20 i1 *= i1;
21 i2 *= i2;
22 return i1 + i2;
23 }
24 }
相比于以前使用的14行代码,这里只使用了5行代码!可是两个脚本实现的效果是同样的,如图4-11所示。
图4-11 Console视图输出了两个数平方和的计算结果
在Unity中编写脚本,读者能够本身编写方法,也可使用Unity编写的方法。通常状况下,脚本代码中会用到不少Unity编写的方法。而本身编写方法,一般是为了减小代码的重复书写,或者将Unity的方法组织起来,实现新的功能。对于Unity编写的方法,不会使用的时候,读者必定要记得去帮助文档里查阅,查阅的步骤本章前面的部分已经说明了。
本节游戏示例编写的脚本中,彻底使用Unity编写的方法,实现玩家经过键盘控制游戏对象上下左右移动的效果,具体的游戏制做过程以下:
(1)为游戏场景添加两个游戏对象:Sphere和Directional light。前者就是本游戏要控制的游戏对象,后者负责游戏视图的光照效果。调节游戏视图中各对象的位置,使得Sphere对象位于Game视图的中央,如图4-12所示。
图4-12 在Scene和Game视图里,查看各游戏对象的相对位置,以及游戏视图的显示效果
(2)为游戏项目导入4个图片,它们将被用于在游戏视图里表示小球的运动方向,本游戏导入的4个图片如图4-13所示。
图4-13 为游戏项目导入的4个表示方向的图片
提示:为游戏项目导入图片的方法是:直接拖动。即将图片直接拖动到Unity的Project视图里便可。
(3)在Project视图里,新建一个脚本,并命名为MyScript,打开此脚本,并添加下面的代码:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 public Texture texUp,texDown,texLeft,texRight;
07 public GameObject mySphere;
08 public float sphereSpeed = 0.1f; //决定小球的移动速度
09 private float horizontalNum,VerticalNum;
10
11 void Update()
12 {
13 //检测是否按下了水平方向上的方向键
14 horizontalNum = Input.GetAxis ("Horizontal");
15 mySphere.transform.Translate (horizontalNum*Vector3.right*sphereSpeed);
16 //检测是否按下了垂直方向上的方向键
17 VerticalNum = Input.GetAxis ("Vertical");
18 mySphere.transform.Translate (VerticalNum*Vector3.up*sphereSpeed);
19 }
20 void OnGUI()
21 {
22 GUILayout.BeginHorizontal ();
23 //绘制左箭头,或者右箭头
24 if(horizontalNum > 0)
25 GUILayout.Label (texRight,GUILayout.Width(100),GUILayout.Height (100));
26 else if(horizontalNum < 0)
27 GUILayout.Label (texLeft,GUILayout.Width(100),GUILayout.Height (100));
28 //绘制上箭头,或者下箭头
29 if(VerticalNum > 0)
30 GUILayout.Label (texUp,GUILayout.Width(100),GUILayout.Height (100));
31 else if(VerticalNum < 0)
32 GUILayout.Label (texDown,GUILayout.Width(100),GUILayout.Height (100));
33 GUILayout.EndHorizontal ();
34 }
35 }
将此脚本赋予Main Camera对象,并在后者的Inspector视图里设置My Script组件下的属性,如图4-14所示。
q Tex Up:up;
q Tex Down:down;
q Tex Left:left;
q Tex Right:right;
q My Sphere:Sphere;
q Sphere Speed:0.1;
图4-14 设置组件下各属性
(4)脚本中使用的Unity方法,这里会作简要说明,若是读者对各方向的详细使用说明感兴趣,能够本身查阅帮助文档。
q 14、17行使用了Input.GetAxis ()方法,用于检测玩家是否按下了键盘上的左,或者右方向键;为方法传入的参数是Horizontal和Vertical,它们是Unity默认定义的输入按键,读者能够在Unity里单击Edit|project Settings|Input命令,而后在弹出的InputManager对话框中看到它们,如图4-15所示。
图4-15 InputManager对话框
q 15、18行使用了游戏对象的transform.Translate ()方法,用于修改球体对象Transform组件下的Position属性,因此游戏场景中球体对象的位置就发生了改变;
q 20行的OnGUI()方法,用于在游戏视图上绘制各类图形,或者控件,这些图形和控件并不存在于游戏场景中。若是非要说出位置的话,做者以为说它们存在于屏幕上更合适些;
q 22、33行的方法GUILayout.BeginHorizontal ()和GUILayout.EndHorizontal ()会迫使图形和控件,在水平方向上,一个挨着一个的绘制;
q 25、27、30和32行使用了GUILayout.Label ()方法,做用是在屏幕上绘制标签(Label)控件;
(5)运行游戏,小球处于视图的中央,按下键盘上的方向键,小球就会朝着指定的方向移动,而且游戏视图的左上角还使用图片显示着小球的移动方向,而且图片的显示与否,与玩家是否按下了方向键有关。若是玩家都没有按下方向键,那么就不会有方向图片显示,游戏的运行效果如图4-16所示。
图4-16 处于静止状态和运动状态的小球,以及显示在游戏视图左上角的方向图片
方法,从外在形式上来看,就是由多条语句组成的。考虑到读者对方法的理解,本章将它与变量作了对比,由于它们确实有很多类似的地方。方法对于游戏的真正意义在于,方法会将属性里的数据作特定的处理,并将处理的结果应用到游戏对象上。可是它也有其它用途,例如减小代码的重复书写。在学会了方法的编写之后,又带读者认识了Unity自定义的方法,以及须要传入参数的方法。最后,本章一样以一个游戏示例收尾。由于示例中使用了很多Unity自定义的方法,读者看来不得不去查阅下帮助文档才行,至于查阅的步骤,本章也介绍了。
本文选自:C#游戏开发快速入门大学霸内部资料,转载请注明出处,尊重技术尊重IT人!