问题
- 我并不是一直想要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