1.1 变量、数组与函数

变量

若不希望脚本中的public 变量显示在Inspector视图中,可为变量加上属性[HideInInspector] 如:

[HideInInspector]
public int speed;

如果希望限定一些值类型变量的取值范围,可以使用RangeAttribute来实现,RangeAttribute的形式为[Range(min,max)],这样,在Inspector视图中对变量值进行改动时,就只能在RangeAttribure限定的范围内变化。

[Range(0.0F,10.0F)]
public float speed=0.0F;

数组

数组的声明示例:

public int[] arr={1,2};
GameObject[] gos=new GameObject[10];
private string[] authors={"Tec","Wentell","Eric","Vincent"};

基于序号index的for循环和基于IEnumerable的foreach循环来访问数组中的元素:

for{int i=0;i<arr.Length;++i}
  Debug.Log(arr[i]);
foreach(var i in arr)
  print(i);

多维数组每一行的列数必须相等,下面为二维数组的示例:

//声明一个3*4的二维数组arr1
int[,] arr1=new int[3,4];
arr1[0,0]=10;
arr1[0,1]=20;
print(arr1,Length);  //输出12
//声明并初始化一个2*3的二维数组arr2
int[,] arr2=new int[2,3]{{1,2,3},{4,5,6}};
print(arr2.Length);  //输出6

交叉数组每一行的列数可以不相等,示例如下:

//声明一个三行的交叉数组
int[][] mArr1=new int[3][];  
mArr1[0]=new int[7]{1,2,3,4,5,6,7};  //为交叉数组mArr1一行元素赋值
print(mArr1.Length);   //输出为3
//声明并初始化一个三行的交叉数组
int[][] mArr2=new int[3][]{new int[3]{1,2,3},new int[5]{4,5,6,7,8},new int[4]{3,4,5,6}};
print(mArr2.Length);  //输出3
//声明一个4行的交叉数组,行数未指定,由编译器根据初始值推断
int[][] mArr3=new int[][]{new int[]{1,2},new int[]{3,4,5},new int[]{6,7,8,9},new int[]{10,20}};
//声明一个交叉数组,未初始化,未指定行数
int[][] mArr4;
foreach(var a in mArr2)
{  print(a.Length);  //输出每一行中元素的个数
   foreach(var b in a)
      print(b);      //输出每一行上的元素
}

交叉数组需要注意的是:

(1) 声明交叉数组时可以指定数组的行数,而列数不能指定。

(2) 交叉数组的长度(Length)等于行数。每一行的列数不固定。

(3) 交叉数组的每一行元素都是一个一维数组。


函数

函数声明形式为:

返回类型 函数名(参数列表)
{
   函数体
}

以下为C#脚本中的函数示例:

void Update()
{  
    if(Input.GetMouseButtonDown(0))
    {  
	  Vector2 p =Camera.main.ScreenToWorldPoint(Input.mousePosition);
	  print(string.Format("x={0},y={1}",p.x,p.y));
    }
}
public float Tax(float income,float ratio)
{  
   return(income-3500.0f)*ratio;
}

在C++语言中,参数的传递方式分为传值(pass by value)、传址(pass by address/pointer)和传引用(pass by reference), 而在C#函数中,只存在传值和传引用两种方式,其中传引用可由关键字ref和out来完成,两者的区别在于若用ref方式来传递参数, 则该实际参数必须先初始化,而通过out方式则不需要初始化,out参数也称为输出参数。

以下是两个Unity中的C#函数,其中函数UpdateName接收string类型的ref参数,而函数FindObject则接收GameObject类型的out参数。

public void UpdateName(ref string name)
{
   name="Unity book";
}
public void FindObject(string key,out GameObject target)
{
   if(dict.ContainsKey(key))
      target=dict[key];
   else 
      target=null;
}

要正确调用这两个函数,在传递参数时必须加上相应的关键字ref或out

string name="Hello,World";
UpdateName(ref name);
print(name);
string key="key";
GameObject obj;
FindObject(key,out obj);