关于Unity插件TriLib使用的一点儿心得

最近做一个项目的时候,由于要求动态加载fbx或者glb等格式文件,而我们自己开发加载插件难度又有点大,所以最后使用了TriLib这个插件,现在说一点使用心得。

由于文件加载之后要对加载的内容进行复制,比如加载一个柱子,然后会把这个柱子复制很多份之类的,并且在复制之后需要删除原始的物体。刚开始的时候发现一旦删除原始物体,复制出来的物体就看不到了,原因是物体中MeshFilter组件中的Mesh被删除了,也就是说复制出来的物体和原来的物体引用的是同一个Mesh,一旦删除原始物体的,其引用的Mesh也会被删除,这个主要是加载FBX时,TriLib插件给每个新加载的模型添加了AssetUnloader组件,只要这个组件被删除,那么对应被加载的模型的Mesh就会被删除。后来想了个办法,就是物体被加载之后,把物体使用的Mesh复制一份,让被加载的原始物体使用被复制的Mesh,而不是原始的,那个AssetUnloader组件不会删除复制的这份,这样在删除原始加载的物体之后就不会让复制出来物体的Mesh消失了,因为复制出来的物体使用的Mesh也是复制出来的,不是那个AssetUnloader组件里面记录的。

复制Mesh的代码参考如下:

cs 复制代码
MeshFilter[] filters = obj.GetComponentsInChildren<MeshFilter>();
for (int i = 0; i < filters.Length; i++)
{
	Mesh mesh = Instantiate(filters[i].sharedMesh);
	filters[i].sharedMesh = mesh;
}

而且后来发现材质引用的Texture也会被删除,干脆把Texture也复制了。

复制Texture的代码参考如下:

cs 复制代码
MeshRenderer[] renders = obj.GetComponentsInChildren<MeshRenderer>();
for (int i = 0; i < renders.Length; i++)
{
	MeshRenderer render = renders[i];
	Material[] mats = new Material[render.materials.Length];
	for (int j = 0; j < mats.Length; j++)
	{
		mats[j] = Instantiate(render.materials[j]);
		Texture tex = mats[j].GetTexture("_MainTex");
		if (tex != null) mats[j].SetTexture("_MainTex", Instantiate(tex));
	}
	render.materials = mats;
}

虽然上面的办法可以解决问题,但是我感觉还是能找到一些更好的办法,在想到更好的办法之前先这样吧。

相关推荐
Nuopiane1 天前
C#基础(1)堆栈、GC与Marshal
unity·c#
mxwin2 天前
Unity Shader 跨平台兼容性:处理纹理坐标翻转与精度差异
unity·游戏引擎
派葛穆2 天前
汇川PLC-Unity3d与汇川easy521plc进行Modbustcp通讯
unity·c#
small-pudding2 天前
Unity URP + Compute Shader 路径追踪器实战:从可用到可优化
unity·游戏引擎
weixin_423995002 天前
unity 物体转向鼠标点击方向2d和3d
unity·计算机外设·游戏引擎
mxwin2 天前
Unity URP 下 Shader 变体 (Variants):multi_compile 与 shader_feature的关键字管理及变体爆炸防控策略
unity·游戏引擎
RReality2 天前
【Unity Shader URP】全息扫描线(Hologram Scanline)源码+脚本控制
ui·unity·游戏引擎·图形渲染
渔民小镇2 天前
一次编写到处对接 —— 为 Godot/Unity/React 生成统一交互接口
java·分布式·游戏·unity·godot
RReality2 天前
【Unity Shader URP】序列帧动画(Sprite Sheet)实战教程
unity·游戏引擎
mxwin2 天前
Unity URP 多线程渲染:理解 Shader 变体对加载时间的影响
unity·游戏引擎·shader