使用固定数字

本文关键字:数字 | 更新日期: 2023-09-27 18:30:24

我只是想知道在脚本开始时调用时如何制作一个永不更改的数字?

因此,一旦您从 Awake() 或 Start() 中定义了它,我怎样才能使数字固定下来?即使是函数也无法改变它。

我不想提供一个确定的数字,比如 2 或 5 或 100 甚至 1000000 我想创建一个变量,以便我可以在 Awake()Start() 函数中更改它。并在整个脚本中保持固定。

这可能吗?

使用固定数字

简短的回答是你不能用你描述的方式做到这一点,你能做的最接近的事情是使用只读字段和一个构造函数

public class Foo
    {   
        public readonly int myInt;   
        public Foo()
        {
            myInt = 1;
        }
        public void doBad()
        {
            myInt = 1213; // Not allowed
        }
    }

如果绝对需要,您可以执行以下操作,但请注意,这是一种可怕的模式,并不能确保它仅在"开始"设置时设置。你不应该这样做!!!!

public class Foo2{
    private bool calledOnce = false;
    private int _myInt;
    public readonly int myInt{
        get {return _myInt;}
        set {
            if (calledOnce){
                throw new Exception("Not allowed");
            }else{
                _myInt = value;
                calledOnce = true;
            }
        }
    }
    public void start()
    {
        myInt = 1213;
    }
    public void doBad()
    {
        myInt = 1213; // will throw
    }

万一大写字母不明显,做第二件事是一个非常糟糕的主意,并且反映了代码中的很多问题,并且很可能是奇怪错误的根源,但是一旦进入蓝月亮,就需要一些可怕的奇怪代码来处理一个非常奇怪的问题, 但我猜这不是其中一种情况。最好重新思考整个问题,更好地了解真正的需求是什么。

如果你想

Awake()Start()中设置它,那么按照这个逻辑,你想要的是一个常量变量。由于您无法将参数传递给这两个函数,因此根据该逻辑,变量应该是常量,并且在编译时已知其值。

const int WHAT_WANT = 11011;

此外,当类是MonoBehaviour时,使用构造函数也不安全。因此,readonly是一个糟糕的主意。

(ps Awake and Start 暗示 OP 正在使用 MonoBehavior)