Unity编译回调和加锁解锁

前言

有时候当重新编译的时候会导致出现一些新的问题,这时候就需要手动控制编译的时机。

功能

  • 编译前后的回调
  • 编译加锁和解锁

效果

在这里插入图片描述

实现

环境

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();
    }
}

技术点

  1. 解锁后必须要解锁,否则会一直不编译。

官方文档: https://docs.unity3d.com/ScriptReference/EditorApplication.LockReloadAssemblies.html
google翻译
在这里插入图片描述

  1. 在编译开始时加锁是可以阻止编译继续,但是这个用起来要小心死锁
    //基于上面的脚本修改的测试脚本
    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;
        }
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_34870723/article/details/92828069