public static void Compile(UdonSharpCompileOptions options = null) { if (options == null) options = new UdonSharpCompileOptions(); if (UdonSharpUtils.DoesUnityProjectHaveCompileErrors()) { UdonSharpUtils.LogError("All Unity C# compiler errors must be resolved before running an UdonSharp compile."); return; } if (CurrentJob != null) { _compileQueued = true; _queuedOptions = options; return; } Localization.Loc.InitLocalization(); UdonSharpProgramAsset[] allPrograms = UdonSharpProgramAsset.GetAllUdonSharpPrograms(); bool hasError = !ValidateProgramAssetCollisions(allPrograms); Dictionary<string, ProgramAssetInfo> rootProgramLookup = new Dictionary<string, ProgramAssetInfo>(); foreach (UdonSharpProgramAsset udonSharpProgram in allPrograms) { if (udonSharpProgram.sourceCsScript == null) { UdonSharpUtils.LogError($"Source C# script on {udonSharpProgram} is null", udonSharpProgram); hasError = true; continue; } string assetPath = AssetDatabase.GetAssetPath(udonSharpProgram.sourceCsScript); if (string.IsNullOrEmpty(assetPath)) { UdonSharpUtils.LogError($"Source C# script on {udonSharpProgram} is null", udonSharpProgram); hasError = true; continue; } rootProgramLookup.Add(assetPath.Replace('\\', '/'), new ProgramAssetInfo() { programAsset = udonSharpProgram ? udonSharpProgram : null, scriptClass = udonSharpProgram != null ? udonSharpProgram.GetClass() : null }); } if (hasError) { UdonSharpEditorCache.Instance.LastCompileDiagnostics = new [] { new UdonSharpEditorCache.CompileDiagnostic() { file = "", message = "Compile validation failed, check console output for details.", severity = DiagnosticSeverity.Error, } }; return; } // var allSourcePaths = new HashSet<string>(UdonSharpProgramAsset.GetAllUdonSharpPrograms().Where(e => e.isV1Root).Select(e => AssetDatabase.GetAssetPath(e.sourceCsScript).Replace('\\', '/'))); HashSet<string> allSourcePaths = new HashSet<string>(CompilationContext.GetAllFilteredSourcePaths(options.IsEditorBuild)); if (!ValidateUdonSharpBehaviours(allPrograms, allSourcePaths)) return; CompilationContext compilationContext = new CompilationContext(options); string[] defines = UdonSharpUtils.GetProjectDefines(options.IsEditorBuild); EditorApplication.LockReloadAssemblies(); Task compileTask = new Task(() => Compile(compilationContext, rootProgramLookup, allSourcePaths, defines)); CurrentJob = new CompileJob() { Context = compilationContext, Task = compileTask, CompileTimer = Stopwatch.StartNew(), CompileOptions = options }; compileTask.Start(); }