访问非静态成员需要一个对象引用,Sigleton无法正常工作

时间:2017-03-20 12:44:23

标签: c# unity3d

我正在努力使我的Canvas Manager工作,但即使在我制作一个Singleton之后它也会给我同样的错误。 这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class CanvasMgr : MonoBehaviour {
    [SerializeField]
    private GameObject defultUI;
    [SerializeField]
    private GameObject upgradeUI;

    public GameObject UpgradeUI { get => upgradeUI; set => upgradeUI = value; }
    public GameObject DefultUI { get => defultUI; set => defultUI = value; }

    public static void Refresh () { 
        if (ValueHolder.upgrademenuopen){
            DefultUI.SetActive (false);
            UpgradeUI.SetActive (true);
        }
        if(!ValueHolder.upgrademenuopen){
            DefultUI.SetActive (true);
            UpgradeUI.SetActive (false);
        }
    }
}

编辑:谢谢,这是我的最终代码: 因为我懒惰,我最终变得愚蠢而不是为了更好的c#课程。如果我能给你一个教训:不要去简单的“5天编码课程”,而是去“综合c#课程”。谢谢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class CanvasMgr : MonoBehaviour {
private CanvasMgr() { }
private static CanvasMgr instance = null;
public static CanvasMgr Instance
{
    get
    {
        if (instance == null)
        {
            instance = new CanvasMgr();
        }
        return instance;
    }
}

[SerializeField]
private GameObject defultUI;
[SerializeField]
private GameObject upgradeUI;

public GameObject UpgradeUI { get => upgradeUI; set => upgradeUI = value; }
public GameObject DefultUI { get => defultUI; set => defultUI = value; }

public void Refresh () { 
    if (ValueHolder.upgrademenuopen){
        DefultUI.SetActive (false);
        UpgradeUI.SetActive (true);
    }
    if(!ValueHolder.upgrademenuopen){
        DefultUI.SetActive (true);
        UpgradeUI.SetActive (false);
    }
 }
}

1 个答案:

答案 0 :(得分:3)

这不是单身人士课程。你应该这样做:

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class CanvasMgr : MonoBehaviour {
    private CanvasMgr() { }
    private static CanvasMgr instance = null;
    public static CanvasMgr Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new CanvasMgr();
            }
            return instance;
        }
    }

    [SerializeField]
    private GameObject defultUI;
    [SerializeField]
    private GameObject upgradeUI;

    public GameObject UpgradeUI { get => upgradeUI; set => upgradeUI = value; }
    public GameObject DefultUI { get => defultUI; set => defultUI = value; }

    public void Refresh () { 
        if (ValueHolder.upgrademenuopen){
            DefultUI.SetActive (false);
            UpgradeUI.SetActive (true);
        }
        if(!ValueHolder.upgrademenuopen){
            DefultUI.SetActive (true);
            UpgradeUI.SetActive (false);
        }
    }
}`

现在你可以调用CanvasMgr.Instance.Refresh()。