第一章
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);