【ET&FGUI】MCIO 版本升级排坑

发布于 2019-12-30  19 次阅读


前言

鸽了快一年了(这一年可以说是经历了很多事情了),终于又重新开始了MCIO的开发,很久没更新,很多东西都变了,让我有点措手不及。
比如ET框架...我从3.3直接升级到5.0,变化非常大,有很多东西不兼容,感觉步子确实迈得有点大。
同时VS从2017升级到2019,还有些细节没有习惯。
Unity也由2017.3f升级到2019.2.4f(中途升级到2018.4.2f,想着更新一点东西但是遇到很多问题就又搁置了)
现在项目是全部抛干净,重新在ET5.0的DEMO项目基础上进行删改添加,顺利的话应该能够在过年前移植过来。
下面详细聊聊框架升级遇到的一些内容,主要就是ET框架和FGUI了。

FairyGUI

首先是FairyGUI的UnitySDK也升级了,最重要的一点就是不支持旧版本的包了,改用二进制格式。这个可以直接在编辑器里面设置,问题不大。
另外一点就是FairyGUI的部分接口变了。
比如以前动效用的是DG.Tweening,现在直接封装了一个GTweening类,动画曲线的枚举类型也由Ease也变成了EaseType.,搞笑的是类型名称颠倒了一下,比如QuadOut 变成了OutQuad

ET

引用asmdef

另外一点就是,新ET框架使用的项目管理有点奇怪,.Net学得不多,感觉应该是引用工程,这样就没办法添加工程的引用,变成了分析器....直接添加分析器的引用又不没有反应。最后发现直接在代码里面使用ALT+ENTER大法,会自动弹出一个将参数引用添加到xxxx的选项,点它就好了。
后面问了下ET群里面的dalao,其实ET从3.3之后某个版本开始就用asmdef来配置依赖了,就是这个
asmdef
这个配置起来就和gradle啊什么的有点类似了
asmdef配置
还是属于基本功不太熟啊,残念

宏定义

更新到5.0之后热更下载包这块儿的异步处理加了一个判断(我也不知道是哪个版本加的,毕竟之前的3.3有点久远了)
异步下载判断
跳转进去看到是一个宏定义...这个宏定义其实我之前都没有搞清楚在哪里加..
宏定义
我觉得应该是哪儿有个#define XXX这样的代码才是。
之前一直搜索的是VS2019的宏定义在哪儿加,结果这次又搜了半天,突然想到了什么,搜了下Unity的宏定义
好家伙,就是这个东西,在:PlayerSettings->Other Setting->Scripting Define Symbols
添加宏定义
之前一直没留意过这个...醉了,下面是Allow unsafe code的设置,ET5.0也需要这个设置。
后来我发现加个这个宏定义很多地方要改动...因此直接删掉宏定义,然后将下载包这儿的判断注释掉了。

protobuf

另外protobuf也升级到proto3版本了,也有一堆改进(google觉得之前很多设计的东西不太科学,就删掉了!!!)
比如optional可选项。
直接去官方Github上看,让使用一个包装项wrappers来解决问题,兴冲冲地搞下来,发现ET的Proto2CS通不过编译。
报错是WellKnownTypes这个类找不到...
折腾了一阵,我决定放弃使用这些属性,毕竟官方也不推荐,最后在代码里面做验证就好了。
后来我闲逛github看见ET的protobuf仓库有这么一句话...
ET的proto是阉割版
蛤?原来是被阉割了...怪不得
岂可修

Untiy

unity的变化可以说是很大了(毕竟一次性跨越了两个年度大版本2017-2019)
首先是启动使用了UntiyHub,可以像Unreal那样管理多个版本的Untiy了
从2018引入的package manager包管理器,在2019中更加方便,想要添加的包直接加入就行
此外还有一些界面上的变化,这个就不啰嗦了,讲一下我遇到的关于SRP(可编程渲染管线的问题)
升级到2019,也加入了适合移动平台的轻量级渲染管线LWRP
如果是新建项目的话,选择LWRP Temple会自动引入,老项目也可以通过包管理器来下载添加
但是LWRP默认不支持相机剔除的渲染模式(即FGUI使用的Camera Depth Only)
升级到LWRP 6.9.1版本后,连Depth Only这个选项都没有了(多了一个Don't care什么鬼?)
camera.png

那么FGUI启动的状态就是会只显示UI,然后背景黑屏
解决方法本来很简单,但是被我弄复杂了
首先是找到LWRP中的ScriptableRenders.cs进行修改
在364行附近,可以看到有针对ClearFlag的赋值操作
添加上代码,如果是UI相机就把ClearFlag设置成DepthOnly
这里我把UI相机的layer设置为UI

if (passColorAttachment == m_CameraColorTarget && !m_FirstCameraRenderPassExecuted)
{
    m_FirstCameraRenderPassExecuted = true;

    Camera camera = cameraData.camera;
    ClearFlag clearFlag = GetCameraClearFlag(camera.clearFlags);
    // 在这里强行刷个StageCamera的深度标志
    int UI_LAYER = 5;
    if (camera.gameObject.layer == UI_LAYER)
    {
        clearFlag = ClearFlag.Depth;
    }
    // 在这里强行刷个StageCamera的深度标志
    SetRenderTarget(cmd, m_CameraColorTarget, m_CameraDepthTarget, clearFlag,
        CoreUtils.ConvertSRGBToActiveColorSpace(camera.backgroundColor));

    context.ExecuteCommandBuffer(cmd);
    cmd.Clear();

    if (cameraData.isStereoEnabled)
    {
        context.StartMultiEye(cameraData.camera);
        XRUtils.DrawOcclusionMesh(cmd, cameraData.camera);
    }
}

同时,记得在LightweightRenderPipelineAsset中取消掉Opaque的选项
lwrp.png
之前就是一直没设置这里,导致改了代码也没有生效,搁置了很久才解决掉
可以参考下FariyGUI的这篇回答 Unity2019 LWRP渲染模式下,FairyGUI有做支持吗?

Comments


来自像素世界的代码家,创造第九艺术!