我刚开始统一,遇到了一个问题,我不知道如何解决,甚至不知道出了什么问题。我的公共void函数从另一个脚本中获取变量并更新它们,但当在update函数中调用它时,这些变量不会更新,而是记录0。
public void statsImport(float XPImport)
{
float XPlevel = XPImport;
Debug.Log(XPlevel);
}
void Update()
{
Debug.Log(XPlevel);
}
当调用Debug.Log
时,会发生这种情况,表明它没有更新变量。
如有任何帮助,不胜感激。
我建议您花一些时间阅读C#中的变量作用域。您可以将这些看作是由{ }
包围的块。
当您在一个作用域内声明一个变量(例如使用float XPlevel = XPImport
(时,该变量只存在于该作用域的内:
public void statsImport(float XPImport)
{
// start new method scope
// declare variable `XPlevel` inside of that scope
float XPlevel = XPImport;
}
void Update()
{
// start new method scope
// `XPlevel` doesn't exist here
Debug.Log(XPlevel);
}
相反,您可能想要的是这样的东西,将XPlevel
作为类范围内的字段:
public class MyComponent : MonoBehaviour
{
// declare class-level field
private float XPlevel;
public void statsImport(float XPImport)
{
// `XPlevel` exists here
XPlevel = XPImport;
}
private void Update()
{
// `XPlevel` exists here
Debug.Log(XPlevel);
}
}
如果希望能够在编辑器中编辑XPlevel
的值,请添加[SerializeField]
标记。这与公开XPlevel
的效果相同,但只允许在脚本内部设置字段:
[SerializeField]
private float XPlevel;
一旦你对此感到满意,你也可以将XPlevel
作为一个属性:
[field: SerializeField]
public float XPlevel { get; private set; }