前言
有时候当重新编译的时候会导致出现一些新的问题,这时候就需要手动控制编译的时机。
功能
- 编译前后的回调
- 编译加锁和解锁
效果
实现
环境
Test是个空类
脚本
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;
public class AssemblyTest : EditorWindow
{
[MenuItem("Tool/AssemblyTest")]
private static void ShowWindow()
{
EditorWindow.GetWindow<AssemblyTest>("编译测试");
}
private void OnEnable()
{
CompilationPipeline.assemblyCompilationStarted += AssemblyCompilationStartedCallback;
CompilationPipeline.assemblyCompilationFinished += AssemblyCompilationFinishedCallback;
EditorApplication.playModeStateChanged += PlayModeStateChanged;
}
private void OnDestroy()
{
CompilationPipeline.assemblyCompilationStarted -= AssemblyCompilationStartedCallback;
CompilationPipeline.assemblyCompilationFinished -= AssemblyCompilationFinishedCallback;
EditorApplication.playModeStateChanged -= PlayModeStateChanged;
}
private void OnGUI()
{
if (GUILayout.Button("刷新"))
{
Refresh();
}
if (GUILayout.Button("进入游戏"))
{
EditorApplication.isPlaying = true;
}
if (GUILayout.Button("退出游戏"))
{
EditorApplication.isPlaying = false;
}
}
private void AssemblyCompilationStartedCallback(string AssemblyName)
{
Debug.Log(string.Format("当前程序集({0})开始编译", AssemblyName));
}
private void AssemblyCompilationFinishedCallback(string AssemblyName, CompilerMessage[] compilerMessages)
{
Debug.Log(string.Format("当前程序集({0})编译完毕", AssemblyName));
}
private void Lock()
{
EditorApplication.LockReloadAssemblies();
}
private void UnLock()
{
EditorApplication.UnlockReloadAssemblies();
}
private void PlayModeStateChanged(PlayModeStateChange playModeState)
{
if (playModeState == PlayModeStateChange.EnteredPlayMode)
{
Lock();
}
if (playModeState == PlayModeStateChange.ExitingPlayMode)
{
UnLock();
}
}
private void Refresh()
{
AssetDatabase.ImportAsset("Assets/Assembly/Test.cs");
AssetDatabase.ImportAsset("Assets/Assembly/Editor/AssemblyTest.cs");
AssetDatabase.Refresh();
}
}
技术点
- 解锁后必须要解锁,否则会一直不编译。
官方文档: https://docs.unity3d.com/ScriptReference/EditorApplication.LockReloadAssemblies.html
google翻译
- 在编译开始时加锁是可以阻止编译继续,但是这个用起来要小心死锁
//基于上面的脚本修改的测试脚本
private static string name;
private void AssemblyCompilationStartedCallback(string AssemblyName)
{
Debug.Log(string.Format("当前程序集({0})开始编译", AssemblyName));
if (name != AssemblyName)
{
Debug.Log("加锁");
Lock();
Debug.Log("解锁");
UnLock();
name = AssemblyName;
}
}