Unity自定义窗体插件工具

模拟一个打包游戏工具吧。 但只有UI,并不具实际的打包游戏功能。目标只是写一个窗体工具,也可以是其它用途。

这个类一定要放在Asset下的任何一个Editor文件夹才生效。


using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;

//这个类只实例化一次后,将序列化
public class BuildInfos : ScriptableObject
{


    public string[] buildModes = new string[] { "debug", "relsease" };
    public string[] buildSdks = new string[] { "无", "百度", "九游", "360平台", "当乐" };


    public string appName = "gameName";
    public string appPackageName = "appPackageName";

    public string[] scenes = new string[] { "0.unity", "1.unity", "2.unity", "3.unity", "4.unity" };
    public string[] defines = new string[] { "UGUI", "XXSDK", "XXEVN"};

    public int buildSdkIndex = 0;
    public int buildModeIndex = 0;
    public int buildPlatformIndex = 0;

}


public class BuildEditorWin : EditorWindow
{

    [MenuItem("Window/游戏打包")]
    static void OpenWindow()
    {
        Rect rect = new Rect(0, 0, 500, 500);
        BuildEditorWin mywin = (BuildEditorWin)EditorWindow.GetWindowWithRect(typeof(BuildEditorWin), rect, true, "游戏打包");
        mywin.Show();
    }



    ScriptableObject scripObj;
    UnityEditor.SerializedObject serilObj;

    //通过SerializedProperty来访问序列化的类的参数
    SerializedProperty seripAppName;
    SerializedProperty seripAppPackageName;
    SerializedProperty seripBuildModes;
    SerializedProperty seripBuildSdks;
    SerializedProperty seripScenes;
    SerializedProperty seripBuildSdkIndex;
    SerializedProperty seripBuildModeIndex;
    SerializedProperty seripBuildDefines;

    SerializedProperty seripSelectModeIndex;
    SerializedProperty seripSelectSdkIndex;


    Vector2 scrollPos = new Vector2(0, 0);

    private string OStarget;

    void Awake()
    {
        //BuildInfos只会实例化一次后进行序列化,以后每次都是反序列获取到的唯一实例
        scripObj = ScriptableObject.FindObjectOfType<BuildInfos>();
        if (scripObj == null)
        {
            Debug.Log("instance 为空!");
            scripObj = ScriptableObject.CreateInstance<BuildInfos>();
        }
        InitPropety();

        OStarget = EditorUserBuildSettings.activeBuildTarget.ToString();
    }
   private void InitPropety() {
        serilObj = new UnityEditor.SerializedObject(scripObj);

        seripAppName = serilObj.FindProperty("appName");
        seripAppPackageName = serilObj.FindProperty("appPackageName");
        seripBuildModes = serilObj.FindProperty("buildModes");
        seripBuildSdks = serilObj.FindProperty("buildSdks");
        seripScenes = serilObj.FindProperty("scenes");
        seripBuildSdkIndex = serilObj.FindProperty("buildSdkIndex");
        seripBuildModeIndex = serilObj.FindProperty("buildModeIndex");
        seripBuildDefines = serilObj.FindProperty("defines");
    }
    void OnGUI()
    {
    if (serilObj == null) {
            Debug.Log("失去数据");
            this.Close();
        }
        //UI交互会有可能改变BuildInfos参数,所以每次重绘都更新
        if (serilObj == null) {
            InitPropety();
        }
        serilObj.Update();

        //push开启一个垂直布局,后面要一个EndVertical pop来结束,要求push pop成对,可嵌套
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

        string platformDesc = "当前为" + OStarget + "工程";

        EditorGUI.DropShadowLabel(new Rect(0, 5, position.width - 10, 20), "打包");
        EditorGUI.DropShadowLabel(new Rect(0, 30, position.width - 10, 20), platformDesc);


        //-----------前面4个选择模块-------------------------------

        EditorGUILayout.BeginVertical();

        EditorGUILayout.LabelField("");
        EditorGUILayout.LabelField("");
        EditorGUILayout.LabelField("");
        EditorGUILayout.LabelField("");


        EditorGUILayout.PropertyField(seripAppName, new GUIContent("游戏名:"));
        EditorGUILayout.PropertyField(seripAppPackageName, new GUIContent("安装包名:"));

        seripBuildModeIndex.intValue = EditorGUILayout.Popup("打包模式:", seripBuildModeIndex.intValue, GetItems(seripBuildModes.GetEnumerator()));
        seripBuildSdkIndex.intValue = EditorGUILayout.Popup("渠道SDK:", seripBuildSdkIndex.intValue, GetItems(seripBuildSdks.GetEnumerator()));
        EditorGUILayout.PropertyField(seripBuildSdks, new GUIContent("添加SDK:"), true);//这里最后的参数是true才能够在UI展开数组
        EditorGUILayout.PropertyField(seripBuildDefines, new GUIContent("基本宏定义"), true);
        EditorGUILayout.PropertyField(seripScenes,new GUIContent("要打包的场景"), true);


        //序列化有改动的数据
        serilObj.ApplyModifiedProperties();

        EditorGUILayout.EndVertical();


        //-----------结束,空行--------------------------------------------------------------------------------
        EditorGUILayout.BeginVertical();
        EditorGUILayout.LabelField("");
        EditorGUILayout.EndVertical();



        //====空行后按钮=============================================================
        EditorGUILayout.BeginVertical();
        EditorGUILayout.LabelField("");
        EditorGUILayout.LabelField("");
        EditorGUILayout.EndVertical();

        if (GUILayout.Button("打包" + OStarget + "游戏", GUILayout.Height(50)))
        {
            serilObj.Update();

            string appName = seripAppName.stringValue;
            string appPackageName = seripAppPackageName.stringValue;

            string[] buildModes = GetItems(seripBuildModes.GetEnumerator());
            string[] buildSdks = GetItems(seripBuildSdks.GetEnumerator());

            string selectedMode = buildModes[seripBuildModeIndex.intValue];
            string selectedSdk = buildSdks[seripBuildSdkIndex.intValue];
            string[] buildScenes = GetItems(seripScenes.GetEnumerator());

            string[] buildDefines = GetItems(seripBuildDefines.GetEnumerator());
            //宏定义字符串
            string buildDefineStr = "";
            foreach (string define in buildDefines) {
                buildDefineStr += define + ";";
            }

             //移除最后的";"
            if(buildDefineStr.Length > 1)
                buildDefineStr = buildDefineStr.Remove(buildDefineStr.Length - 1);



            Debug.Log("游戏名:" + appName);
            Debug.Log("安装包名:" + appPackageName);
            Debug.Log("打包模式:" + selectedMode);
            Debug.Log("渠道SDK: " + selectedSdk);
            Debug.Log("宏定义设置:" + buildDefineStr);
            foreach (string scene in buildScenes) {
                Debug.Log("将要打包的场景:" + scene);
            }

            //打包前要this.Close()关闭窗口,要不会卡
             //this.Close();
            //后面打包的逻辑。。待完善
            //BuildPipeline.BuildPlayer....

        }

        EditorGUILayout.EndScrollView();
    }


    //把序列化的数组参数获取出来使用
    private List<string> itemsList = new List<string>();
    private string[] GetItems(IEnumerator i) {

        itemsList.Clear();

        while (i.MoveNext())
        {
            SerializedProperty s = (SerializedProperty)i.Current;
            itemsList.Add(s.stringValue);

        }
        string[] items = new string[itemsList.Count];
        itemsList.CopyTo(items, 0);
        return items;
    }
}

然后点击 Window–>打包游戏 这样,窗体小工具就弹出来了,然后点击打包,查看Log信息,窗体完成!

这里写图片描述

log信息验证:

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的自定义弹框可以使用Unity3D Custom Popup插件来实现。该插件可以推迟构造弹出窗口的显示,对于构造弹出窗口相对昂贵的情况非常有用。你可以通过执行`yarn add rotorz/unity3d-custom-popup`命令来安装该软件包,并将其与Unity工具兼容。然后按照插件的说明进行操作,将自定义弹出控件添加到Unity编辑器界面中。 具体而言,你可以在代码中调用`MyPermissionDialog.Builder`来创建一个自定义弹框。可以使用`setPositiveButton`方法设置弹框的确认按钮的点击事件,并在点击事件中执行相应的操作。通过`setTitleAndContext`方法可以设置弹框的标题和内容。最后,通过调用`create`方法创建弹框,并使用`show`方法显示出来。 请注意,这只是一种实现自定义弹框的方式,根据你的具体需求,可能还有其他的方法可供选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android自定义弹框以及弹框资源加载](https://blog.csdn.net/u014146238/article/details/104824842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [unity3d-custom-popup:Unity编辑器界面的自定义弹出控件,将弹出菜单的构造推迟到显示为止。 这对于弹出...](https://download.csdn.net/download/weixin_42131443/18312293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值