2025-07-08 10:46:31 +00:00
|
|
|
#if UNITY_2019_1_OR_NEWER
|
|
|
|
using System;
|
|
|
|
using System.IO;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using UnityEditor;
|
|
|
|
using UnityEditor.Compilation;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
namespace SingularityGroup.HotReload.Editor {
|
|
|
|
class DefaultCompileChecker : ICompileChecker {
|
|
|
|
const string recompileFilePath = PackageConst.LibraryCachePath + "/recompile.txt";
|
|
|
|
public bool hasCompileErrors { get; private set; }
|
|
|
|
bool recompile;
|
|
|
|
public DefaultCompileChecker() {
|
|
|
|
CompilationPipeline.assemblyCompilationFinished += DetectCompileErrors;
|
|
|
|
CompilationPipeline.compilationFinished += OnCompilationFinished;
|
|
|
|
var currentSessionId = EditorAnalyticsSessionInfo.id;
|
|
|
|
Task.Run(() => {
|
|
|
|
try {
|
|
|
|
var compileSessionId = File.ReadAllText(recompileFilePath);
|
|
|
|
if(compileSessionId == currentSessionId.ToString()) {
|
|
|
|
ThreadUtility.RunOnMainThread(() => {
|
|
|
|
recompile = true;
|
|
|
|
_onCompilationFinished?.Invoke();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
File.Delete(recompileFilePath);
|
|
|
|
} catch(DirectoryNotFoundException) {
|
|
|
|
//dir doesn't exist -> no recompile required
|
|
|
|
} catch(FileNotFoundException) {
|
|
|
|
//file doesn't exist -> no recompile required
|
|
|
|
} catch(Exception ex) {
|
|
|
|
Log.Warning("compile checker encountered issue: {0} {1}", ex.GetType().Name, ex.Message);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void DetectCompileErrors(string _, CompilerMessage[] messages) {
|
|
|
|
for (int i = 0; i < messages.Length; i++) {
|
|
|
|
if (messages[i].type == CompilerMessageType.Error) {
|
|
|
|
hasCompileErrors = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
hasCompileErrors = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnCompilationFinished(object _) {
|
|
|
|
//Don't recompile on compile errors
|
|
|
|
if(!hasCompileErrors) {
|
|
|
|
Directory.CreateDirectory(Path.GetDirectoryName(recompileFilePath));
|
|
|
|
File.WriteAllText(recompileFilePath, EditorAnalyticsSessionInfo.id.ToString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Action _onCompilationFinished;
|
|
|
|
public event Action onCompilationFinished {
|
|
|
|
add {
|
|
|
|
if(recompile && value != null) {
|
|
|
|
value();
|
|
|
|
}
|
|
|
|
_onCompilationFinished += value;
|
|
|
|
}
|
|
|
|
remove {
|
|
|
|
_onCompilationFinished -= value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|