C# Unity Error[错误CS0120:非静态字段、方法或属性'Zoney.setMonney(int')需要对象引用]

C# Unity Error[错误CS0120:非静态字段、方法或属性'Zoney.setMonney(int')需要对象引用],c#,unity3d,C#,Unity3d,我不断地得到这个错误,但我甚至不知道在这个上下文中什么是静态的,什么不是静态的?我尝试过设置实例和检查大小写之类的解决方案,但我也遇到了同样的错误。我希望shop脚本更改monney值,该值将写入debug,直到我设置正确的U.I Zoney脚本: using UnityEngine; using UnityEngine.UI; public class Zoney : MonoBehaviour { public Text Money;

我不断地得到这个错误,但我甚至不知道在这个上下文中什么是静态的,什么不是静态的?我尝试过设置实例和检查大小写之类的解决方案,但我也遇到了同样的错误。我希望shop脚本更改monney值,该值将写入debug,直到我设置正确的U.I

Zoney脚本:

    using UnityEngine;
    using UnityEngine.UI;
    
    public class Zoney : MonoBehaviour
    {
        public Text Money;
        public int Monney;
        private string Mony;
        
        // Start is called before the first frame update
        void Start()
        {
            Money = GetComponent<Text>();
        }

        public void setMonney(int Change) 
        {
            Monney = Change;
        }   
        
        // Update is called once per frame
        void Update()
        {          
            Mony = Monney.ToString();
            Money.text = Mony;
        }
    }

Zoney是一个类,在使用它之前需要先创建它的实例

同样非常重要的是,您需要更新您的店铺对象,使其将Zoney实例作为成员对象,否则您对money的更新将无法保留: i、 e


感谢@derHugo的提醒

您需要从Zoney类创建一个对象来访问它的非静态成员。请尝试以下内容:

public class Shop : MonoBehaviour
{

    public int Change;
    public Zoney myZoney; // Need to create the object
    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        Change += 1;
      myZoney.setMonney(Change); // Access members using created object
      Debug.Log(Change);
    }
}

因为您使用的是Unity,所以需要遵循引擎的要求

在这种情况下,如果您需要组件MonoBehavior的实例,您确实希望引用Unity创建的实例,而不是使用new关键字创建新实例。使用new关键字创建一个组件的实例将给您留下一个与任何Unity游戏对象都没有关联的类实例

获取要引用的组件的更可靠的方法是使用Inspector窗口,并将所需对象上的正确组件拖动到对象字段中。在本例中,我假设您希望将层次中的场景对象拖动到对象字段槽中

您可以通过首先定义一个变量来实现这一点。这通常可以通过以下两种方式之一实现:

公共区; [字段]私人Zoney Zoney; 在本例中,分配引用后,请使用变量zoney,而不是类名zoney。请注意,您的变量名可以是您认为合适的任何其他名称,例如_zoney或myZoney

然后,您的新商店脚本可能如下所示:

    public class Shop : MonoBehaviour
    {
        public int Change;
        public Zoney zoney;
    
        void Update()
        {
          Change += 1;
          zoney.setMonney(Change);
          Debug.Log(Change);
        }
    }

不禁止通过关键字new创建MonoBehavior的实例!见例。这样做需要解决很多问题;谢谢我一定是在方向盘上睡着了@不!禁止通过关键字new创建MonoBehavior的实例!见例。这样做需要解决很多问题;这个错误是不言自明的。如果要调用非静态成员,则需要使用对类实例的引用。请参阅副本。Unity3d在创建实例的要求方面有一些特点,因此假设您不能使成员保持静态,您必须查看Unity3d的具体建议,以了解如何获取所需的引用。否!禁止通过关键字new创建MonoBehavior的实例!见例。这样做需要解决很多问题;谢谢你指出这一点。我编辑了答案。
public class Shop : MonoBehaviour
{

    public int Change;
    public Zoney myZoney; // Need to create the object
    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        Change += 1;
      myZoney.setMonney(Change); // Access members using created object
      Debug.Log(Change);
    }
}
    public class Shop : MonoBehaviour
    {
        public int Change;
        public Zoney zoney;
    
        void Update()
        {
          Change += 1;
          zoney.setMonney(Change);
          Debug.Log(Change);
        }
    }