Skip to content
Open

Main #17

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 258 additions & 0 deletions Assets/Editor/BuildScript.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
using UnityEditor;
using UnityEditor.SceneManagement;
using System;
using System.IO;
using System.Collections.Generic;

/// <summary>
/// Build script for Sui Unity SDK
/// Supports headless builds for multiple platforms
///
/// Usage examples:
/// unity -projectPath . -buildTarget WebGL -executeMethod BuildScript.BuildWebGL
/// unity -projectPath . -buildTarget StandaloneWindows64 -executeMethod BuildScript.BuildWindows
/// unity -projectPath . -buildTarget StandaloneOSX -executeMethod BuildScript.BuildMac
/// </summary>
public class BuildScript
{
private static readonly string BUILD_OUTPUT_DIR = "Build";
private static readonly string LOG_FILE = "Build/build_log.txt";

/// <summary>
/// Build for WebGL platform
/// </summary>
public static void BuildWebGL()
{
BuildTarget(BuildTarget.WebGL, "WebGL", "Build/WebGL");
}

/// <summary>
/// Build for Windows 64-bit standalone
/// </summary>
public static void BuildWindows()
{
BuildTarget(BuildTarget.StandaloneWindows64, "Windows", "Build/Windows/SuiUnity.exe");
}

/// <summary>
/// Build for macOS standalone
/// </summary>
public static void BuildMac()
{
BuildTarget(BuildTarget.StandaloneOSX, "macOS", "Build/macOS");
}

/// <summary>
/// Build for Linux standalone
/// </summary>
public static void BuildLinux()
{
BuildTarget(BuildTarget.StandaloneLinux64, "Linux", "Build/Linux/SuiUnity");
}

/// <summary>
/// Build for Android
/// </summary>
public static void BuildAndroid()
{
BuildTarget(BuildTarget.Android, "Android", "Build/Android");
}

/// <summary>
/// Build for iOS
/// </summary>
public static void BuildiOS()
{
BuildTarget(BuildTarget.iOS, "iOS", "Build/iOS");
}

/// <summary>
/// Generic build method
/// </summary>
private static void BuildTarget(BuildTarget target, string targetName, string outputPath)
{
try
{
CreateBuildDirectory();
LogMessage($"\n========== Starting {targetName} Build ==========\n");
LogMessage($"Target: {target}");
LogMessage($"Output: {outputPath}");
LogMessage($"Time: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
LogMessage("---");

// Get all scenes in the project
string[] scenes = GetScenePaths();

if (scenes.Length == 0)
{
LogMessage("WARNING: No scenes found in project. Build may fail.");
}
else
{
LogMessage($"Scenes to include ({scenes.Length}):");
foreach (var scene in scenes)
{
LogMessage($" - {scene}");
}
}

LogMessage("\n---\n");

// Configure build options
BuildPlayerOptions buildOptions = new BuildPlayerOptions
{
scenes = scenes,
locationPathName = outputPath,
target = target,
options = BuildOptions.None
};

// Add development build flag if specified via environment variable
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DEVELOPMENT_BUILD")))
{
buildOptions.options |= BuildOptions.Development;
LogMessage("Development build enabled");
}

// Perform the build
BuildReport report = BuildPipeline.BuildPlayer(buildOptions);
HandleBuildResults(report, targetName);
}
catch (Exception ex)
{
string errorMsg = $"Build failed with exception: {ex.Message}\n{ex.StackTrace}";
LogMessage(errorMsg);
EditorApplication.Exit(1);
}
}

/// <summary>
/// Get all scenes from the project
/// </summary>
private static string[] GetScenePaths()
{
List<string> scenePaths = new List<string>();
string samplesSceneDir = "Assets/SuiUnitySDK/Samples/Scenes";

// Add sample scenes if they exist
if (Directory.Exists(samplesSceneDir))
{
string[] sceneFiles = Directory.GetFiles(samplesSceneDir, "*.unity");
Array.Sort(sceneFiles);
scenePaths.AddRange(sceneFiles);
}

// If no scenes found, return empty array (Unity will build with empty scene list)
if (scenePaths.Count == 0)
{
LogMessage("Note: Using empty scene list - no scenes will be included in build");
}

return scenePaths.ToArray();
}

/// <summary>
/// Handle build results and exit with appropriate code
/// </summary>
private static void HandleBuildResults(BuildReport report, string targetName)
{
if (report.summary.result == BuildResult.Succeeded)
{
LogMessage($"✓ {targetName} build succeeded!");
LogMessage($" Output: {report.summary.outputPath}");
LogMessage($" Build size: {report.summary.totalSize / (1024 * 1024)} MB");
LogMessage($" Build time: {report.summary.totalTime.TotalSeconds:F2} seconds");
LogMessage($"\n========== Build Complete ==========\n");
EditorApplication.Exit(0);
}
else if (report.summary.result == BuildResult.Failed)
{
string errorMsg = $"✗ {targetName} build failed!";
LogMessage(errorMsg);

if (report.summary.totalErrors > 0)
{
LogMessage($" Errors: {report.summary.totalErrors}");
}

LogMessage($"\n========== Build Failed ==========\n");
EditorApplication.Exit(1);
}
else if (report.summary.result == BuildResult.Cancelled)
{
LogMessage($"! {targetName} build was cancelled");
LogMessage($"\n========== Build Cancelled ==========\n");
EditorApplication.Exit(2);
}
}

/// <summary>
/// Create build directory if it doesn't exist
/// </summary>
private static void CreateBuildDirectory()
{
if (!Directory.Exists(BUILD_OUTPUT_DIR))
{
Directory.CreateDirectory(BUILD_OUTPUT_DIR);
}
}

/// <summary>
/// Log message to both console and log file
/// </summary>
private static void LogMessage(string message)
{
Console.WriteLine(message);

try
{
File.AppendAllText(LOG_FILE, message + Environment.NewLine);
}
catch
{
// Silently fail if log file can't be written
}
}

/// <summary>
/// Print help information
/// </summary>
public static void PrintHelp()
{
string help = @"
========== Sui Unity SDK Build Script ==========

Available build targets:

BuildWebGL() - Build for WebGL platform
BuildWindows() - Build for Windows 64-bit
BuildMac() - Build for macOS
BuildLinux() - Build for Linux 64-bit
BuildAndroid() - Build for Android
BuildiOS() - Build for iOS

Usage examples:

# WebGL Build
unity -projectPath . -buildTarget WebGL -executeMethod BuildScript.BuildWebGL

# Windows Build (Release)
unity -projectPath . -buildTarget StandaloneWindows64 -executeMethod BuildScript.BuildWindows

# Windows Build (Development)
DEVELOPMENT_BUILD=1 unity -projectPath . -buildTarget StandaloneWindows64 -executeMethod BuildScript.BuildWindows

# macOS Build
unity -projectPath . -buildTarget StandaloneOSX -executeMethod BuildScript.BuildMac

# Audio help
unity -projectPath . -executeMethod BuildScript.PrintHelp

Output: Builds are created in the 'Build' directory
Log file: Build/build_log.txt

================================================
";
Console.WriteLine(help);
}
}
Loading