脚本

思考并回答以下问题:
1.bit和Byte有什么区别?有什么关系?
2.有几种浮点类型?为什么float = 0.1f要加f?
3.C#中一个变量的作用范围是怎么判定的?
4.char类型和string类型赋值方式有什么不同?
5.前加加和后加加有什么区别?
6.为什么有时候不能进行隐式转换?
7.显式转换的语法是什么?
8.成员变量和局部变量的区别

Unity脚本(继承MonoBehaviour类)的脚本必须拖到GameObject上才能生效。如果没继承MonoBehaviour,就无需拖到游戏对象上

每次将脚本附加到GameObject上时,会使用这个脚本模具创建一个实例。

整数类型

整数又分为有符号整数和无符号整数,有符号整数会使用1位(bit)表示正负的符号,无符号整数会用所有的位数来表示数值,所以相同位数的数值,有符号和无符号能表示的数值范围有差别。举例如下:

  • sbyte 8位有符号整数,范围是[-128, 127]
  • byte 8位无符号整数,范围是[0, 255]
  • int 32位有符号整数,范围是-2,147,483,648到 2,147,483,647

1个bit(比特)代表计算机内的一个0或1
1个Byte(字节)= 8bit

一个sbyte的数值有8位,在计算机内部表示可能是01110111,一共有8位0/1的值。

一般在缩写时,小写字母b代表bit,大写字母B代表Byte,比如1KB=8Kb。

浮点类型

浮点类型可以认为是小数类型,有三种类型的浮点数类型,分别是:float、double和decimal。

这三种类型所占用的空间分别是32位,64位和128位,精度依次升高。不过在Unity中最常用的还是float,如果float精度不够时,可以尝试使用后两个类型。

浮点数在赋值时需要注意的是:默认C#中浮点数常量是double类型,比如3.14默认是double类型,当你将3.14赋值给float类型变量时会报错。

1
float pi = 3.14;

报错的内容是:error CS0664: Literal(字面量) of type double cannot be implicitly(隐式) converted to type ‘float’. Add suffix ‘f’ to create a literal of this type。

1
2
3
int a; //变量
const int b = 10; //b为常量,10为字面量
string str = "hello world!"; // str 为变量,hello world!为字面量

含义是:无法将double类型转换为float类型,需要将double类型手动转换为float类型。

这时候需要在3.14后面加上f,将3.14强制转换为float类型的数值。后面会讲解显示转换和隐式转换。

1
float pi = 3.14f;

字符类型

字符类型包括单个字符char和一串字符的字符串类型string。

1
2
char firstLetter; // 第一个字母
string playerName; // 玩家名字

字符和字符串的赋值方法如下,char类型需要使用单引号,string类型需要使用双引号。

1
2
char question = '?';
string stem = "编程使我快乐";

变量的作用范围

C#代码中变量的声明是有作用范围的,在特定的范围内才能获取、操作这个盒子。C#中变量按作用范围可以划分为成员变量和局部变量。

确定一个变量的作用范围很好记,一个变量的作用范围就是变量当前所处的大括号范围内。如下面代码中score的作用范围就是最外层的大括号,而hp的作用范围仅限于Start方法的大括号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyClass : MonoBehaviour
{
int score = 100;// 成员变量

// Use this for initialization
void Start ()
{
int hp = 100; // 局部变量
score = 50;
}

// Update is called once per frame
void Update ()
{
score = score + 1; // 这行代码正常
hp = hp + 1; // 这行代码会报错
}
}

上面这段代码中,Update方法中的第二行代码会报错,因为hp的作用范围仅限于Start方法中,无法在Update中获取。

运算符

+(一元)运算符可能看起来有些奇怪,因为它不会改变运算的结果,不过把值变为正的,而是仍旧保持原始值。例如var2是-1,则+var2的结果还是-1。这个运算符只在运算符重载时有用,后面会讲到。

特别注意除法操作,在大多数编程语言中,如果两个int类型的数相除,结果还是int类型,会丢失小数部分。如果想要保留小数部分,需要手动将int类型转为float或double类型以保留小数。

1
2
Debug.Log(10/3); // 3
Debug.Log(10/3f); // 3.333...

只有加号能用于字符串的连接,其他运算符不能用于处理字符串。

前加加与后加加的区别可以记为:前加加是先加后赋值,后加加是先赋值后加。

1
2
3
4
float var1 = -2, var2 = 7.21f; // 可以在同一行进行声明和初始化

Debug.Log(var1++); // 先返回var1的值,再+1,成为-1
Debug.Log(++var1); // 先+1成为0,再返回var1的值

类型转换

无论是什么类型,在计算机内部,所有的数据都是由0和1构成的。一个变量具体代表的内容是由解释这些数据的方式来确定的。比如char类型和ushort类型,这两种类型存储方式完全相同,都存储0-65535之间的数字,但是一个代表的是字符,另外一个是数字。

有时候需要对数据的类型进行转换,有以下两种形式:

  • 隐式转换 从类型A到类型B的转换不需要额外的代码,可以自动执行转换。
  • 显示转换 只能在某些情况下转换,需要额外写代码。

隐式转换

1
2
int a = 10;
float b = a;

如上面两行代码,a是int类型的变量,b是float类型的变量,但是可以直接将a赋值给b。

无法隐式转换时,编译器会报错。

比如下方的代码:

1
2
float a = 10;
int b = a;

float类型只能隐式转换为double类型,如果转为int类型,就会报如下错误:

error CS0266: Cannot implicitly convert type `float’ to `int’. An explicit conversion exists (are you missing a cast?)

那么能不能把float转成int呢?答案是可以的,但是必须显式转换。

显式转换

显式转换就是通过明确的代码,将一种数据类型转换为另一种数据类型。

如上面的代码,可以通过显式转换的方式转换数据类型:

1
2
float a = 10.1f;
int b = (int)a;

显式转换的语法是:

1
(<数据类型>)<变量名>

需要显式转换的情况一般都是:转换时会发生数据或数据精度丢失。比如double类型的数据精度比float类型精度高,从double转为float类型时,需要显式转换。

上面的代码转换时,由于b是整数类型,变量a值为10.1的小数部分会丢失,b的值是10。

10.1f中的f也是一种显示转换,这种显示转换只能用于字面值(即字面就代表了数值的常量)。一般只在对float类型的变量赋值时使用。

0%