如何访问其他脚本的值而不出现以下错误:CS0120:非静态字段需要对象引用



我想从脚本Conrol访问脚本ChangeCamera。我想访问front_depth的值,我从如下定义的更新函数中删除了它:

float front_depth = 0.5f;
void Update () {
//something
}
//in  the control script i did:
class Control : MonoBehaviour
{  
myMainCamera.GetComponent<ChangeCamera>();
ChangeCamera.front_depth; 
}

但我得到了错误CS0120:非静态字段、方法或属性"ChangeCamera.front_depth"需要对象引用

如果没有实例(对象引用(,就无法访问非静态变量,为此必须将实例存储在变量中,"var";将决定适合您的对象类型,然后您从刚刚创建的变量访问公共字段

var component = myMainCamera.GetComponent<ChangeCamera>();
component.front_depth; 

在另一个脚本中,您需要将变量放置在update方法之外并将其公开,您可以将其放置在类的开头。

class ChangeCamera : MonoBehaviour
{
public float front_depth = 0.5f;

void Update()
...
}

否则

您只需将变量设置为静态,然后在没有类实例的情况下访问它。

class ChangeCamera : MonoBehaviour
{
public static float front_depth = 0.5f;

void Update()
...
}

在另一个脚本上,你只需要这个代码

ChangeCamera.front_depth = 0.5f;

在这种情况下,如果你只有一台相机,这可能是明智的选择,但如果你分享你的代码,任何人都会更容易帮助你。

附言:请记住,你不能使用在方法之外创建的变量。就像你不能在类之外使用私有变量一样。

我假设您的ChangeCamera脚本看起来像这样:

public class ChangeCamera : MonoBehaviour
{
void Update()
{
float front_depth = 0.5f;
//... other code
}
}

如果需要从Update((方法外部访问该变量,最好在更高级别定义该变量。像这样:

public class ChangeCamera : MonoBehaviour
{
float front_depth = 0.5f;
void Update()
{
//... other code
}
}

该变量仍然可以在Update方法内部访问,但front_depth存储在Class级别,因此可以通过单独的方法getters/ssetters或将其公开,使其他脚本可以访问该变量。

使其可供外部脚本访问的最简单方法是将其公开:

public class ChangeCamera : MonoBehaviour
{
public float front_depth = 0.5f;
void Update()
{
//... other code
}
}

使用公共变量,您可以按照上面所写的方式从其他脚本访问该变量:

myMainCamera.GetComponent<ChangeCamera>();
ChangeCamera.front_depth;

您可以读取/写入一个公共变量,因此这将允许您更改它,或将其值存储在另一个变量中:

ChangeCamera.front_depth = 1.0f; //Changing the front_depth from an external script
float cachedDepth = ChangeCamera.front_depth; //Caching (storing) the front_depth value in a separate variable.

对于简单的变量,这通常就足够了。对于复杂系统,将变量包装为属性可能是有益的(并且被认为是最佳实践(。属性允许您对外部脚本对本地变量的访问权限进行精细控制。

public class ChangeCamera : MonoBehaviour
{
private float front_depth = 0.5f; //You don't need to specify it as private, but I like to anyways
// Front_Depth is a property that provides access to front_depth in a controlled manner
public float Front_Depth
{
//property READ function
get 
{
return front_depth;
}
//property WRITE function
set
{
front_depth = value;
}
}
void Update()
{
//... other code
}
}

您现在可以从外部访问该变量,其作用相同:

ChangeCamera.Front_Depth; 

使用一处房产而不仅仅是公开它有什么好处好吧,您可以通过删除set函数来阻止对变量的写访问,同时提供读访问。您还可以在get/set函数中添加额外的逻辑,以便在读取或写入变量时执行额外的步骤(如在分数更新时保存游戏,或写入日志(。

最新更新