C# CS0120试图在其他脚本上调用方法,但产生了此错误
我对编码非常陌生,所以如果有任何术语错误,我深表歉意。代码试图将bool从false改为true(稍后它会做一些更重要的事情,但我在做这件事时遇到了问题,这要简单得多)。如果这改变了什么,我会团结一致C# CS0120试图在其他脚本上调用方法,但产生了此错误,c#,unity3d,C#,Unity3d,我对编码非常陌生,所以如果有任何术语错误,我深表歉意。代码试图将bool从false改为true(稍后它会做一些更重要的事情,但我在做这件事时遇到了问题,这要简单得多)。如果这改变了什么,我会团结一致 using System.Collections; using System.Collections.Generic; using UnityEngine; public class AnimalPositionalUpdates : MonoBehaviour { public Po
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimalPositionalUpdates : MonoBehaviour
{
public PositionArrays ScripBeingAcessed;
// Use this for initialization
void Start()
{
//Find where the position is going to be input
int ArrayPosition = ScripBeingAcessed.FoodPosition.Length + 1;
PositionArrays.PositionBeingUpdated = transform.position;
}
// Update is called once per frame
void Update ()
{
}
}
第二个脚本(我正试图影响的脚本)
任何帮助都将不胜感激。据我所知,我在尝试使用静态方法(比如实例)时遇到了一些问题???Idk,其中它开始是静态的,并且在这两者的方法声明中放置static只会导致引用不同组件的相同错误再次出现
错误出现在第一个脚本的第16行
完整错误消息
“CS0120非静态字段、方法或属性的PositionArrays需要对象引用。PositionBeingUpdated'16 Active”显然,您缺乏面向对象的基础知识,因此需要立即深入Unity开发。你可以这样做,但我想如果你没有正确地学习Unity,它会玷污你的C#。话虽如此,您当然可以这样做,但我建议您先学习适当的C#,然后使用这种有时不常见的统一风格 关于如何使用类的字段存在一些混淆,所以让我解释一下:通常,类是一个蓝图,您可以创建实例。所有这些实例都遵循该蓝图,该蓝图准确地告诉您如何使用这些实例(有时称为隐式接口)以及它们包含哪些数据(这是Unity有点马虎的地方)。一个实例将数据与您用来访问和操作数据的方法捆绑在一起,您“总是”需要一个实例来访问这些成员,通常是通过一个变量 在您的情况下,此变量是
ScripBeingAccessed
。这是保存实例的变量(至少如果您没有忘记分配它),因此,您需要该变量来访问字段PositionBeingUpdated
void Start()
{
//找到要输入的位置
int ArrayPosition=ScripBeingAccessed.FoodPosition.Length+1;
ScripBeingAccessed.PositionBeingUpdated=转换.position;
}
在static上
除了构成创建实例的实际蓝图的类的成员之外,还有通过类本身访问的成员。这些称为静态成员。无论如何,因为它们没有绑定到实例,所以包含任何数据的静态成员都是相同的,无论从何处访问它们。如果静态成员是私有的(只有该类的实例可以访问),这可能没问题,但我会避免它,因为这会创建一个全局状态,不安全地从其他类进行操作,从而导致难以调试的错误。您能提供完整的错误消息吗?您确定不打算使用
ScripBeingAccessed.PositionBeingUpdated=transform.position代码>?修复了它,非常感谢!你试过自己做研究吗?->
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PositionArrays : MonoBehaviour {
public bool PositionInProcess = false;
public Vector3 PositionBeingUpdated;
public Vector3[] FoodPosition = new Vector3[0];
// Use this for initialization
void Start () {
}
public void ArrayPosUpdate()
{
PositionInProcess = true;
}
// Update is called once per frame
void Update ()
{
}
}