您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
266 行
8.1 KiB
266 行
8.1 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using UnityEditor.Networking.PlayerConnection;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
|
|
public class LaunchWindow : EditorWindow
|
|
{
|
|
|
|
[Serializable]
|
|
class Entry
|
|
{
|
|
public bool runInEditor;
|
|
public string name = "Entry name";
|
|
public int count = 1;
|
|
public bool selected;
|
|
public string arguments;
|
|
public bool showArguments;
|
|
}
|
|
|
|
[Serializable]
|
|
class Data
|
|
{
|
|
public List<Entry> entries = new List<Entry>();
|
|
}
|
|
|
|
|
|
[MenuItem("FPS Sample/Windows/LaunchWindow")]
|
|
public static void ShowWindow()
|
|
{
|
|
GetWindow<LaunchWindow>(false, "Launch", true);
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
var str = EditorPrefs.GetString(editorPrefName, "");
|
|
if (str != "")
|
|
data = JsonUtility.FromJson<Data>(str);
|
|
else
|
|
data = new Data();
|
|
}
|
|
|
|
void OnGUI()
|
|
{
|
|
var defaultGUIColor = GUI.color;
|
|
var defaultGUIBackgrounColor = GUI.backgroundColor;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
EditorGUILayout.BeginVertical();
|
|
|
|
|
|
// Quick start buttons
|
|
GUILayout.BeginHorizontal();
|
|
{
|
|
GUI.backgroundColor = Color.green;
|
|
if (GUILayout.Button("Start Selected"))
|
|
{
|
|
for (var i = 0; i < data.entries.Count; i++)
|
|
{
|
|
var entry = data.entries[i];
|
|
if (!entry.selected)
|
|
continue;
|
|
StartEntry(data.entries[i]);
|
|
}
|
|
}
|
|
GUI.backgroundColor = defaultGUIBackgrounColor;
|
|
|
|
GUI.backgroundColor = Color.red;
|
|
if (GUILayout.Button("Stop All"))
|
|
{
|
|
StopAll();
|
|
}
|
|
GUI.backgroundColor = defaultGUIBackgrounColor;
|
|
|
|
if (GUILayout.Button("+", GUILayout.Width(30)))
|
|
{
|
|
data.entries.Add(new Entry());
|
|
}
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
|
|
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
|
|
|
|
// Draw entries
|
|
for (var i = 0; i < data.entries.Count; i++)
|
|
{
|
|
var entry = data.entries[i];
|
|
//var style = "Box"; // entry.runInEditor ? "selectionRect" : "Box";
|
|
|
|
GUILayout.BeginHorizontal(GUILayout.ExpandHeight(false));
|
|
{
|
|
GUI.backgroundColor = entry.selected ? Color.green : defaultGUIBackgrounColor;
|
|
if (GUILayout.Button("S", GUILayout.Width(20)))
|
|
entry.selected = !entry.selected;
|
|
GUI.backgroundColor = defaultGUIBackgrounColor;
|
|
|
|
entry.name = EditorGUILayout.TextField(entry.name);
|
|
|
|
if (GUILayout.Button(entry.showArguments ? "^" : "v", GUILayout.Width(30)))
|
|
entry.showArguments = !entry.showArguments;
|
|
|
|
GUI.backgroundColor = Color.yellow;
|
|
if (GUILayout.Button("Start", GUILayout.Width(50)))
|
|
{
|
|
StartEntry(entry);
|
|
}
|
|
GUI.backgroundColor = defaultGUIBackgrounColor;
|
|
|
|
entry.count = EditorGUILayout.IntField(entry.count, GUILayout.Width(30), GUILayout.ExpandWidth(false));
|
|
|
|
GUI.backgroundColor = entry.runInEditor ? Color.yellow : GUI.backgroundColor;
|
|
|
|
|
|
|
|
GUI.backgroundColor = defaultGUIBackgrounColor;
|
|
|
|
var runInEditor = GUILayout.Toggle(entry.runInEditor, "Editor", new GUIStyle("Button"), GUILayout.Width(50));
|
|
if (runInEditor != entry.runInEditor)
|
|
{
|
|
for (var j = 0; j < data.entries.Count; j++)
|
|
data.entries[j].runInEditor = false;
|
|
entry.runInEditor = runInEditor;
|
|
}
|
|
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
|
|
if (entry.showArguments)
|
|
{
|
|
entry.arguments = EditorGUILayout.TextArea(entry.arguments);
|
|
}
|
|
}
|
|
|
|
|
|
GUILayout.FlexibleSpace();
|
|
|
|
EditorGUILayout.EndScrollView();
|
|
|
|
EditorGUILayout.EndVertical();
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
var json = JsonUtility.ToJson(data);
|
|
EditorPrefs.SetString(editorPrefName, json);
|
|
}
|
|
}
|
|
|
|
void StartEntry(Entry entry)
|
|
{
|
|
|
|
// Convert line breaks to space and remove commented out lines
|
|
var lines = entry.arguments.Split(new String[] { "\r\n","\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
|
lines.RemoveAll(str => str.Contains("//"));
|
|
var args = "";
|
|
lines.ForEach(str => args += str + " ");
|
|
|
|
int standaloneCount = entry.count;
|
|
if (!Application.isPlaying && entry.runInEditor)
|
|
{
|
|
EditorLevelManager.StartGameInEditor(args);
|
|
standaloneCount--;
|
|
}
|
|
|
|
for (var i = 0; i < standaloneCount; i++)
|
|
{
|
|
//if (allowDevBuild && entry.useDevBuild)
|
|
// RunDevBuild(args);
|
|
//else
|
|
RunBuild(args + " -title \"" + entry.name + "\"");
|
|
}
|
|
}
|
|
|
|
static void RunBuild(string args)
|
|
{
|
|
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
|
var buildPath = GetBuildPath(buildTarget);
|
|
var buildExe = GetBuildExe(buildTarget);
|
|
Debug.Log("Starting " + buildExe + " in " + buildPath);
|
|
var process = new System.Diagnostics.Process();
|
|
process.StartInfo.UseShellExecute = false;
|
|
process.StartInfo.FileName = Application.dataPath + "/../" + buildPath + "/" + buildExe; // mogensh: for some reason we now need to specify project path
|
|
process.StartInfo.Arguments = args;
|
|
process.StartInfo.WorkingDirectory = buildPath;
|
|
process.Start();
|
|
}
|
|
|
|
// if (allowDevBuild && useDevBuild)
|
|
// arguments += " +res.runtimebundlepath ../AutoBuild/AssetBundles";
|
|
|
|
|
|
static void RunDevBuild(string args)
|
|
{
|
|
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
|
var buildPath = GetDevBuildPath(buildTarget);
|
|
var buildExe = GetBuildExe(buildTarget);
|
|
Debug.Log("Starting " + buildExe + " in " + buildPath);
|
|
var process = new System.Diagnostics.Process();
|
|
process.StartInfo.UseShellExecute = false;
|
|
process.StartInfo.FileName = Application.dataPath + "/../" + buildPath + "/" + buildExe; // mogensh: for some reason we now need to specify project path
|
|
process.StartInfo.Arguments = args;
|
|
process.StartInfo.WorkingDirectory = buildPath;
|
|
process.Start();
|
|
}
|
|
|
|
static string GetBuildPath(BuildTarget buildTarget)
|
|
{
|
|
if (buildTarget == BuildTarget.PS4)
|
|
return "AutoBuildPS4";
|
|
else
|
|
return "AutoBuild";
|
|
}
|
|
|
|
static string GetDevBuildPath(BuildTarget buildTarget)
|
|
{
|
|
var path = GetBuildPath(buildTarget);
|
|
return path + "_Dev";
|
|
}
|
|
|
|
static string GetBuildExeName(BuildTarget buildTarget)
|
|
{
|
|
if (buildTarget == BuildTarget.PS4)
|
|
return "AutoBuild";
|
|
else
|
|
return "AutoBuild.exe";
|
|
}
|
|
|
|
static string GetBuildExe(BuildTarget buildTarget)
|
|
{
|
|
if (buildTarget == BuildTarget.PS4)
|
|
return "AutoBuild/AutoBuild.bat";
|
|
else
|
|
return "AutoBuild.exe";
|
|
}
|
|
|
|
static void StopAll()
|
|
{
|
|
EditorApplication.isPlaying = false;
|
|
|
|
var buildExe = GetBuildExe(EditorUserBuildSettings.activeBuildTarget);
|
|
|
|
var processName = Path.GetFileNameWithoutExtension(buildExe);
|
|
var processes = System.Diagnostics.Process.GetProcesses();
|
|
foreach (var process in processes)
|
|
{
|
|
if (process.HasExited)
|
|
continue;
|
|
|
|
if (process.ProcessName != null && process.ProcessName == processName)
|
|
{
|
|
process.Kill();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
const string editorPrefName = "LauchWindowData";
|
|
Data data;
|
|
Vector2 scrollPosition;
|
|
}
|
|
|
|
#endif
|