一般我的做法是 一个窗口身上挂一个类,那么这个类主要负责管理该窗口上所有的UI,那么这个类既然能管理子控件,那么肯定是已经得到了子控件
两种方法获取 子控件
1 在脚本中 public 定义一些变量 然后拖动赋值
2 通过Find查找方式
但是,有时候你会发现别人这样写,找到场景对象后,进行一层封装
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Reflection;
using System;
public class xuhaitaoWindow : MonoBehaviour {
public class myButtonGroup
{
public Button Button01;
public Button Button02;
public Button Button03;
}
public class myTextGroup
{
public Text Text01;
public Text Text02;
public Text Text03;
public Text Text04;
}
private myButtonGroup btnGroup=new myButtonGroup();
private myTextGroup txtGroup = new myTextGroup();
// Use this for initialization
void Start () {
InitializeComponent(btnGroup);
InitializeComponent(txtGroup);
btnGroup.Button01.GetComponent<Button>().onClick.AddListener(dianJi);
}
public void dianJi()
{
print("wo shi xu hai tao");
}
public void InitializeComponent(object obj)
{
Type t = obj.GetType();
string child01Name = "";
foreach (Transform item in this.transform)
{
if (t.Name.Contains(item.name))
{
child01Name = item.name;
}
}
FieldInfo[] finfos = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (FieldInfo finfo in finfos)
{
GameObject obje = GameObject.Find(this.name + "/" + child01Name + "/" + finfo.Name);
if (obje == null)
{
throw new Exception("实例化组件失败 " + this.name + "/" + child01Name + "/" + finfo.Name + " 请检查改层级下的UI命名是否正确");
//return;
}
finfo.SetValue(obj, obje.GetComponent(finfo.FieldType));
}
}
}
其实 在一定命名规矩的保证下,结合查找,将对应的场景对象放入封装类对象中
个人不推荐下面这种找到某个场景对象后,再封装到一个大的对象中的做法
FR:海涛高软(QQ技术交流群:386476712)