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

Unity游戏对象的属性——变量

通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象。上一章只是简单的介绍了脚本中的变量,读者一定不过瘾,现在好了,作者将使用一整章的篇幅介绍变量与属性。

Unity游戏对象的属性

在Unity中,游戏场景中游戏对象的属性,可以在Inspector视图里查看,想看哪个游戏对象的属性,就使用鼠标选中哪个游戏对象即可。例如,要查看游戏场景中Main Camera对象的属性,只需在Hierarchy视图里选中Main Camera,然后Inspector视图就会显示出它的所有属性,如图3-1所示。

 

图3-1  在Inspector视图里查看Main Camera对象的属性

通过上一章节的学习,读者应该了解到,属性是显示在组件之下的,组件的本质是类,而属性的本质就是变量,只不过使用者是无法查看Unity这些内置组件类的代码的。因此,下面以自己编写的脚本来说明组件之于脚本中定义的类,属性之于脚本中的变量,它们之间的对应关系。

(1在Project视图里,单击Create|C# Script命令,创建脚本并命名为MyScript,使用鼠标双击打开脚本,并在脚本中添加下面代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public int iValue;
  • 07              public string strValue;
  • 08              public float fValue;
  • 09     }

提示:新创建的脚本,里面有很多Unity自动添加的代码,对于没有实际意义的代码,读者可以将其删除。

(2将MyScript脚本拖动到Main Camera对象上,再次使用Inspector视图查看Main Camera对象的属性,如图3-2所示,会发现脚本也变成了组件,成为了Main Camera对象的一部分,并且这个组件下显示的属性,就是脚本中的变量。

 

图3-2  脚本之于组件,变量之于属性

Unity中指代数据的名称

既然游戏对象属性的本质就是变量,那么脚本中的变量又是什么?在上一章曾向读者说明过,变量实际上就是一个存储数据的单元,而读者在脚本中所看到的“变量”,准确的说应该是“变量名”。“变量名”顾名思义就是指变量的名称,它的作用是指代变量,或者说是指代变量中的数据。就上一节的示例而言,脚本中的变量名是iValue、strValue和fValue,如图3-3所示。

 

图3-3  脚本中的变量名

Unity变量命名规则

脚本中的变量名,看起来就是一串字母,但它是有自己的命名规则的,这个规则是被C#语法所规定的,即:变量名只能由字母、数字和下划线组成,且只能以字母或者下划线开头。对这个规则的解释如下:

  • q  同一字母的大小写,对于变量名是不同的。例如,iValue和IValue是不同的变量名;
  • q  不能以数字开头。例如,iValue和_Value是合法的,但是1Value是不合法的;

Unity变量命名约定

“规则”是必须遵守的,有强制性,不遵守的话就会出现语法上的错误。而“约定”则是要看意愿的,读者可以不遵守约定,也不会犯任何语法上的错误。虽然它没有强制性,但是读者也最好了解一下,因为遵守约定,利于代码的阅读,以及游戏编程人员协同工作。

1.选择有意义的名称

最好为变量选择有意义的名称,否则读者会在很长一段时间以后,忘记当初为什么要命这样一个变量名,以及这个变量名想要指代一个什么样的数据。下面以一个例子来说明:

  • public bool theBearMakesBigPottyInTheWoods = true;

这个变量名可真长!但它确实清楚的描述了自己,因此即时读者在10年后看到这个变量,仍然能从它的名字上了解到当初什么要命这样一个变量名,以及这个变量名想要指代一个什么样的数据。现在给这个变量换另一个简单点的名字:

  • public bool potty = true;

这个名字确实简洁多了!毕竟缺少了好多描述性的信息。也许读者在为变量命名的时候,还记得它的作用,但是过几周之后就不一定了。到时候,读者将不得不阅读更多的代码,来推测这个变量名的作用。

2.小写字母开头

使用小写字母作为变量名的首字母,是为了让变量名与类名区别开来,从而使得代码阅读者可以轻松地从名称上,得知名称是变量名还是类名。因为类名通常是使用大些字母开头的,因此最好让变量名以小写字母开头。例如:

  • Transform;                                             //类名
  • transform;                                                        //变量名

如果严格的遵守了命名的约定的话,就可以很容易的得知,第一个是类名,第二个是变量名。

提示:在本书后面的章节,读者会看到类的命名约定,那个时候作者会告诉你类名最好以大写字母开头。读者也可以使用其它的命名约定,但是无论使用何种命名约定,目的都是一致的,就是为了提高代码的可读性,便于多名游戏编程人员的协作。

Unity变量名与属性名的些许不同

通过本章第一节的学习,读者已经了解到,游戏对象上属性的本质就是变量,而属性名与变量名也是一致的。但是细心的读者可能发现了,属性名与变量名并非完全一致,至少首字母的大小写就不同,如图3-4所示。

 

图3-4  变量名与属性名不完全一致

其实同样的问题,也发生在了脚本名(类名)与组件名的不一致上。例如,MyScript(脚本名、类名)的组件名是My Script。这或许是微不足道的,但它却体现出了Unity的体贴、周到,读者难道不觉得,Unity所做的这些变动,使得变量名在变成了属性名以后,更加的易读了吗?事实就是如此。

Unity属性名的可见性

读者千万不要认为,只要脚本中有变量,就会在脚本成为组件以后,出现在组件下的属性列表中。这种想法是错误的,因为决定变量是否会出现在组件下,成为属性的因素是,修饰变量的是public,还是private。本章前面部分演示的示例,变量前面都有public修饰,所以才会显示在组件下的属性中,如图3-5所示。

 

图3-5  变量前的修饰部分——public

如果将strValue前的修饰public,换成private,在保存对脚本代码的修改以后,再次查看组件下的属性,就会发现名为Str Value的属性不见了,如图3-6所示。

 

图3-6  被private修饰的属性不见了

注意:脚本中可以省略对变量的修饰,也就是说不书写public和private也不会有语法上的错误。此时,Unity会默认变量是被private修饰的,因此此变量同样不会以属性的形式显示在组件下,如图3-7所示。

 

图3-7  省略了修饰的变量

C#语法规定,被public修饰的变量,可以被外界访问和修改,也就是说变量存储的数据,允许在脚本外被修改。因此开发者才可以在Unity中,通过属性修改脚本中变量存储的数据。被private修饰的变量与public刚好相反,拒绝被外界访问和修改。因此变量中的数据无法被外界修改,Unity也就不会将此类变量作为属性显示在Inspector视图中。这么看来,这是一个很明智的决策!

Unity设定属性的数据类型

属性就是变量,它们二者只是同一事物在不同场景下的不同称呼而已。在Unity中,应该说属性有不同的数据类型,但是如果在脚本中,就只能说变量有不同的数据类型了。数据类型是什么?读者实际上已经在脚本中见过的,如图3-8所示。

 

图3-8  脚本中的3种数据类型

Unity中的数据类型

计算机可以存储各种各样的数据,而计算机对于不同类型的数据的存储和处理方式是不同的。因此,为了让计算机更好的处理指定的数据,最好为数据指定类型。C#中的数据类型可以分为图3-9所示的几大类。

 

图3-9  数据类型的分类

在Unity中常用的数据类型是简单值类型,如表3.1所示。

表3.1  简单值类型

 

为变量或者说属性设置类型的依据是,看看数据处于哪一个范围。例如,262只能使用long类型存储,但是对于50,可以使用所有的整型类型存储,这时就要看哪个类型最合适了。

Unity属性数据类型的体现形式

对于属性而言,不同数据类型的属性可以存储的数据种类不同,因此它在Inspector里的数据输入形式就会不同,如图3-10所示。

 

图3-10  Inspector视图里,不同种类的属性

  • q  int、float、double类型的数据都是数值,因此在未指定iValue、fValue和dValue所指代数据的具体值时,Unity会自动为属性赋值0;
  • q  string类型的数据是字符,因此在未指定strValue所指代数据的具体值时,Unity会自动为属性赋值“空字符”;
  • q  bool类型的值只可能是true或者false,因此Unity使用了一个复选框表示bValue所指代的数据,且默认设置其为false,当复选框被复选时,表示值为true;

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

C#开发Unity游戏教程之游戏对象的属性变量的更多相关文章

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

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  2. C#游戏开发高速新手教程Unity5.5教程

    C#游戏开发高速新手教程Unity5.5教程 试读文档下载地址:http://pan.baidu.com/s/1slwBHoD C#是微软公布的高级程序设计语言.这门语言和C语言一样,已经成为了大学计 ...

  3. 3ds Max光照纹理导入Unity的教程.

    原地址:http://www.cocoachina.com/gamedev/gameengine/2010/0531/1581.html 相信这个3ds Max光照纹理导入Unity的教程对游戏设计师 ...

  4. webstorm-前端javascript开发神器中文教程和技巧分享(转)

    webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享. webstorm8.0.3中文汉化版下载: 百度网盘下载:http://pan.baidu ...

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

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

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

    C#开发Unity游戏教程之判断语句 游戏执行路径的选择——判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...

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

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  8. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  9. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

随机推荐

  1. SQL Server深入理解“锁”机制

    相比于 SQL Server 2005(比如快照隔离和改进的锁与死锁监视),SQL Server 2008 并没有在锁的行为和特性上做出任何重大改变.SQL Server 2008 引入的一个主要新特 ...

  2. 数学:二次剩余与n次剩余

    二次剩余求的是这个东西 如果给定x,再给定若干个大的质数p,如果结果a相同,那么x是完全平方数? 给出别人的二次剩余的代码: /*poj 1808 题意: 判断平方剩余,即判断(x^2)%p=a是否有 ...

  3. mybatis 不整合spring 入门小例子

    先上一个搭建完的项目结构截图: 相对比较重要的配置文件有 db.properties , SqlMappingConfig.xml , mapper/User.xml , log4j.properti ...

  4. jenkins设置CSRF 协议(CRUMB值设置)

    在关闭“”调用出现Error 403 No valid crumb was included in the request 第一种解决方式是 关闭 csrf,如上图,去掉勾就可以,但是并不推荐. 第二 ...

  5. MySql数据库表设计规范

    建表规约 索引规约 SQL 语句 其他实战建议 选用utf8编码 建议使用InnoDB存储引擎 建议每张表都设置一个主键 建议字段定义为NOT NULL 唯一值字段要指定唯一性约束 ALTER TAB ...

  6. jQuery1.11源码分析(2)-----Sizzle源码中的正则表达式[原创]

    看完了上篇,对Sizzle有了一个大致的了解,我们接下来就可以正式开始啃Sizzle的源码了.上来就讲matcher难度太大,先来点开胃菜,讲讲Sizzle中的各个正则表达式的作用吧(本来还想讲初始化 ...

  7. Anaconda+django写出第一个web app(十一)

    今天我们来学习给页面添加一个Sidebar,根据Sidebar跳转到相应的tutorial. 打开views.py,编辑single_slug函数: def single_slug(request, ...

  8. [转]python ctypes 探究 ---- python 与 c 的交互

    近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...

  9. Java的IO文档

    1.     File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件 ...

  10. PowerDesigner显示Common注释列并自动赋值

    PowerDesigner中默认不显示Common注释列,可根据以下步骤显示并紫东填充Name列内容. 1.显示Common注释列 2.运行VB Script脚本自动赋值 使用Shift+Ctrl+X ...