您的位置:首页 > 移动开发 > Unity3D

Unity自定义窗体插件工具

2015-07-31 17:16 706 查看
模拟一个打包游戏工具吧。 但只有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信息验证:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: