Skip to content

作用域

unity-csharp-scope-system

作用域是什么

作用域就是:一个变量、方法、类的名字,在哪些代码范围内能被看见、能被使用。

你可以把 { } 理解成房间:

c
void Update()
{
    float move = 1f;
}

move 写在 Update() 这个房间里,出了这个房间就不能用了。

局部变量

写在方法里,只能在方法里用:

c
void Update()
{
    float speed = 5f;
    Debug.Log(speed);
}

// 这里不能用 speed

写在 if / for / while{ } 里,只能在这个代码块里用:

c
if (hp <= 0)
{
    string message = "死亡";
    Debug.Log(message);
}

// 这里不能用 message

字段 Field

字段写在类里面、方法外面,同一个类里的多个方法都能用:

c
public class Player : MonoBehaviour
{
    private int hp = 100;

    void TakeDamage(int damage)
    {
        hp -= damage;
    }

    bool IsDead()
    {
        return hp <= 0;
    }
}

hp 是字段,它属于这个 Player 对象。

参数的作用域

参数只在这个方法内部有效:

c
void TakeDamage(int damage)
{
    hp -= damage;
}

// 这里不能用 damage

damage 是外面调用方法时传进来的临时数据。

作用域和访问权限不是一回事

作用域:名字在哪里存在。 访问权限:外部代码能不能访问它。

常见访问修饰符:

c
private   // 只有当前类能访问
public    // 外部也能访问
protected // 当前类和子类能访问
internal  // 同一个程序集能访问

Unity 新手推荐:字段默认用 private,需要 Inspector 调整时用:

c
[SerializeField] private float moveSpeed = 5f;

这表示:Inspector 能看到,但其他脚本不能随便直接改。

常见坑:同名遮蔽

c
private int hp = 100;

void Start()
{
    int hp = 50;
}

这里 Start() 里的 hp 是新的局部变量,不是外面的字段。

如果参数和字段同名,可以用 this 区分:

c
private int hp;

void SetHp(int hp)
{
    this.hp = hp;
}

this.hp 是字段,右边的 hp 是参数。

小练习

写一个 PlayerHealth.cs

c
[SerializeField] private int maxHp = 100;
private int currentHp;

void Start()
{
    currentHp = maxHp;
}

public void TakeDamage(int damage)
{
    currentHp -= damage;
}

然后想清楚:maxHpcurrentHpdamage 分别在哪些地方能被使用。

参考链接:

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0