头图

AssetBundle加载的TMP字体材质赋值失败

1)AssetBundle加载的TMP字体材质赋值失败
​2)资源打包关系依赖树
3)Shader中设置ColorMask后,最终输出颜色的计算
4)Time.deltaTime和Time.unscaledDeltaTime值不一致


这是第293篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

UGUI

Q:从AssetBundle加载的TMP字体材质,为什么在代码中设置为TMP组件的材质会失败?

使用Resources.Load加载材质赋值是可以的,但是AssetBundle加载代码赋材质却行不通。这里是把材质和字体都打了AssetBundle,TMP相关其他的没有打AssetBundle,走的TMP本身的Resources.Load加载方式。

从AssetBundle中LoadAsset后用一变量存了材质,然后所有text的材质赋值都访问了这个变量。

A:TMP字体内部默认用的Resources.Load的方式加载资源,建议修改TMP源码,把所有Resources.Load加载资源的方式代理成自己的。

我们的方案是:
在非AssetBundle模式下用它自身的加载方式。
AssetBundle模式下,就会由框架的资源加载代理。

感谢1 9 7 3-311135@UWA问答社区提供了回答

AssetBundle

Q:想做包体资源分析,大家有什么好的树显示工具或者思路推荐吗?有比较好的开源方案也可以。最简单就像N叉树一样,比如root一个文件名,然后展开整个树结构。

A1:我自己做了一个,供参考。都是用Unity自己的IMGUI最基本的接口去实现。
EditorWindows
GUI.Box
GUI.BeginGroup
GUI.Label
Handles.DrawBezier
Handles.DrawWireDisc
TreeView
基本上,组织好各个AssetBundle的依赖关系其实是很好呈现的。

感谢黄程@UWA问答社区提供了回答

A2:推荐一款比较好用的插件,不止有依赖树,还有其他打包的资源数据可供分析:
https://assetstore.unity.com/...

感谢郑骁@UWA问答社区提供了回答*

Shader

Q:场景中有一个相机,ClearFlags为SolidColor,颜色设置为Blue(0,0,1,1)。

另外创建了个Cube,使用 一个最普通的vf shader,设置的输出颜色是Red,即fixed4(1,0,0,1);使用默认的ColorMask设置则会输出红色Cube,但是若设置了ColorMask R,最终Cube的颜色显示的是Blue和Red混合出来的,这一块有什么文档可以参考吗?

附Shader:

Shader "Custom/ColorMask"
{
    Properties
    {
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            ColorMask R

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(1, 0, 0, 1);
            }
            ENDCG
        }
    }
}
A1:猜测ColorMask R应该是只写入当前R通道的颜色,但是GB仍然会从摄像机的Background值获取。

感谢Knight-132872@UWA问答社区提供了回答

A2:Background的颜色是每帧渲染其他对象之前要对ColorBuffer设置的颜色,所以在渲染Cube之前,Color Buffer的颜色是蓝色的。当渲染这个物体时,默认是ColorMask为RGBA的,就是4个通道的值作为Source Color会和Dest Color的Color Buffer进行颜色混合,所以就显示为红色了。如果ColorMask只设置了R通道,那么只有R通道会进行颜色混合,默认的Blend模式为Blend One Zero,所以R通道的数值最终变成了1,而GB通道因为不做混合,所以保留了Dest Color的数值,所以最终Color Buffer的数值变成了(1,0,1)。

所以楼主理解的可能是先全部通道混合,再取R通道的数值作为Color Buffer的值,其他通道变成0,这样无论是ColorMask RGBA还是ColorMask R,都只会显示红色。实际上如果设置了ColorMask R,那么走的逻辑是只对R通道做了混合,GB通道的数值保持不变。

感谢Xuan@UWA问答社区提供了回答

Script

Q:Time.deltaTime和Time.unscaledDeltaTime值不一致问题,当timeScale等于1时且FPS稳定在60时两个API数值基本一致。但是FPS不稳定时,发现两个API得到的数值就不一致,有时差距很大。

问题1:请教怎么得到真正的未被timeScale缩放的DeltaTime呢?
问题2:或者怎么才能计算出和Time.deltaTime保持一致的值呢?

A1:使用Time.unscaledDeltaTime试试,它不受Time.timeScale影响。

感谢廖武兴@UWA问答社区提供了回答

A2:Unity内部对Time.deltaTime的计算做了最大上限的限制,不会超过Time.maximumDeltaTime,所以Time.deltaTime受到Time.timeScale和Time.maximumDeltaTime两个数值的影响,而Time.unscaledDeltaTime是不受限制的,因此当帧率不稳定导致某一帧的耗时超过Time.maximumDeltaTime后,(假设Time.timeScale为1),Time.unscaledDeltaTime就会比Time.deltaTime大。

所以,对于问题1,使用Time.unscaledDeltaTime即可。对于问题2,这个完全由Unity内部的算法决定的,除非有源码,否则不清楚是怎么算的。

感谢Xuan@UWA问答社区提供了回答:

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)

UWA官网:[链接]

33 声望
12 粉丝
0 条评论
推荐阅读
URP Shader FrameBuffer Fetch Mali Crash
1)URP Shader FrameBuffer Fetch Mali Crash​2)Unity模型Lightmap UV相关的疑问3)动画上下半身融合问题4)AnimatorControllerPlayable.PrepareFrame函数在什么情况下调用

侑虎科技

封面图
cookie 时效无限延长方案
自动化测试有2种形式,接口自动化和UI自动化。而UI自动化经常会被登录节点堵塞,例如验证码、图形、滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高,无法真正意义上实现自动化执行;而http接口...

京东云开发者1阅读 448

封面图
使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队
作者:京东零售 佟恩本文介绍,如何使用 NutUI 组件库,搭建一套为专属业务风格的业务组件库。NutUI 是一款京东风格的移动端组件库。NutUI 目前支持 Vue 和 React技术栈,支持Taro多端适配。当下的实现方式一般组...

京东云开发者阅读 852

封面图
Django笔记四十之运行Django环境的python脚本
如果代码逻辑很短,且是一次性执行的操作,我们可以在系统的根目录下使用 python3 manage.py shell 在 shell 中操作实现。

Hunter阅读 737

封面图
一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 脚本。先说结论:Redis 的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心...

勇哥java实战分享阅读 513

封面图
如何在运行时优雅地Reset DOTS
1)如何在运行时优雅地Reset DOTS​2)用顶点着色器进行旋转的Shader放在Image上不能正常工作3)FrameBuffer Fetch在确定支持的手机上显示全紫4)Unity系统中,Android端判断GamePad文件在不在

侑虎科技阅读 275

封面图
Unity升级后打包AssetBundle变慢
1)Unity升级后打包AssetBundle变慢​2)打包使有些资源合成了一个资源data.unity3d,有些分开的原因3)Unreal在移动设备中无法使用Stat命令获取到GPU Thread的耗时4)Unity中如何看到相机视野范围内的剔除结果

侑虎科技阅读 263

封面图

UWA官网:[链接]

33 声望
12 粉丝
宣传栏