Unity 应尽量避免去查找GameObject.所以在加载中可以事先存放在字典中,便于后续的使用
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public class UI_ctrl : MonoBehaviour
{
public Dictionary<string, GameObject> view = new Dictionary<string, GameObject>();
private void load_all_object(GameObject root, string path)
{
foreach (Transform tf in root.transform)
{
if (this.view.ContainsKey(path + tf.gameObject.name))
{
// Debugger.LogWarning("Warning object is exist:" + path + tf.gameObject.name + "!");
continue;
}
this.view.Add(path + tf.gameObject.name, tf.gameObject);
load_all_object(tf.gameObject, path + tf.gameObject.name + "/");
}
}
public virtual void Awake()
{
this.load_all_object(this.gameObject, "");
}
public void add_button_listener(string view_name, UnityAction onclick)
{
Button bt = this.view[view_name].GetComponent<Button>();
if (bt == null)
{
Debug.LogWarning("UI_manager add_button_listener: not Button Component!");
return;
}
bt.onClick.AddListener(onclick);
}
}
public class UIMgr : UnitySingleton<UIMgr>
{
private Transform canvas = null;
public override void Awake() {
base.Awake();
this.canvas = GameObject.Find("Canvas").transform;
}
public UI_ctrl ShowUIView(string name)
{
string path = "GUI/UI_Prefabs/" + name + ".prefab";
GameObject ui_prefab = (GameObject)ResMgr.Instance.GetAssetCache<GameObject>(path);
GameObject ui_view = GameObject.Instantiate(ui_prefab);
ui_view.name = ui_prefab.name;
ui_view.transform.SetParent(this.canvas, false);
int lastIndex = name.LastIndexOf("/");
if (lastIndex > 0)
{
name = name.Substring(lastIndex + 1);
}
/*当我们把地址通过resources.load加载进去之后,我们可以通过path.Substring(path.LastIndexOf('/')+1)
通过实例化生成的预设体后面有一个clone,用这个方法可以完美解决名称后面带clone的问题*/
Type type = Type.GetType(name + "_UICtrl");
UI_ctrl ctrl = (UI_ctrl)ui_view.AddComponent(type);
return ctrl;
}
}