5.控件查找方法

  1. 5.控件查找
    1. 5.1 知识点
      1. 在点击生成时,获取选择的对象
      2. 获取选择的对象下的相关UI控件,将相关逻辑封装成对应方法。
  2. 5.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏