关注

如何从脚本停止自动编译

问题

  • 我并不是一直想要Unity重新加载我的脚本程序集。
  • 在运行模式下编译脚本会导致问题。

原因

Unity会在修改的同时重新编译脚本文件。

解决方案

Unity提供了一个阻止加载脚本程序集的方法。

首先,创建一个将在项目[InitializeOnLoad]打开时加载的Editor Script,并且使用EditorApplication.update委托从Editor 接收更新事件。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class CompilerOptionsEditorScript
{
    static CompilerOptionsEditorScript()
    {
        EditorApplication.update += OnEditorUpdate;
    }

    static void OnEditorUpdate()
    {
        if( EditorApplication.isCompiling )
            Debug.Log( "Scripts are compiling" );
    }
}

当检测到EditorApplication.isCompiling,在EditorApplication.UnlockReloadAssemblies()被调用之前在你想阻止Unity编译脚本的地方使用EditorApplication.LockReloadAssemblies()

阻止在PlayMode时编译脚本,可以用EditorApplication.isPlaying 检测编辑器是否在PlayMode;EditorApplication.playmodeStateChange用于状态的更改事件。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class CompilerOptionsEditorScript
{
   static bool waitingForStop = false;

    static CompilerOptionsEditorScript()
    {
        EditorApplication.update += OnEditorUpdate;
    }

    static void OnEditorUpdate()
    {
        if( ! waitingForStop
&& EditorApplication.isCompiling
&& EditorApplication.isPlaying )
        {
            EditorApplication.LockReloadAssemblies();
            EditorApplication.playmodeStateChanged
+= PlaymodeChanged;
            waitingForStop = true;
       }
    }

   static void PlaymodeChanged()
   {
       if( EditorApplication.isPlaying )
return;
       
       EditorApplication.UnlockReloadAssemblies();
       EditorApplication.playmodeStateChanged
-= PlaymodeChanged;
       waitingForStop = false;
   }
}

更多信息

http://docs.unity3d.com/Manual/RunningEditorCodeOnLaunch.html
http://docs.unity3d.com/ScriptReference/EditorApplication.html

这篇文章有帮助吗?
1 人中有 1 人觉得有帮助
还有其它问题?提交请求

0 评论

登录写评论。