Unity自定义窗体插件工具
2015-07-31 17:16
706 查看
模拟一个打包游戏工具吧。 但只有UI,并不具实际的打包游戏功能。目标只是写一个窗体工具,也可以是其它用途。
这个类一定要放在Asset下的任何一个Editor文件夹才生效。
然后点击 Window–>打包游戏 这样,窗体小工具就弹出来了,然后点击打包,查看Log信息,窗体完成!
log信息验证:
这个类一定要放在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信息验证:
相关文章推荐
- UNITY3D学习笔记10
- 小韵游戏开发学习笔记——第五期:认识Unity基本组件(二)
- Unity3d开发过程记录随笔
- Unity中实现全局管理类的几种方式
- Unity AssetBundle爬坑手记
- Unity3D之在Unity编辑器中添加菜单
- Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
- unity 基础:Render Settings
- Vuforia应用之屏幕截图功能
- Unity Assets目录下的特殊文件夹名称
- Vuforia应用之相机自动对焦功能
- unity, 在保持场景根节点Transform不变且Hierarchy结构不变的前提下整体旋转场景
- [UnityUI]对RectTransform的一些理解
- unity3d ppsspp模拟器中的post processing shader在unity中使用
- Unity3d UI渐隐渐显
- unity3d ppsspp模拟器中的post processing shader在unity中使用
- Unity3D 图片模糊
- Unity3D:粒子特效(Particle System)播放序列帧动画
- Unity3D:粒子系统Particle System
- GameUnity 2.0 文档(一) 事件机制