C# CS0120试图在其他脚本上调用方法,但产生了此错误

C# CS0120试图在其他脚本上调用方法,但产生了此错误,c#,unity3d,C#,Unity3d,我对编码非常陌生,所以如果有任何术语错误,我深表歉意。代码试图将bool从false改为true(稍后它会做一些更重要的事情,但我在做这件事时遇到了问题,这要简单得多)。如果这改变了什么,我会团结一致 using System.Collections; using System.Collections.Generic; using UnityEngine; public class AnimalPositionalUpdates : MonoBehaviour { public Po

我对编码非常陌生,所以如果有任何术语错误,我深表歉意。代码试图将bool从false改为true(稍后它会做一些更重要的事情,但我在做这件事时遇到了问题,这要简单得多)。如果这改变了什么,我会团结一致

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 ()
    {
        
    }

}