我想从脚本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函数中添加额外的逻辑,以便在读取或写入变量时执行额外的步骤(如在分数更新时保存游戏,或写入日志(。