unity3d 在不同的类和文件中定义私有浮点数的值

3phpmpom  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(170)
public class LevelLighting
{
    public static float nightvisionFogIntensity;

    private static float auroraBorealisCurrentIntensity;
}

在C#中
这是这个类的一小部分代码,我想修改和实现的值是auroraBorealisCurrentIntensity,但是它是私有的,所以它告诉我在这个类中没有它的定义,有什么方法可以使用这个值,即使它是私有的吗?
我不能编辑上面的代码,只有我自己的代码需要引用上面的代码。

LevelLightning.nightvisionFogIntensity = 1f;

这是可行的,因为nightvisionFogIntensity是公共的

LevelLighting.auroraBorealisCurrentIntensity = 1f;

这不起作用,因为北极光电流强度是私有的。
谢谢你的帮助。

sr4lhrrt

sr4lhrrt1#

首先,我需要警告您,更改不应该更改的私有字段是危险的,可能导致目标对象的意外行为。
也就是说,如果你仍然想这么做,我认为唯一的方法是使用反射。我准备了一个小例子。下面是你的类的一个版本,它有一个方法PrintBorealisValue()来帮助我们显示修改后的结果:

public class LevelLightening
{
    public static float nightvisionFogIntensity;

    private static float auroraBorealisCurrentIntensity;

    public static void PrintBorealisValue()
    {
            Console.WriteLine(auroraBorealisCurrentIntensity);
    }
}

现在,让我们示例化这个类的一个对象,并更改它的私有变量:

LevelLightening.PrintBorealisValue(); // prints "0"

var borealisField = typeof(LevelLightening)
                            .GetField("auroraBorealisCurrentIntensity", BindingFlags.NonPublic | BindingFlags.Static);
// will be a good idea to check "borealisField" for null here
borealisField.SetValue(null, 3.14f); 

LevelLightening.PrintBorealisValue(); // prints "3.14"

同样值得注意的是,使用反射通常比不使用反射做同样的事情要慢(这是很明显的)。

相关问题