4

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

 5 months ago
source link: https://blog.uwa4d.com/archives/TechSharing_369.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

1)通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别
2)OPPO相关机型没法在Unity启用90或120FPS
3)手机输入法中的emoji
4)Unity Application Patching怎么用


这是第369篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Q:通常,当我们想要更改Image组件的Color时,我们可以直接修改Image组件的Color属性。原理是修改网格的顶点颜色。此操作有一定的开销,因为会导致Canvas.BuildBatch操作。

我最近看了一些UGUI源码,发现当Button组件设置为Color Tint类型时,点击时会出现颜色渐变过程,此时会触发一个协程,每次执行协程都会修改CanvasRenderer组件的颜色,而不是直接修改Image组件的Color属性。

public abstract class Graphic : UIBehaviour, ICanvasElement
{
    private readonly TweenRunner<ColorTween> m_ColorTweenRunner;

    //trigger on click
    public virtual void CrossFadeColor(Color targetColor, float duration, 
        bool ignoreTimeScale, bool useAlpha, bool useRGB)
    {
        //...
        var colorTween = new ColorTween {duration = duration, 
            startColor = canvasRenderer.GetColor(), targetColor = targetColor};

        //The callback here will be triggered in the coroutine,
        //Modify the color of the canvasRenderer component
        colorTween.AddOnChangedCallback(canvasRenderer.SetColor);

        colorTween.ignoreTimeScale = ignoreTimeScale;
        colorTween.tweenMode = mode;

        //Start coroutine
        m_ColorTweenRunner.StartTween(colorTween);
    }
}

请问这两种写作方式之间的本质区别是什么?直接修改CanvasRenderer.color是否更有效?

A:CanvasRenderer.SetColor方法的注释是CanvasRenderer的颜色会被用于和UI顶点色、Canvas Color相乘,来得到最后渲染UI网格所使用的顶点色。但是CanvasRenderer.SetColor不会触发C#层的GraphicRebuild,在Profiler中可以确认这一点。

从Profiler耗时比较来看,两种方法差距不明显,若去掉MonoJIT的编译耗时,可能Image.color效率还更高一些。

1.png
2.png

感谢宗卉轩@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/658d72b93625c22cffcb1dbd


Platform

Q:以下设置在小米10 Pro正确运行在90FPS:
Vsync Count已经设置为Don't Sync;
Application.targetFrameRate = 90或120。

华为MatePad正确运行在90FPS和120FPS,而OPPO Pad、一加8Pro(氢os)、一加9Pro(ColorOS)均只能运行在60FPS。

测试了OPPO Pad玩LOL手游版可以通过改设置文件的方式运行在120FPS,说明设备本身是支持120FPS的。

测试了两款游戏均有以上问题,Unity版本分别为2018.4.14和2019.4.29,不知道有没有熟悉OPPO设备的同学可以帮忙解答一下。

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/62612ec436a2fd066de2febf


Q:在《寒霜启示录》中,当选择游戏中的表情之后,该表情出现在输入栏中,点击输入栏进行编辑,该表情出现在输入法中的输入栏,这个怎么做到的(一般情况下游戏内的表情都是类似#1、#2、#3这种,然后emoji系统检测该字段转化为图片的)?

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/6596792c3625c22cffcb1dcd


Editor

Q:最近看到Unity文档有一个对Application Patching的介绍,据说是可以加速真机测试的速度,因此想使用一下。

原本项目的打包流程是:
1. 导出安卓工程
2. 把AssetBundle复制到安卓工程里
3. 打出APK

但是使用了Patching功能后发现,原本800MB的应用变成200MB,而且AssetBundle全都读取不到了,感觉像是重新打了一个APK安卓,而且没有管AssetBundle,然后把我之前的应用覆盖安装了,有大佬知道是哪里用错了吗,还是这个功能只能用于默认的构建管线?

A1:一般来说,针对热更新,要么你Android测试机本地内网做了热更新机制,要么你也可以手动将资源文件(可能+Lua代码)替换到可读写目录,也可以达到不用安装包的目的(主要是省了打APK的时间,只需要打资源就行,但是如果打过一次APK之后再打APK,这个打APK速度还是很快的可以接受的)。

感谢夏霖锐@UWA问答社区提供了回答

A2:解决了,第一次Patch确实是直接覆盖整个APP,后续的Patch才是增量,因此需要手动复制AssetBundle到StreamingAssets目录。

但是覆盖APP又会导致我在导出的AndroidProj中做的自定义修改没法生效,这个问题还是没解决。

感谢题主布偶团子@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6594cbd540a8d93b624afc7c

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK