脚本 4 脚本编译及日志

脚本编译

脚本修改完后,Unity会自动进行编译,生成DLL,并存储在 Library/ScriptAssemblies/ 目录下,最终会生成4个DLL:

  • Assembly-CSharp-firstpass.dll Assets/Plugins/ 目录下的非 Editor 子目录的代码,将编译在该 DLL 中
  • Assembly-CSharp-Editor-firstpass.dll Assets/Plugins/ 目录下的 Dditor 子目录下的代码,将编译在该 DLL 中
  • Assembly-CSharp.dll Assets/ 目录下,Plugins目录以外的代码,将编译到该 DLL 中
  • Assembly-Editor-CSharp.dll Assets/ 目录下,Plugins目录以外的,Editor 目录子目录下的代码将编译到该 DLL 中

注意,Plugins 目录下的代码,是不能访问其它目录下的代码的

编辑器编译死锁

编辑器下,运行游戏时,如果脚本发生变化,会自动编译,并继续执行。如果我们的代码逻辑很复杂,尤其是创建了多线程逻辑,则可能导致程序死锁,我们不得不杀死 Unity 编辑器进程。

有2种办法解决该问题:

  • 在菜单Editor/Preferences/General/Script Changes While Playing 下拉菜单中,选择 Stop Playing and Recompile。

  • 创建MonoBehaviour脚本,在 Update 检测编译,如果正在编译,则停止运行。该脚本要挂到游戏启动场景的对象上,并且在 Start() 中执行 DontDestroyOnLoad(this)。

        if(EditorApplication.isCompiling)
            EditorApplication.isPlaying = false;

自定义程序集

同时,Unity 允许我们自定义程序集,将代码按照模块,组织到不同的 DLL 中。方法:

在 Project 窗口中,到需要生成单独程序集的代码目录下,右键,选择 Create/Assemply Definition,来定义该目录的程序集属性。选中创建的文件,在 Inspector 中查看,编辑属性。

如果想要将其他目录的代码,编译到指定的自定义程序集,可以为该目录创建Create/Assembly Definitaion Reference,然后再自定义程序集的 Inspector 中,在 Assembly Definition References 列表中添加刚才创建的 Assembly Definition Reference 文件。

日志

我们在开发过程中,为了调试,可能需要输出大量日志,但是在打包运行时又不想输出日志,造成效率损失,我们可以检测,如果是非编辑器模式,关掉日志输出:

Debug.unityLogger.logEnabled = false;

当然了,如果可能的话,最好是打包时不打印日志,因为拼接日志字符串,也会造成GC,可以用 #if UNITY_EDITOR 来将日志包裹起来

#if UNITY_EDITOR
	Debug.Log("...");
#endif

打包时,对于错误和异常,我们希望接收,并进行处理,比如打印到日志文件,或上传到日志服务器,我们可以:

    void Start()
    {
        DontDestroyOnLoad(this);
        Application.logMessageReceived += ReceiveLog;
    }

    void ReceiveLog(string condition, string stackTrace, LogType type)
    {
        if (type == LogType.Error || type == LogType.Exception)
        {
            // ...
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值