Pascal Serrarens 3d62e3d7af - Added check on SiteList directory existing
- Disable creating configuration file because of incompatibilities with new Unity packages.
- Configuration files feature will be removed in the near future.
- Cleanup plugins
2022-01-12 11:35:16 +01:00

290 lines
13 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;
using System.IO;
namespace Passer {
/// <summary>
/// A component for building \ref Site "Humanoid Sites"
/// </summary>
///
/// Sites can be built by selecting the _File->Build Sites_ menu.
/// After this you will be able to select which sites will be built
/// by selecting the appropriate sites in the dialog:
///
/// \image html BuildSitesDialog.png
///
/// When the Build button is pressed, all sites will be build and become available in the Assets/SiteBuilds folder
/// with a submap for each platform (like Windows, Android...)
///
/// When the Build to Folder is pressed, the built sites will additionally be copied to the selected target folder.
/// This enables you to directly publish to a web site for instance.
///
/// \version 4 and higher
[InitializeOnLoad]
public class SiteBuilder {
static SiteBuilder() {
if (siteBuilds == null) {
siteBuilds = AssetDatabase.LoadAssetAtPath<Sites>("Assets/HumanoidControl/Runtime/Sites/SiteList.asset");
if (siteBuilds == null) {
if (!Directory.Exists("Assets/HumanoidControl/Runtime/Sites"))
Directory.CreateDirectory("Assets/HumanoidControl/Runtime/Sites");
siteBuilds = (Sites)ScriptableObject.CreateInstance(typeof(Sites));
AssetDatabase.CreateAsset(siteBuilds, "Assets/HumanoidControl/Runtime/Sites/SiteList.asset");
}
}
bool hasChanged = false;
string[] assetbundles = AssetDatabase.GetAllAssetBundleNames();
for (int i = 0; i < assetbundles.Length; i++) {
Sites.SiteBuild siteBuild = siteBuilds.list.Find(sb => sb.siteName == assetbundles[i]);
if (siteBuild == null) {
siteBuild = new Sites.SiteBuild() {
siteName = assetbundles[i],
enabled = true,
};
siteBuilds.list.Add(siteBuild);
hasChanged = true;
}
}
if (hasChanged)
AssetDatabase.SaveAssets();
}
public static Sites siteBuilds;
private class SiteBuilderWindow : EditorWindow {
[MenuItem("File/Build Sites", false, 100)] // somehow priority does not work in File Menu?
public static void OpenWindow() {
SiteBuilderWindow window = (SiteBuilderWindow)EditorWindow.GetWindow(typeof(SiteBuilderWindow), true, "Build Sites");
window.ShowUtility();
}
private Vector2 scrollPos;
private void OnGUI() {
//GUI.contentColor = Color.red;
EditorGUILayout.LabelField("Sites in Build", EditorStyles.boldLabel);
scrollPos =
EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandHeight(true));
for (int i = 0; i < siteBuilds.list.Count; i++) {
siteBuilds.list[i].enabled = EditorGUILayout.ToggleLeft(siteBuilds.list[i].siteName, siteBuilds.list[i].enabled);
}
EditorGUILayout.EndScrollView();
bool buildSites = false;
bool buildToFolder = false;
using (new GUILayout.HorizontalScope()) {
GUILayout.FlexibleSpace();
buildSites = GUILayout.Button("Build", GUILayout.Width(110));
buildToFolder = GUILayout.Button("Build to Folder", GUILayout.Width(110));
}
if (buildSites) BuildSites("");
if (buildToFolder) StartBuildToFolder();
}
}
private static void StartBuildToFolder() {
string savePath = EditorUtility.SaveFolderPanel("Target folder", "", "");
BuildSites(savePath);
}
/// <summary>
/// Build all sites in this project and save them in the indicated location
/// </summary>
/// Currently this function will build all sites for Windows and Android platforms only.
/// <param name="savePath">The full path to the folder in which the sites should be saved</param>
public static void BuildSites(string savePath) {
BuildWindowsSites(savePath);
BuildAndroidSites(savePath);
BuildWebGLSites(savePath);
}
/// <summary>
/// Build all sites for the Windows Standalone platform in this project and save them in the indicated location
/// </summary>
/// <param name="savePath">The full path to the folder in which the sites should be saved</param>
public static void BuildWindowsSites(string savePath) {
Debug.Log("[SiteBuilder] Building Windows Sites");
System.Console.WriteLine("[SiteBuilder] Building Windows Sites");
string assetBundleDirectory = "Assets/SiteBuilds/Windows";
if (Directory.Exists(assetBundleDirectory))
Directory.Delete(assetBundleDirectory, true);
if (!Directory.Exists(assetBundleDirectory))
Directory.CreateDirectory(assetBundleDirectory);
AssetBundleBuild[] buildMap = GetBuildmap();
BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
string[] filePaths = Directory.GetFiles(assetBundleDirectory);
foreach (string filePath in filePaths) {
if (!filePath.Contains(".")) {
if (filePath.Substring(filePath.Length - 8) == "\\Windows" ||
filePath.Substring(filePath.Length - 17) == "\\Windows.manifest") {
File.Delete(filePath);
File.Delete(filePath + ".meta");
continue;
}
Debug.Log("Built " + filePath);
// Rename assetbundles to include platform
string newFilePath = filePath + ".windows.site";
if (File.Exists(newFilePath))
File.Delete(newFilePath);
File.Move(filePath, newFilePath);
// Rename .meta
string newMetaPath = newFilePath + ".meta";
string metaPath = filePath + ".meta";
if (File.Exists(newMetaPath))
File.Delete(newMetaPath);
if (File.Exists(metaPath))
File.Move(metaPath, newMetaPath);
if (savePath != "") {
int slashPos = newFilePath.LastIndexOf("\\");
string fileName = newFilePath.Substring(slashPos + 1);
string saveFilePath = savePath + "/" + fileName;
System.Console.WriteLine("[SiteBuilder] Copy " + newFilePath + " to " + saveFilePath);
File.Copy(newFilePath, saveFilePath, true);
}
}
}
}
/// <summary>
/// Build all sites for the Android platform in this project and save them in the indicated location
/// </summary>
/// <param name="savePath">The full path to the folder in which the sites should be saved</param>
public static void BuildAndroidSites(string savePath) {
Debug.Log("[SiteBuilder] Building Android Sites");
System.Console.WriteLine("[SiteBuilder] Building Android Sites");
string assetBundleDirectory = "Assets/SiteBuilds/Android";
if (Directory.Exists(assetBundleDirectory))
Directory.Delete(assetBundleDirectory, true);
if (!Directory.Exists(assetBundleDirectory))
Directory.CreateDirectory(assetBundleDirectory);
AssetBundleBuild[] buildMap = GetBuildmap();
BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap, BuildAssetBundleOptions.None, BuildTarget.Android);
string[] filePaths = Directory.GetFiles(assetBundleDirectory);
foreach (string filePath in filePaths) {
if (!filePath.Contains(".")) {
if (filePath.Substring(filePath.Length - 8) == "\\Android" ||
filePath.Substring(filePath.Length - 17) == "\\Android.manifest") {
File.Delete(filePath);
File.Delete(filePath + ".meta");
continue;
}
Debug.Log("Built " + filePath);
string newFilePath = filePath + ".android.site";
if (File.Exists(newFilePath))
File.Delete(newFilePath);
File.Move(filePath, newFilePath);
// Rename .meta
string newMetaPath = newFilePath + ".meta";
string metaPath = filePath + ".meta";
if (File.Exists(newMetaPath))
File.Delete(newMetaPath);
if (File.Exists(metaPath))
File.Move(metaPath, newMetaPath);
if (savePath != "") {
int slashPos = newFilePath.LastIndexOf("\\");
string fileName = newFilePath.Substring(slashPos + 1);
string saveFilePath = savePath + "/" + fileName;
System.Console.WriteLine("[SiteBuilder] Copy " + newFilePath + " to " + saveFilePath);
File.Copy(newFilePath, saveFilePath, true);
}
}
}
}
/// <summary>
/// Build all sites for the WebGL platform in this project and save them in the indicated location
/// </summary>
/// <param name="savePath">The full path to the folder in which the sites should be saved</param>
public static void BuildWebGLSites(string savePath) {
Debug.Log("[SiteBuilder] Building WebGL Sites");
System.Console.WriteLine("[SiteBuilder] Building WebGL Sites");
string assetBundleDirectory = "Assets/SiteBuilds/WebGL";
if (Directory.Exists(assetBundleDirectory))
Directory.Delete(assetBundleDirectory, true);
if (!Directory.Exists(assetBundleDirectory))
Directory.CreateDirectory(assetBundleDirectory);
AssetBundleBuild[] buildMap = GetBuildmap();
BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap, BuildAssetBundleOptions.None, BuildTarget.WebGL);
string[] filePaths = Directory.GetFiles(assetBundleDirectory);
foreach (string filePath in filePaths) {
if (!filePath.Contains(".")) {
if (filePath.Substring(filePath.Length - 6) == "\\WebGL" ||
filePath.Substring(filePath.Length - 15) == "\\WebGL.manifest") {
File.Delete(filePath);
File.Delete(filePath + ".meta");
continue;
}
Debug.Log("Built " + filePath);
string newFilePath = filePath + ".webgl.site";
if (File.Exists(newFilePath))
File.Delete(newFilePath);
File.Move(filePath, newFilePath);
// Rename .meta
string newMetaPath = newFilePath + ".meta";
string metaPath = filePath + ".meta";
if (File.Exists(newMetaPath))
File.Delete(newMetaPath);
if (File.Exists(metaPath))
File.Move(metaPath, newMetaPath);
if (savePath != "") {
int slashPos = newFilePath.LastIndexOf("\\");
string fileName = newFilePath.Substring(slashPos + 1);
string saveFilePath = savePath + "/" + fileName;
System.Console.WriteLine("[SiteBuilder] Copy " + newFilePath + " to " + saveFilePath);
File.Copy(newFilePath, saveFilePath, true);
}
}
}
}
protected static AssetBundleBuild[] GetBuildmap() {
List<AssetBundleBuild> buildList = new List<AssetBundleBuild>();
for (int i = 0; i < siteBuilds.list.Count; i++) {
if (siteBuilds.list[i].enabled == false)
continue;
AssetBundleBuild build = new AssetBundleBuild();
build.assetBundleName = siteBuilds.list[i].siteName;
string[] AssetsInBundle = AssetDatabase.GetAssetPathsFromAssetBundle(build.assetBundleName);
build.assetNames = AssetsInBundle;
buildList.Add(build);
}
AssetBundleBuild[] buildMap = buildList.ToArray();
return buildMap;
}
}
}