静态成员,如变量和方法,是跨类的所有实例共享的成员。
此外,静态成员可直接通过类访问,无需先对类的对象进行实例化。
静态变量
通常,成员变量对于类的每个对象是唯一的,虽然类的每个对象具有相同的变量,但它们各有自己的值。然而,对于静态变量,类的每个对象具有相同的变量和相同的值。因此,如果在一处更改某个静态变量的值,则所有其他静态变量的值也将更改。
假设你想知道Enemy
类中实例化了多少个对象,一种简单的方法是,使用名为enemyCount
的静态成员变量。将关键词static输入到成员声明中,即表示声明这是静态的,因此它属于类本身,而不属于类的任何示例,然后,每次创建enemy
对象时,都需要让这个变量递增,由于每个对象都让同一个变量递增,因此它将包含已创建的所有敌人总数,访问该静态变量也非常简单。
public class Enemy
{
public static int enemyCount = 0;
public Enemy()
{
enemyCount++;
}
}
这是一个Game
类,其中创建了几个敌人,为了弄清创建了多少个敌人,我们只需使用类的名称和点运算符来访问enemyCount
静态变量。在本例中enemyCount
变量等于3。
public class Game
{
void Start()
{
Enemy enemy1 = new Enemy();
Enemy enemy2 = new Enemy();
Enemy enemy3 = new Enemy();
int x = Enemy.enemyCount;
}
}
这个过程也适合要用做游戏对象组建的脚本。例如,如果要了解在某个场景中创建的玩家数量,我们可以创建一个玩家脚本组件。在这个脚本中,我们可以声明静态变量playerCount,
在start
方法中,让这个变量递增。现在,只要创建这个脚本关联的游戏对象,玩家总数就会增加。
public class Player : MonoBehaviour
{
public static int playerCount = 0;
void Start()
{
playerCount++;
}
}
在另一个脚本中,我们可以使用脚本的名称和点运算符来访问这个静态变量。
public class PlayerManager : MonoBehaviour
{
void Start()
{
int x = Player.playerCount;
}
}
静态方法
与静态变量一样,静态方法属于类,而不属于类的特定对象。
举一个非常简单的例子:
假设有一个名为Utilities
的类,在这个类中有一个名为Add
的静态方法,他返回两个数字相加得到的结果。你可以通过方法Add
前面的static
关键字来判断它是静态的。
public static class Utilities
{
public static int Add(int num1,int num2)
{
return num1 + num2;
}
}
现在,在另一个类中,你可以使用类的名称和点运算符来调用Add
方法,无需通过实例化类的对象来使用其静态成员。
public class UtilitiesExample : MonoBehaviour
{
void Start()
{
int x = Utilities.Add(5,6);
}
}
有可能你已经使用过静态方法,只是自己还没有意识到。回顾在Unity中使用Input
的情景。Input.GetAxis
Input.GetKey
和Input.GetButton
等方法都是静态方法,之所以可以判断这些是静态方法,因为不需要通过实例化Input
类来使用它们。
事实上,Unity提供了许多静态方法,从而为您提供多种实用工具和功能。需要注意的是,不能在静态方法内部使用非静态成员变量
记住,静态方法属于类,而非静态变量属于类的实例。
静态类
你也可以使整个类成为静态,只需将关键词static置于类名称前面即可。结果是,类成为静态的,并且不能创建类的实例,如果想要使类完全由静态成员变量和方法组成,如Input
类,则这样非常有用。