Unity:获取UI对象的实例

时间:2017-11-19 13:56:44

标签: c# unity3d

我有一个用于游戏对象的单一类,我用于GameManager或Camera就像普通对象。如果它是null,它使用FindObjectOfType()函数创建实例。游戏对象的一切都很棒。现在我试图将一个面板保持在游戏对象上方的画布下面。所以我需要一个实例到面板。我已编写的单例类在附加到面板时返回null。如何将实例添加到面板?

2 个答案:

答案 0 :(得分:0)

您可以通过使用GameObject类型在单例类中声明来获取面板实例。

还有另一种方式。 你说你可以从singleton类中获取游戏对象的实例。 面板位于该游戏对象之上。

所以,你可以像这样得到那个小组。

GameObject panel = SingletonClass.Instance.GetGameObject().transform.parent.gameobject;

这将返回面板游戏对象。您可以通过正常方式获取面板组件。

如,

panel.GetComponent<Image>();

答案 1 :(得分:0)

仅是一个建议,在运行时使用FindObjectOfType()不是一个好习惯,特别是如果游戏中有很多对象,因为它可能会导致性能问题。如果您仅在设置时执行一次,则可以忽略此建议。

您可以做的一件事是使UIContainer单例成为MonoBehaviour。然后,让UIContainer具有GameObject的序列化数组,并从UIContainer中获取UI实例。然后,您将UI实例分配给序列化数组。

public class UIContainer : MonoBehaviour {
    private static UIContainer instance = null;
    public static UIContainer Instance {
        get {
            return instance;
        }
    }

    [SerializeField] GameObject[] uiInstances;

    void Awake() {
        instance = this;
    }

    void OnDestroy() {
        instance = null;
    }

    public GameObject GetUI(string uiName)
    {
        GameObject ui = null;
        foreach(GameObject inst in uiInstances){
            if(inst.name == uiName){
                ui = inst;
                break;
            }
        }
        return ui;
    }
}

然后,如果您需要UI实例,则只需调用UIContainer.Instance.GetUI("ui name");

这只是其中的一个示例,因此可以自己制作或调整。如果您的用户界面是由预制件制成的,这也可以工作。只需将阵列从实例更改为预制,但是您必须从那里进行实例化逻辑。保留实例的引用,然后在使用GetUI时使用该引用。