UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

C#游戏开发快速入门

5.4.3  游戏脚本的编写UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

脚本的代码,涉及了游戏的所有运行逻辑,内容较多,就将其划分成了一个小节。本小节也因此得以为读者详细介绍脚本代码的思考和编写过程。

1.声明变量UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

(1)游戏项目中有6张图片,脚本会操作这6张图片,然后按照指定的游戏逻辑,将它们显示在游戏视图中。因此脚本中需要声明存储这6张图片(数据)的变量,如下:

public Texture[] image;

既然都是图片,联想到本章所学的知识,就很容易想到使用数组,当然读者也可以选择使用列表。

提示:Texture在Unity脚本中是表示用于存储图片这种数据的数据类型。

因为变量被public修饰,所以它会以属性的形式,出现在Inspector视图的组件下。读者需要在此视图里,将图片作为属性值,赋予这个数组。具体的赋值方式就是拖动,即将图片从Project视图,拖动到Inspector视图,如图5-24所示。

图5-24  脚本组件属性的设置UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

提示:读者一定要注意数组各图片数据的排列顺序,因为后面要编写的脚本代码将直接使用下标,引用数组中存储的图片数据。对于本示例,图片数组中的存储顺序是:up、down、left、right、success和fail。

(2)同样需要声明数组的地方,还有表示预定义的3组组合键的数据,如下UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸:

int[,] Sample =

{

//上+下+左+右+空格

{KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_SPACE},

//上+下+上+下+空格

{KEY_UP,KEY_DOWN,KEY_UP,KEY_DOWN,KEY_SPACE},

//左+右+左+右

{KEY_LEFT,KEY_RIGHT,KEY_LEFT,KEY_RIGHT,KEY_SPACE},

};

代码中声明的是“二维数组”,而本节详细介绍的是“一维数组”,关于二维数组的介绍读者可以参考专业的书籍。实际上,读者可以简单的将“二维数组”看作是“一维数组中存储的数据是一维数组”。这段代码在声明二维数组的时候,还对数组进行了初始化。初始化的数据是预定义的3组组合键,从代码的注释中,读者很容易就可以看出哪些按键,及其顺序构成了组合键。但是,读者也许对于那些大些字母感到陌生,它们实际上是“整型常量”,同样需要声明在MyScript脚本中,如下:

public const int KEY_UP = 0;

public const int KEY_DOWN = 1;

public const int KEY_LEFT = 2;

public const int KEY_RIGHT = 3;

public const int KEY_SPACE = 4;

(3)脚本还需要声明的变量有:

q  实时记录玩家按下了哪些按键的变量,由于玩家肯定会按下不只一个按键,因此这里选择列表存储这类数据,如下:

private List<int> playerInput;

q  玩家在一个时间点,按下的是何种按键:

private int currentKeyDown;

q  玩家是否成功的按下了一组组合按键:

private bool isSuccess = false;

2.定义方法

(1)在声明表示列表的变量,并不意味着就为列表变量分配了存储空间。因此,脚本需要在被初始化时,为列表分配存储空间,如下:

void Start()

{

playerInput = new List<int>();

}

Start()方法是Unity定义的方法,此方法会在脚本被初始化时调用,因此将为列表分配存储空间的代码置于此方法中,再合适不过。

(2)在脚本中,自己定义一个方法,用于记录每一个时刻,玩家按下的指定按键,如下:

void UpdateKey()

{

if(Input.GetKeyDown (KeyCode.UpArrow))

currentKeyDown = KEY_UP;

if(Input.GetKeyDown (KeyCode.DownArrow))

currentKeyDown = KEY_DOWN;

if(Input.GetKeyDown (KeyCode.LeftArrow))

currentKeyDown = KEY_LEFT;

if(Input.GetKeyDown (KeyCode.RightArrow))

currentKeyDown = KEY_RIGHT;

if(Input.GetKeyDown (KeyCode.Space))

currentKeyDown = KEY_SPACE;

}

判断玩家是否按下了指定按键,可以使用if语句,如果按下的话,就将表示此按键的数据存储于变量currentKeyDown中。if语句的判断部分,是用于检测键盘上的按键是否被按下的Unity定义的方法。从此段代码中可以看出,游戏检测的按键有5个,包括键盘上的4个方向键和1个空格键。

(3)在Unity每帧调用的Update()方法中,添加表示下列用途的代码:

q  要想确保前面定义的方法UpdateKey(),在游戏中的每个时刻都被调用,最好借助于Update()方法;

q  脚本还需要时刻将玩家按下的按键,存储于列表中;

q  当列表中有5个数据的时候,就去与预定义的组合键做比较,如果一致就表示输入成功,不一致就表示输入失败;

q  无论失败与否,都需要将列表清空,因为列表还需要存储下一轮玩家按下的按键。

具体的代码实现过程如下:

01              void Update()

02              {

03                        //检测当前玩家按下的按键

04                       UpdateKey ();

05                        //当前有任何按键被按下的时候

06                       if(Input.anyKeyDown)

07                       {

08                                 if(isSuccess)

09                                 {

10                                          isSuccess = false;

11                                          playerInput.Clear ();

12                                 }

13                                 //将玩家按下的方向键添加到列表中

14                                 playerInput.Add (currentKeyDown);

15                                 //获取当前列表数据个数

16                                 int listCount = playerInput.Count;

17                                 //如果已经按下了5个键,就判断是否是组合键

18                                 if(listCount == 5)

19                                 {

20                                          for(int i = 0;i < 3;i++)

21                                          {

22                                                   int SuccessCount = 0;

23                                                   for(int j = 0;j < 5;j++)

24                                                   {

25                                                             int tempKey = playerInput[j];

26                                                             if(tempKey == Sample[i,j])

27                                                                      SuccessCount++;

28                                                   }

29                                                   if(SuccessCount == 5)

30                                                             isSuccess = true;

31                                          }

32                                 }

33                                 if(listCount > 5)

34                                          playerInput.Clear();

35                       }

36              }

(4)对于本游戏示例,游戏视图需要实时显示的元素有,如图5-25所示。

q  玩家此时按下了哪些预定义的按键,即“上、下、左、右”4个方向键中的哪一个,至于“空格”按键嘛,由于没有表示此按键的图片,所以就不显示了;

q  表示玩家是否按下了5个指定按键的图片,即success和fail所表示的图片;

q  用于提示玩家有哪些组合按键的文字信息;

图5-25  游戏视图上,各元素的显示

因为Unity是通过调用OnGUI()方法来决定,在游戏视图上绘制哪些界面元素的,因此需要将显示上面所列元素的代码,置于此方法中,如下:

01              void OnGUI()

02              {

03                       GUILayout.BeginHorizontal();

04                        //表示链表中存储的数据个数

05                       int listCount = playerInput.Count;

06                        //遍历链表中的所有数据

07                       for(int i = 0;i < listCount;i++)

08                       {

09                                 //显示方向按键对应的图片到游戏视图

10                                 int key = playerInput[i];

11                                 Texture tempTex = null;

12                                 switch(key)

13                                 {

14                                 case KEY_UP:

15                                          tempTex = image[0];

16                                          break;

17                                 case KEY_DOWN:

18                                          tempTex = image[1];

19                                          break;

20                                 case KEY_LEFT:

21                                          tempTex = image[2];

22                                          break;

23                                 case KEY_RIGHT:

24                                          tempTex = image[3];

25                                          break;

26                                 }

27                                 if(tempTex != null)

28                                          GUILayout.Label (tempTex,GUILayout.Width (70),GUILayout.Height (70));

29                       }

30                       if(isSuccess)

31                                 GUILayout.Label (image[4],GUILayout.Width (70),GUILayout.Height (70));

32                       else if(!isSuccess && listCount == 5)

33                                 GUILayout.Label (image[5],GUILayout.Width (70),GUILayout.Height (70));

34                       GUILayout.EndHorizontal();

35                       GUILayout.Space (20);

36                        GUILayout.Label (“组合键1:上、下、左、右、空格”);

37                        GUILayout.Label (“组合键2:上、下、上、下、空格”);

38                        GUILayout.Label (“组合键3:左、右、左、右、空格”);

39              }

3.脚本代码概览

前面已经详细的介绍了在脚本中,方法的声明、方法的定义,以及变量和方法对于游戏效果的意义。但是读者也许还无法将它们组合成一个整体,相信下面的脚本代码概览对读者有帮助,如下:

01     using UnityEngine;

02     using System.Collections.Generic;

03

04     public class MyScript : MonoBehaviour

05     {

06              //4个方向图片,2个表示按键成功和失败的图标

07              public Texture[] image;

08              //自定义方向键的存储值

09              public const int KEY_UP = 0;

10              public const int KEY_DOWN = 1;

11              public const int KEY_LEFT = 2;

12              public const int KEY_RIGHT = 3;

13              public const int KEY_SPACE = 4;

14              //表示各组合键

15              int[,] Sample =

16              {

17                        //上+下+左+右+空格

18                       {KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_SPACE},

19                        //上+下+上+下+空格

20                       {KEY_UP,KEY_DOWN,KEY_UP,KEY_DOWN,KEY_SPACE},

21                        //左+右+左+右

22                       {KEY_LEFT,KEY_RIGHT,KEY_LEFT,KEY_RIGHT,KEY_SPACE},

23              };

24              //记录玩家按下的所有键

25              private List<int> playerInput;

26              //记录当前的按键

27              private int currentKeyDown;

28              //表示是否成功的按下了组合键

29              private bool isSuccess = false;

30              //初始化脚本

31              void Start()

32              {

33                       playerInput = new List<int>();

34              }

35              //获取玩家按下的方向键

36              void UpdateKey()

37              {

38                        …                                                                       //省略

39              }

40              void Update()

41              {

42                        …                                                                       //省略

43              }

44              //绘制游戏视图的界面元素

45              void OnGUI()

46              {

47                        …                                                                       //省略

48              }

49     }

5.5  小结UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸

一款游戏,玩家可以百玩不厌,究其原因就在于游戏允许玩家通过选择,进而左右游戏剧情的发展。游戏本身则需要判断玩家做出了怎样的选择,判断的方式就是使用判断语句,因此本章介绍了if、switch。又由于玩家有时需要从大量的数据中做出选择,例如,玩家的角色会数十种技能,要从中选择一个技能。这又涉及到大量数据的存储,因此本章介绍了数组、列表和字典。游戏本身要从大量数据中判断出玩家选择的是哪一个数据,因此最后介绍了遍历大量数据的方式,即foreach、for和while循环。本章的末尾,还以一个较大的游戏示例,展示了本章所学知识在游戏中的应用UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸。

Comments are closed.