打开网易新闻 查看精彩图片

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

UWA社区主页: community.uwa4d.com

本期目录:

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

UI

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

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

public abstract class Graphic : UIBehaviour, ICanvasElement
{
private readonly TweenRunner 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效率还更高一些。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

感谢宗卉轩@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

UI

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

针对以上问题,有经验的朋友欢迎转至社区交流分享:

https://answer.uwa4d.com/question/6596792c3625c22cffcb1dcd

Editor

Q:最近看到Unity文档有一个对Application Patching的介绍(https://docs.unity3d.com/Manual/android-AppPatching.html),据说是可以加速真机测试的速度,因此想使用一下。

原本项目的打包流程是:

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

点击下方名片关注我们,将我设为星标,及时接收小编每日推送哦,性能优化不迷路~

近期精彩回顾