Unity ExecuteInEditMode详解

Unity编辑器界面有三种模式:

  • Play Mode: 按下Play按钮进入游戏的这种模式,Unity称之为Play Mode
  • Edit Mode:正常的Unity编辑状态就是Edit Mode
  • Prefab Mode:Unity进入prefab时对应的编辑状态叫Prefab Mode

Unity里继承MonoBehaviour的脚本,并不是一直都会执行的。Unity默认只有在Play Mode下,才会运行游戏当前运行场景里的GameObject挂载的脚本

为了满足实际需求,Unity支持通过[ExecuteInEditMode][ExecuteAlways]两种参数使脚本在Play Mode以外的状态下被执行,[ExecuteEditMode]支持脚本在Edit Mode下运行,[ExecuteAlways]是在Unity2018.3及以后的版本新加入的功能,能够支持脚本一直运行。(ps:由于[ExecuteInEditMode] 并没有考虑Prefab Mode,严格意义上讲Prefab Mode也属于Edit Mode,所以这个功能会逐渐被Unity弃用,最后应该会被[ExecuteAlways]所替代)

两种的写法是差不多的,只需要在对应脚本的类前加上对应代码即可,如下所示,

[ExecuteInEditMode]
public class Example1 : MonoBehaviour {
	...
}

[ExecuteAlways]
public class Example2 : MonoBehaviour {
	...
}

ExecuteInEditMode

值得注意的是,与PlayMode不同的是,函数并不会不停的执行。

  • AwakeStart:加载时调用,也就是脚本赋给物体的时候被调用
  • Update : 只有当场景中的某个物体发生变化时,才调用,当进程切出去再回来,也会调用一次。
  • OnGUI : 当GameView接收到一个Event时才调用。
  • OnRenderObject 和其他的渲染回调函数 : SceneView或者GameView重绘时,比如,一直移动鼠标的时候OnRenderObject会被调用。

使用了[ExecuteAlways]参数的类,仍然可以在原来的Play Mode下正常运行,举个例子,如下图所示:

[ExecuteInEditMode]
public class TestA : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log(1);
    }

    private void Start()
    {
        Debug.Log(2);
    }

    private void Update()
    {
        Debug.Log(3);
    }
}

在Edit Mode下,将其挂载到一个GameObject下,会打印如下消息:
在这里插入图片描述
运行游戏,可以看到又调用了一次Awake和Start函数:
在这里插入图片描述
关闭游戏,回到Edit Mode:
在这里插入图片描述

ExecuteAlways
ExecuteAlways可以看作是ExecuteInEditMode的改进版,支持Prefab Mode下的脚本调用,其余的与ExecuteInEditMode基本完全相同,具体代码如下:

[ExecuteAlways]
public class Example : MonoBehaviour {
    void Start()
    {
        if (Application.IsPlaying(gameObject))
        {
        	// 若在Play Mode下
            // Play logic
        }
        else
        {
        	// 若在Edit Mode下
            // Editor logic
        }
    }
}

如何保证Editor下一直调用Update这些函数

参考:https://forum.unity.com/threads/solved-how-to-force-update-in-edit-mode.561436/

OnDrawGizmos里强制调用场景刷新的API就行了

[ExecuteAlways]
public class NeverEndingUpdateCallsInEditor : MonoBehaviour
{
   void Update()
   {
      // Your thing goes here...
     Debug.Log("Yeehaw!");
   }
 
   void OnDrawGizmos()
   {
      // Your gizmo drawing thing goes here if required...
 
#if UNITY_EDITOR
      // Ensure continuous Update calls.
      if (!Application.isPlaying)
      {
         UnityEditor.EditorApplication.QueuePlayerLoopUpdate();
         UnityEditor.SceneView.RepaintAll();
      }
#endif
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值