关于ui:NGUI-Label-自定义材质球无效

10次阅读

共计 3833 个字符,预计需要花费 10 分钟才能阅读完成。

1)NGUI Label 自定义材质球有效
​2)代码保留预制体呈现图片失落的问题
3)降级 Unity 版本,粒子系统触发的闪退问题
4)场景打包 AssetBundle 过大


这是第 296 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

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

NGUI

Q:想在 NGUI 下做一个字体溶解 Shader,自定义的 Shader 材质球给 Label 不起作用,有没有大佬理解这块内容?

A:猜想题主是要在编辑器外面的材质球对象上调整_Threshold 的数值,但在 Game 窗口发现文本没有发生变化。

实质起因是 NGUI 在对 Label 进行渲染的时候应用的并不是编辑器外面赋值的材质球,而是在 NGUI 进行合并 DrawCall 后动态创建的 Material,所以咱们须要对这个材质球进行材质球属性设置。

这里能够通过脚本来给理论渲染 Label 的材质球调整属性达到成果。以下别离是 Threshold 为 0 和 Threshold 为 0.4 的成果。

public class TestLabel : MonoBehaviour
{
    public float threshold;
    public UILabel label;

    void Update()
    {if (label.drawCall != null)
            label.drawCall.dynamicMaterial.SetFloat("_Threshold", threshold);
    }
}

PS:这样解决的害处是,和这个 Label 在同一个 DrawCall 的 Label 都会受到影响,所以须要将这些成果的 Label 的 Depth 做非凡解决,和其它的 Label 不放在同一个 DrawCall 中。

另外在 NGUI 的 UI DrawCall 脚本中,能够关上 SHOW_HIDDEN_OBJECTS,这样在编辑器外面是能够看到生成具体的 DrawCall 对象,也就能够看到它们的材质球属性变动。

从下图能够看到具体的 DrawCall,它的材质球名字会在后面加 [NGUI] 的字样,和编辑器里不是同一个材质球。

感激 Xuan@UWA 问答社区提供了答复

Script

Q:我在 Unity 2021.3.x 上想依据配置动静生成预制体。当初遇到的问题是,能够把图片动静读取下来,而后保留预制体了当前,图片就失落了,应该是须要批改.prefab 里的值。

我应用 SerializedObject 模块.objectReferenceValue 去批改 m_Sprite 不会失效,它是援用类型的,而值类型的都是能够批改的。有大佬晓得怎么批改嘛?

A:用上面的代码,是能够在编辑器里改的,不太确定楼主是不是想要在编辑器里操作,还是在 Runtime 下操作,实践上 Runtime 时是没有预制体的概念的。在编辑器外面,选中预制体,而后点击 Update Prefab Asset 按钮即可。

预制体很简略:

public class Example
{[MenuItem("Examples/Update Prefab Asset")]
    static void AddBoxColliderToPrefab()
    {
        // Get the Prefab Asset root GameObject and its asset path.
        GameObject assetRoot = Selection.activeObject as GameObject;
        string assetPath = AssetDatabase.GetAssetPath(assetRoot);

        Texture2D tt = AssetDatabase.LoadAssetAtPath("Assets/2.jpg", typeof(Texture2D)) as Texture2D;

        Sprite ss = AssetDatabase.LoadAssetAtPath("Assets/3.jpg", typeof(Sprite)) as Sprite;
        // Load the contents of the Prefab Asset.
        GameObject contentsRoot = PrefabUtility.LoadPrefabContents(assetPath);

    // Modify Prefab contents.
        contentsRoot.transform.Find("RawImage").GetComponent<UnityEngine.UI.RawImage>().texture = tt;
        contentsRoot.transform.Find("Image").GetComponent<UnityEngine.UI.Image>().sprite = ss;


        contentsRoot.AddComponent<BoxCollider>();

        // Save contents back to Prefab Asset and unload contents.
        PrefabUtility.SaveAsPrefabAsset(contentsRoot, assetPath);
        PrefabUtility.UnloadPrefabContents(contentsRoot);
    }
}

感激 Xuan@UWA 问答社区提供了答复

ParticleSystem

Q:咱们降级了版本到 2018.4.36f1,但特效是 5.6 做的,从新激活特效属性后预制件产生了很多的扭转。所以大略起因是高版本不兼容低版本的特效。

捕获 crash.dmp 反馈异样“该线程尝试读写某个虚拟地址,而它对该地址不具备相应的拜访权限”。没有其余的堆栈信息。

已知是特效子物体的某一个粒子导致了闪退,但不知其根本原因是粒子的哪一部分导致。

已知该闪退粒子应用了 Emission,Shape,Limit Velocity over Lifetime,Color over Lifetime,Size over lifetime 和 Renderer。

Shader 是共用的,所以我就没有狐疑 Shader。

用 Demo 复现的办法,逐个排查发现只有从新激活 Limit Velocity over Lifetime,特效就不会卡死。不能说从新激活,暗藏该属性打包 -> 播特效 Win 端不卡死 -> 从新激活该属性 -> 播特效 Win 端不卡死。从新将该预制件回滚,打包 -> 播特效 Win 端卡死。

A1:以前遇到过这两种粒子系统导致的闪退:

  1. 粒子 Renderer 的 Mesh 的 RW 没勾选,导致闪退;
  2. 粒子 Renderer 的 Mesh 没有清理洁净,也可能会导致闪退,比方原来粒子 Renderer 的 Rendermode 为 Mesh,并设置了自定义的 Mesh,而后美术批改 Rendermode 为 billBoard,这时候原 Mesh 的援用关系还在,某个挺早的 Unity 版本可能会导致闪退。

如果不是这两个问题,那就要用 Demo 逐个排查。

感激范世青 @UWA 问答社区提供了答复

A2:降级之后,所有 Prefab 用 AssetDatabase.ForceReserializeAssets 从新序列化一下。

感激张迪 @UWA 问答社区提供了答复

AssetBundle

Q:有一个场景,外面有很多物件设置为 Static,Unity 在打场景 AssetBundle 的时候会主动将各个物件的 Mesh 合并成一个大的,导致该场景的 Assetbundle(只蕴含.scene 文件)达到 10 多 MB,大家有什么解决方案吗?

A1:首先应该晓得为什么场景这么大,有没有优化空间,能够用 AssetStudioGUI 看下 Assetbundle 里的资源,把能精简的精简掉。

如果的确无奈精简,包体还是太大,能够把场景关联的资源提取进去,动静加载入场景,场景过大容易产生加载卡顿,动静加载能够本人管制加载吞吐量,在优化上也比拟好把控。这也是最倡议的一种形式。

感激廖武兴 @UWA 问答社区提供了答复

A2:能够关掉动态合批,而用手动动态合批,耗时不长,一个比较复杂的场景 700ms,一般场景失常 200ms 左右。

只不过在合并的时候会有一个内存峰值须要留神,还有手动 Mesh 的 RW 须要开启:
StaticBatchingUtility.Combine(item.GoList, _inst.gameObject);
mesh.UploadMeshData(true);
Resources.UnloadUnusedAssets();

感激范世青 @UWA 问答社区提供了答复

A3:对于一个场景来说,纯 Mesh 应该到不了 10 多 MB,这个外面预计应该蕴含了所有援用到的贴图,能够通过调整对应平台的贴图压缩格局来进行简化。

感激萧小俊 @UWA 问答社区提供了答复

A4:如果用了 GPU Instancing 或者 SRP Batching,就没有必要设置为 Static Batching。

感激 jim@UWA 问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

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

正文完
 0