5.控件查找
5.1 知识点
在点击生成时,获取选择的对象
private static void CreateToolPanel()
{
UIPanelTool win = EditorWindow.GetWindow<UIPanelTool>("自动生成面板脚本工具");
win.Show();
// 对面板上显示的相关信息进行初始化
// 需要自动生成的代码在这里就应该拼接好
win.InitInfo();
}
public void InitInfo()
{
// 获取选择的对象
GameObject obj = Selection.activeGameObject;
if (obj == null)
return;
}
获取选择的对象下的相关UI控件,将相关逻辑封装成对应方法。
public void InitInfo()
{
// 获取选择的对象
GameObject obj = Selection.activeGameObject;
if (obj == null)
return;
// 获取所有的按钮控件
ControlStrInfo btnInfo = FindControl<Button>(obj);
}
private ControlStrInfo FindControl<T>(GameObject obj) where T:UIBehaviour
{
ControlStrInfo info = new ControlStrInfo();
T[] controls = obj.GetComponentsInChildren<T>();
Type type = typeof(T);
for (int i = 0; i < controls.Length; i++)
{
// 声明相关的拼接
info.nameStr += $"public {type.Name} {controls[i].gameObject.name};\n\t";
info.findStr += $"{controls[i].gameObject.name} = this.transform.Find(\"{controls[i].gameObject.name}\").GetComponent<{type.Name}>();\n\t\t";
switch (type.Name)
{
case "Button":
info.listenerStr += $"{controls[i].gameObject.name}.onClick.AddListener(On{controls[i].gameObject.name}Click);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}Click(){{}}\n\t";
break;
case "Toggle":
info.listenerStr += $"{controls[i].gameObject.name}.onValueChanged.AddListener(On{controls[i].gameObject.name}ValueChanged);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}ValueChanged(bool value){{}}\n\t";
break;
case "Slider":
info.listenerStr += $"{controls[i].gameObject.name}.onValueChanged.AddListener(On{controls[i].gameObject.name}ValueChanged);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}ValueChanged(float value){{}}\n\t";
break;
default:
break;
}
}
return info;
}
5.2 知识点代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UIPanelTool : EditorWindow
{
[MenuItem("GameObject/UI/自动生成面板脚本文件")]
private static void CreateToolPanel()
{
UIPanelTool win = EditorWindow.GetWindow<UIPanelTool>("自动生成面板脚本工具");
win.Show();
//对面板上显示的相关信息进行初始化
//需要自动生成的代码 在这里 就应该拼接好
win.InitInfo();
}
public void InitInfo()
{
//1.获取选择的对象
GameObject obj = Selection.activeGameObject;
if (obj == null)
return;
//获取所有的按钮控件
ControlStrInfo btnInfo = FindControl<Button>(obj);
}
private ControlStrInfo FindControl<T>(GameObject obj) where T:UIBehaviour
{
ControlStrInfo info = new ControlStrInfo();
T[] controls = obj.GetComponentsInChildren<T>();
Type type = typeof(T);
for (int i = 0; i < controls.Length; i++)
{
//声明相关的拼接
info.nameStr += $"public {type.Name} {controls[i].gameObject.name};\n\t";
info.findStr += $"{controls[i].gameObject.name} = this.transform.Find(\"{controls[i].gameObject.name}\").GetComponent<{type.Name}>();\n\t\t";
switch (type.Name)
{
case "Button":
info.listenerStr += $"{controls[i].gameObject.name}.onClick.AddListener(On{controls[i].gameObject.name}Click);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}Click(){{}}\n\t";
break;
case "Toggle":
info.listenerStr += $"{controls[i].gameObject.name}.onValueChanged.AddListener(On{controls[i].gameObject.name}ValueChanged);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}ValueChanged(bool value){{}}\n\t";
break;
case "Slider":
info.listenerStr += $"{controls[i].gameObject.name}.onValueChanged.AddListener(On{controls[i].gameObject.name}ValueChanged);\n\t\t";
info.funcStr += $"protected virtual void On{controls[i].gameObject.name}ValueChanged(float value){{}}\n\t";
break;
default:
break;
}
}
return info;
}
private void OnGUI()
{
if (GUILayout.Button("选择保存路径"))
{
string path = EditorUtility.SaveFilePanel("脚本保存路径", Application.dataPath, "", ".cs");
if( path != "" )
{
}
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com