UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写C#游戏开发快速入门大学霸
UnityOnGUI()方法脚本代码概览声明变量游戏脚本的编写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.