C#开发Unity游戏教程之使用脚本变量

C#开发Unity游戏教程之使用脚本变量

使用脚本变量

本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的。本节会依次讲解变量的声明、初始化、赋值和运算。

Unity脚本中声明变量

要想在脚本中使用变量,就必须先声明(declare)。这就意味着,需要先告诉Unity,有这样一个变量存在,然后才可以在Unity中使用这个变量。那么,该如何将这个变量存在的事实告知Unity呢?答案就是声明。实际上,读者已经在本章见过多次变量的声明了,没错就是图3-11所示的样子。

图3-11  脚本中声明变量的代码

对于变量的声明,必须满足下面的3个条件:

  • q  必须指定变量可以存储的数据的类型;
  • q  必须指定一个变量名;
  • q  必须以一个分号“;”结束;

声明变量的形式如下:

  • 数据类型 变量名;

例如:

  • int number1;

这样的声明方式符合要求,因为:

  • q  语句指定了变量可以存储的数据类型是int,也就是说可以存储整数;
  • q  语句指定了变量名,即number1;
  • q  语句最后以分号“;”结尾;

对于这样一个声明语句,Unity会按照下面的方式去理解:

  • q  声明语句没有明确的说明是public,还是private,因此就当作private处理;
  • q  此变量将不会出现在脚本的属性中,而且也无法被其它脚本访问;
  • q  变量名number1,默认指代的数据是0;

Unity变量的初始化

在声明变量的同时,为变量指定值,在C#中就被称为变量的初始化。被初始化的值,同样会显示在游戏对象属性的输入框中,如图3-12所示。

图3-12  属性输入框中是变量被初始化的值

Unity变量的运算

在脚本中使用变量时,通常会对变量做些运算,或者说是对变量中的数据做某些算术处理,而处理的结果有时会进入新的运算中,有时则会作为游戏的结果而输出。只要是对变量中的数据做处理,就需要用到运算符。C#中的运算符大体可以分为4类:算术运算符、自增自减运算符、复合运算符和位运算符,如表3.2所示。

表3.2  运算符

Unity成员变量

目前为止,示例脚本中声明的变量,也被称为“成员变量”(member variables)。因为它们被声明在类MyScript大括号的里面,方法大括号的外面。提及“成员变量”这个概念是因为,只有成员变量才可以作为组件的属性显示在组件下。

提示:成员变量声明的位置,因人而异,作者喜欢把它们写在类中所有方法的前面,并且写在一起,这样的话类中有哪些成员变量一目了然,例如:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public int number1 = 2;
  • 07              public float number2 = 4.7f;
  • 08              public float number3 = 6.12f;
  • 09              void Start()
  • 10              {
  • 11                       AddTwoNumbers();
  • 12                       SubTwoNumbers();
  • 13              }
  • 14              void AddTwoNumbers()
  • 15              {
  • 16                       Debug.Log (number1 + number2);
  • 17              }
  • 18              void SubTwoNumbers()
  • 19              {
  • 20                       Debug.Log(number3 - number2);
  • 21              }
  • 22     }
  • 但是也有人喜欢将成员变量分开写在它们第一次被方法使用的方法名的前面,例如:
  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public int number1 = 2;
  • 07              public float number2 = 4.7f;
  • 08              void Start()
  • 09              {
  • 10                       AddTwoNumbers();
  • 11                       SubTwoNumbers();
  • 12              }
  • 13              void AddTwoNumbers()
  • 14              {
  • 15                       Debug.Log (number1 + number2);
  • 16              }
  • 17              public float number3 = 6.12f;
  • 18              void SubTwoNumbers()
  • 19              {
  • 20                       Debug.Log(number3 - number2);
  • 21              }
  • 22     }

因人而异,读者可以选择自己喜欢的方式。以上两个脚本中实现的功能是一样的,即声明变量、初始化变量,最后将变量的运算结果输出到Console视图里,如图3-13所示。

图3-13  Console视图里,输出了变量的运算结果

Unity变量的作用域

变量的作用域(scope),可以被理解成“变量在脚本中的存在范围”。例如,对于下面的脚本:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript: MonoBehaviour
  • 05     {
  • 06              private string block1 = "Block 1 text";
  • 07              void Start()
  • 08              {
  • 09                       Debug.Log (block1);
  • 10                       string block2 = "Block 2 text";
  • 11                       Debug.Log (block2);
  • 12
  • 13                       {
  • 14                                 Debug.Log (block1);
  • 15                                 Debug.Log (block2);
  • 16                                 string block3 = "Block 3 text";
  • 17                                Debug.Log (block3);
  • 18                       }
  • 19              }
  • 20     }

脚本中一共有3个作用域,分别以3个大括号为边界,即3个作用域的范围是:05~20、08~19和13~18。而变量的作用域,将从它被声明的位置开始,一直到它所处的作用域的末尾处。

  • q  脚本中一共声明了3个string类型的变量,分别位于脚本的06、10和16行。
  • q  变量block1的作用域是07~20行;
  • q  变量block2的作用域是11~19行;
  • q  变量block3的作用域是16~18行;

在Unity中,运行游戏,然后在Console视图里查看输出结果,如图3-14所示。

图3-14  Console视图的输出结果

如果脚本中,不小心在变量的作用域外使用了变量的话,Console视图会提示错误,错误信息大致是告诉你“变量在声明前不能使用”,即变量是不存在的。例如,在脚本09行插入下面的代码,Console视图提示的错误信息,如图3-15所示。

  • 09                       Debug.Log (block2);

图3-15  在作用域外使用变量,所导致的错误的信息提示

Unity中的脚本语句

学习过英语的人,都该知道“语句”。因为书写英语文章的时候,我们通常使用点“.”作为英语语句的结束标志。同理,当你书写一行代码的时候,可以将分号“;”置于代码的末尾处,这用于表示这是一条代码语句。

一行代码就是一条语句吗?答案是否定的。C#语法规定,语句是以分号“;”为结束标志的。例如:

  • public int number1 = 2;

这行代码的作用是声明一个名为number1的变量,存储的数据是2。这是一行代码,它以分号“;”结尾,因此它也是一条语句!再看下面的代码:

  • public
  • int
  • number1
  • =
  • 2;

虽然代码被分成了5行书写,但是因为只出现了一个分号,所以这也是一条语句。读者可以使用这条语句,替换上面的那条语句,运行效果是没有丝毫区别的。

提示:尽管在语法上是正确的,但是不推荐读者使用这种方法。因为写成这样的代码会占用更多的视觉空间。也就是说,一次可以看到的语句数量减少了,最终使得脚本代码变得极难阅读。推荐读者将一个语句写到一行,语句太长的话,再考虑分成两行来写。

Unity游戏示例

本章学习了那么多关于变量的知识,那么到底在游戏中有什么实际意义吗?读者可以先从变量着手,进而发觉它对于游戏的意义。变量的作用是存储数据,而这个数据在脚本代码中会被用于做其它处理,进而影响到游戏场景中游戏对象的行为。如果这个脚本被赋予了某一个具体的游戏对象,那么就可以通过设置脚本组件下的属性值,进而改变脚本代码中操作的数据,这同样会影响到游戏对象的行为。这么说果然还是太抽象了,下面将以一个示例说明。

(1为游戏项目里的游戏场景添加2个游戏对象:Cube和Directional,前者是脚本打算操作的游戏对象,后者是负责游戏场景照明的游戏对象。调整游戏场景中3个游戏对象的位置,使得Game视图达到最佳的效果,如图3-16所示。

提示:3个游戏对象?难道不是2个吗?希望读者没有忘记Unity为游戏场景自动添加的Main Camera,此对象决定了Game视图的成像效果。

图3-16  Unity里的Scene和Game视图

(2在Project视图里,新建一个脚本,命名为MyScript,打开此脚本并添加下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              //声明4个变量
  • 07              public GameObject myCube;
  • 08              public int transSpeed = 100;
  • 09              public float rotaSpeed = 10.5f;
  • 10              public float scale = 3;
  • 11              void OnGUI()
  • 12              {
  • 13                        if( GUILayout.Button ("移动立方体") )
  • 14                       {
  • 15                                 myCube.transform.Translate (Vector3.forward*transSpeed*Time.deltaTime,Space.World);
  • 16                       }
  • 17                        if( GUILayout.Button ("旋转立方体") )
  • 18                       {
  • 19                                 myCube.transform.Rotate (Vector3.up*rotaSpeed,Space.World);
  • 20                       }
  • 21                        if( GUILayout.Button ("缩放立方体") )
  • 22                       {
  • 23                                 myCube.transform.localScale = new Vector3(scale,scale,scale);
  • 24                       }
  • 25              }
  • 26     }

脚本的07~10行,一共声明了4个变量,且都使用public修饰,所以它们可以作为属性,出现在组件下。后3个变量还被初始化了,除了第1个变量的数据类型读者无需在意外,后3个变量的类型在本章中都有介绍。

提示:读者只要体会变量在脚本中的书写形式,以及对于游戏的作用效果就可以了,无需太过关注其它部分。其它部分不是本章讲解的重点,但它们帮助实现了游戏的效果。

(3将脚本MyScript赋予Main Camera,脚本就会作为组件出现在Main Camera对象的Inspector视图中,如图3-17所示。

图3-17  Main Camera对象的Inspector视图 图3-18  为属性My Cube赋值

脚本组件下的属性名与脚本中声明的变量名基本一致,且属性框中已经有值了,这个值是在变量初始化时指定的。

提示:My Cube属性的值需要读者手动添加,添加的方法是,将Hierarchy视图里的Cube对象,拖动到My Cube属性的属性框中,如图3-18所示。

(4运行游戏,在Game视图的左上角会出现3个按钮:移动立方体、旋转立方体和缩放立方体。单击按钮,即可完成对立方体对象的指定操作,如图3-19所示。

图3-19  通过单击游戏视图上的按钮,操纵游戏中的立方体

(5读者可能要问了,变量对于游戏的意义还没有体现出来了,别急,现在就体现变量的作用。读者如果要在Unity中寻找变量的话,可能就要失望了,因为变量早就转变成属性了。因此对属性的操作,就是对变量的操作。

读者多“玩”会儿这个游戏就会发现,立方体的移动速度、旋转速度,甚至是缩放倍数是固定的!如果读者想要改变它们的话应该怎么办?读者想的没错,这个时候属性就派上用场了,还记得那3个属性Trans Speed、Rota Speed和Scale吧,手动修改它们的属性值,然后再单击按钮试试,怎样效果不一样了吧,如图3-20所示,以属性Scale的修改为例。

图3-20  通过修改属性Scale的值,进而改变立方体的缩放倍数

小结

本章站在脚本变量的角度上,全方位的向读者介绍了组件的属性。内容包括:属性名(变量名)的本质就是一个指代,它并非真正的数据;并非所有的变量在组件的属性都是可见的;即时同样是属性,也存在不同的类型;脚本中变量的编写规则。最后,本章以一个简单的游戏收尾,用以凸显变量,或者说属性之于游戏的重要作用。

本文选自:C#游戏开发快速入门大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

时间: 2024-11-06 16:18:47

C#开发Unity游戏教程之使用脚本变量的相关文章

C#开发Unity游戏教程之游戏对象的属性变量

C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性--变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象.上一章仅仅是简单的介绍了脚本中的变量,读者一定只是瘾,如今好了.作者将使用一整章的篇幅介绍变量与属性. Unity游戏对象的属性 在Unity中.游戏场景中游戏对象的属性,能够在Inspector视图里查看,想看哪个游戏对象的属性.就使用鼠标选中哪个游戏对象就可以. 比如,要查看游戏场景中Main Camer

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判定玩家是否有权限做出这种选择,然后才决定是否为玩家执行此选择.例如,<仙剑奇侠传>这款游戏,进入剧情"荷叶迷宫时",会要求玩家击碎迷宫里的5尊雕塑,如图5-12所示.但是击碎的前提是,玩家身上必须携带有"锤子".也就是说系统会遍历玩家身上所有的资源,如果有锤

C#开发Unity游戏教程之判断语句

C#开发Unity游戏教程之判断语句 游戏执行路径的选择--判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏百玩不厌!既然提到了这一点,借此机会本章就来说明,在脚本中实现游戏为玩家提供更多选择的方法. Unity游戏的执行路径 游戏如此受玩家欢迎的原因,除了优质的画面效果以外,就是游戏的可交互性.也就是说,游戏是可以与玩家互动的,这也是游戏与视频的不同之处.游戏允许玩家在一定程度上控制游戏的执行路径,虽然

C#开发Unity游戏教程之游戏对象的行为逻辑方法

C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑--方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要内容是变量,但是在章节的最后为了展示游戏效果,也用到了它.现在看来方法真的是无处不在,并且不可或缺.它甚至都可以影响游戏对象的行为逻辑!因此本章终于到了不得不介绍它的时候了. Unity游戏对象的行为逻辑 游戏场景中,有些游戏对象是静止的,例如,树木.山峰.石头等等.而另外一些游戏对象则是运动的,它

C#开发Unity游戏教程之Scene视图与脚本的使用

C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发人员开发游戏时,操作最频繁的视图. 由于一旦一个游戏对象被加入到游戏的场景中,就须要首先使用鼠标为这个游戏对象设置出合适的状态. 并且开发人员还须要多角度的观察游戏场景中的各游戏对象.基于以上的原因,Unity提供了非常多快捷操作,支持开发人员对Scene视图所做的各种操作.常见的操作方式有: 直接按下键盘上的Q.W.E.R键.就可以选中Unity左上角,工具栏上的4个button.

C#开发Unity游戏教程之Unity中方法的参数

C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别方法的作用吧.既然C#的语法规定方法就应该这么写,肯定是有一定道理的.如果是上升到战略意义的道理,连作者也不是很明白,但是作者知道这对括号里可以添加“参数”. Unity中参数的作用 要说明参数的作用,就必须从方法说起.方法可以处理变量中的数据,进而影响游戏对象的行为逻辑,这是本章前面一直在强调的.

unity基础开发----unity游戏速度更快的简易检查表

让游戏速度更快的简易检查表 保持顶点数在 200K 下面,针对 PC 时每帧应为 3M,主要取决于目标 GPU. 若使用内置着色器,请在移动 (Mobile) 或未点亮 (Unlit) 的类别中选择.它们对非移动平台相同有效,可是是更复杂的着色器的简化和限制版本号. 每一个场景中不同材质的数量尽可能少 - 不同对象之间尽可能共享相同的材质. 在非移动对象上设置静态 (Static) 属性,同意静态批处理 (static batching) 等内部优化. 切勿在不必要的情况下使用像素灯 - 选择仅

IOS开发 UNITY游戏开发 APP开发 CocosSharp游戏开发

上海诸君信息科技有限公司致力于一流的创新软件产品设计定制,服务客户遍及全球, 公司有多款精心设计的软件产品,如诸君工作系统.餐饮一体化管理系统.PadOrder电子菜谱.CDM文档管理系统.清洁能源参数优化系统.银行iPad文件管理系统等. 我们提供优秀的综合软件与游戏开发与咨询.管理软件定制开发.点单软件与移动客户端(WP,Android,iOS)软件开发,为全球多家软件公司.国企.医疗.能源机构提供优秀的应用解决方案,欢迎咨询! 我们为海内外客户提供先进的软件解决方案,因况制宜.使用最适合的

ASP基础教程:ASP脚本变量、函数、过程和条件语句

在上一期中作者向诸位简要介绍了 ASP 脚本语言之一 VBScript 的一些基本常识,本期将继续给大家讲解 VBScript 的脚本编写方法,并通过展示 VBScript 在 ASP 程序编写过程中的一系列实例使大家对 VBScript 有更进一层的理解. 大家在学习了脚本语言 VBScript 的变量.常量和过程的基本概念后,本期将继续向各位介绍 VBScript 的函数和语法. 函数和过程一样都是命名了的代码块,但它们却有很大的区别,过程完成程序任务,函数则返回值.我们可以这样理解,过程象