共计 2946 个字符,预计需要花费 8 分钟才能阅读完成。
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(原群已满员)