【C#中级教程(Unity官方)】静态

静态成员,如变量和方法,是跨类的所有实例共享的成员
此外,静态成员可直接通过类访问,无需先对类的对象进行实例化。

静态变量

通常,成员变量对于类的每个对象是唯一的,虽然类的每个对象具有相同的变量,但它们各有自己的值。然而,对于静态变量,类的每个对象具有相同的变量和相同的值。因此,如果在一处更改某个静态变量的值,则所有其他静态变量的值也将更改

假设你想知道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.GetKeyInput.GetButton等方法都是静态方法,之所以可以判断这些是静态方法,因为不需要通过实例化Input类来使用它们。

事实上,Unity提供了许多静态方法,从而为您提供多种实用工具和功能。需要注意的是,不能在静态方法内部使用非静态成员变量

记住,静态方法属于类,而非静态变量属于类的实例。

静态类

你也可以使整个类成为静态,只需将关键词static置于类名称前面即可。结果是,类成为静态的,并且不能创建类的实例,如果想要使类完全由静态成员变量和方法组成,如Input类,则这样非常有用。

猜你喜欢

转载自blog.csdn.net/weixin_64072619/article/details/131638975