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

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值