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