Skip to content

Instantly share code, notes, and snippets.

@darbotron
Last active June 9, 2022 12:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darbotron/7bb328b4bc17e6916be02428eb477ebd to your computer and use it in GitHub Desktop.
Save darbotron/7bb328b4bc17e6916be02428eb477ebd to your computer and use it in GitHub Desktop.
//
// StandaloneBuildCompilationChecker by Alex 'darbotron' Darby
//
// License: https://opensource.org/licenses/unlicense
// TL;DR:
// 1) you may do what you like with it...
// 2) ...except blame me for any consequence of acting on rule 1)
//
#if UNITY_EDITOR
using System.Reflection;
using UnityEngine;
using UnityEditor;
using UnityEditor.Build.Player;
public static class PL_BuildScriptCompilationChecker
{
const string k_strAssemblyQualifiedEditorLogType = "UnityEditor.LogEntries,UnityEditor.dll";
const string k_strEditorLogTypeClearFunction = "Clear";
const float k_fCompilerProgressBarAmount = 0.1f;
static readonly string k_strTempCompilerDirectory = $"Temp/{nameof(PL_BuildScriptCompilationChecker)}";
/// <summary>
/// compiles scripts in "standalone" mode for current UnityEditor platform
/// i.e. as they are compiled when you do a standalone build
/// Note: works for all tested platforms (PC/Mac/Consoles)
/// </summary>
[MenuItem( "Tools/Compile Standalone Scripts for Platform" )]
static void CompilePlayerScripts()
{
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
var buildGroup = BuildPipeline.GetBuildTargetGroup( buildTarget );
var compilerSettings = new ScriptCompilationSettings { group = buildGroup, target = buildTarget, options = ScriptCompilationOptions.None };
var definesForGroup = PlayerSettings.GetScriptingDefineSymbolsForGroup( buildGroup );
// clear the log
var currentLogEntries = System.Type.GetType( k_strAssemblyQualifiedEditorLogType );
if( null != currentLogEntries )
{
BindingFlags k_consoleClearFunctionbindingFlags = BindingFlags.Static | BindingFlags.Public;
var logEntryClearFunction = currentLogEntries.GetMethod( k_strEditorLogTypeClearFunction, k_consoleClearFunctionbindingFlags );
if( null != logEntryClearFunction )
{
logEntryClearFunction.Invoke( null, null );
} else Debug.LogWarning( $"Editor log entries (type: '{k_strAssemblyQualifiedEditorLogType}') no longer have a method called {k_strEditorLogTypeClearFunction} (with binding {k_consoleClearFunctionbindingFlags.ToString()})" );
} else Debug.LogWarning( $"Editor log entries cannot be fetched via reflection with string: '{k_strAssemblyQualifiedEditorLogType}'" );
Debug.Log("Compiling C# code for " + compilerSettings.group + "/" + compilerSettings.target);
Debug.Log( $"defines: {definesForGroup}" );
EditorUtility.DisplayProgressBar( "Compiling C# Scripts", $"Group:{compilerSettings.group} Target:{compilerSettings.target}", k_fCompilerProgressBarAmount );
var compilationResult = PlayerBuildInterface.CompilePlayerScripts( compilerSettings, k_strTempCompilerDirectory );
Debug.Log( $"Compiled Assemblies: {string.Join("\n", compilationResult.assemblies)}" );
EditorUtility.ClearProgressBar();
}
}
#endif // #if UNITY_EDITOR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment