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(原群已满员)