首页 > 解决方案 > CS0120 尝试调用不同脚本上的方法,但产生此错误

问题描述

我对编码很陌生,如果有任何术语错误,我深表歉意。该代码正在尝试将 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 ()
    {
        
    }
}

第二个脚本(我试图影响的那个)

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

}

任何帮助,将不胜感激。据我所知,我尝试使用像实例这样的静态方法存在一些问题???Idk 从哪里开始是静态的,并且将 static 放在两者的方法声明中只会导致相同的错误再次出现引用不同的组件。

错误在第一个脚本的第 16 行。

完整的错误信息

“CS0120 非静态字段、方法或属性 'PositionArrays.PositionBeingUpdated' 16 活动需要对象引用”

标签: c#unity3d

解决方案


显然,您缺乏 OOP 的基础知识并立即深入研究 Unity 开发。你可以这样做,但我猜如果你没有正确学习 Unity 中的编程会污染你的 C#。话虽如此,你当然可以做到,但我建议先学习正确的 C#,然后使用有时不常见的 Unity 风格。

关于如何使用类的字段存在一些混淆,所以让我解释一下:通常,类是您可以创建实例的各种蓝图。所有这些实例都遵循该蓝图,它准确地告诉您如何使用这些实例(这有时称为隐式接口)以及它们包含哪些数据(这是 Unity 有点草率的地方)。一个实例将数据与您用来访问和操作数据的方法捆绑在一起,您“总是”需要一个实例来访问这些成员,通常是通过一个变量。

在你的情况下,这个变量是ScripBeingAcessed. 这是保存您的实例的变量(至少如果您没有忘记分配它),因此,您需要该变量来访问该字段PositionBeingUpdated

void Start()
{
    //Find where the position is going to be input
    int ArrayPosition = ScripBeingAcessed.FoodPosition.Length + 1;

    ScripBeingAcessed.PositionBeingUpdated = transform.position;
}

static

除了构成要从中创建实例的实际蓝图的类成员之外,还有一些成员可以通过类本身访问。这些被称为静态成员。无论如何,由于它们未绑定到实例,因此无论您从何处访问它们,包含任何数据的静态成员都是相同的。如果静态成员是(只有该类的实例可以访问它),这可能很好,private但否则我会避免它,因为这会创建一个全局状态,从其他类操作它是不安全的,因此可能导致难以调试错误。


推荐阅读