当前位置:网站首页>Unity 动态合并网格纹理
Unity 动态合并网格纹理
2022-07-07 21:48:00 【weixin_44489379】
public static class CarControlMeshCombine
{
/// <summary>
/// 图片缓存路径,这个路径在运行时不可访问,可以使用StreamAssets
/// </summary>
[SerializeField]
private static string TGAPath = "Assets/ArtAssets/A_3D/Cars/LicensePlates/Textures/texture.tga";
/// <summary>
/// material缓存路径,这个路径在运行时不可访问,可以使用StreamAssets
/// </summary>
[SerializeField]
private static string MaterialPath = "Assets/ArtAssets/A_3D/Cars/LicensePlates/Materials/mat.mat";
/// <summary>
/// 合并网格
/// </summary>
/// <param name="gameObject"></param>
public static void CombineMesh(GameObject gameObject)
{
//获取所有子物体MeshFilter/MeshRenderer
MeshFilter[] mfChildren = gameObject.GetComponentsInChildren<MeshFilter>();
MeshRenderer[] mrChildren = gameObject.GetComponentsInChildren<MeshRenderer>();
//组合的网格
CombineInstance[] combine = new CombineInstance[mfChildren.Length];
//在父物体上创建MeshFilter和MeshRenderer
MeshRenderer mrSelf = gameObject.AddComponent<MeshRenderer>();
MeshFilter mfSelf = gameObject.AddComponent<MeshFilter>();
//创建一组材质球和纹理,并采集保存到数组
Material[] materials = new Material[mrChildren.Length];
Texture2D[] textures = new Texture2D[mrChildren.Length];
for (int i = 0; i < mrChildren.Length; i++)
{
materials[i] = mrChildren[i].sharedMaterial;
Texture2D tx = materials[i].GetTexture("_BaseMap") as Texture2D;
Texture2D tx2D = new Texture2D(tx.width, tx.height, TextureFormat.ARGB32, false);
tx2D.SetPixels(tx.GetPixels(0, 0, tx.width, tx.height));
tx2D.Apply();
textures[i] = tx2D;
}
//获取第一个材质,并拷贝参数,赋给父物体
Material materialNew = new Material(materials[0].shader);
materialNew.CopyPropertiesFromMaterial(materials[0]);
mrSelf.sharedMaterial = materialNew;
//创建一张纹理,并将纹理赋给父物体
Texture2D texture = new Texture2D(1024, 1024);
materialNew.SetTexture("_MainTex", texture);
//将数组中的纹理保存在2d矩形空间中
Rect[] rects = texture.PackTextures(textures, 10, 1024);
for (int i = 0; i < mfChildren.Length; i++)
{
if (mfChildren[i].transform == gameObject.transform)
{
continue;
}
Rect rect = rects[i];
Mesh meshCombine = mfChildren[i].mesh;
Vector2[] uvs = new Vector2[meshCombine.uv.Length];
//把网格的uv根据贴图的rect刷一遍
for (int j = 0; j < uvs.Length; j++)
{
uvs[j].x = rect.x + meshCombine.uv[j].x * rect.width;
uvs[j].y = rect.y + meshCombine.uv[j].y * rect.height;
}
meshCombine.uv = uvs;
combine[i].mesh = meshCombine;
combine[i].transform = mfChildren[i].transform.localToWorldMatrix;
mfChildren[i].gameObject.SetActive(false);
}
//合并网格
Mesh newMesh = new Mesh();
newMesh.CombineMeshes(combine, true, true);
mfSelf.mesh = newMesh;
FileWriteTexture(texture, TGAPath);
CreateMaterial(materialNew);
LoadTextureAlter(TGAPath);
MaterialSetTexture(MaterialPath, TGAPath);
}
/// <summary>
/// 把合并好的图片缓存对应在路径下
/// </summary>
/// <param name="texture"></param>
static void FileWriteTexture(Texture2D texture, string jpgPath)
{
var bytes = texture.EncodeToTGA();
FileStream file = File.Open(jpgPath, FileMode.Create);
BinaryWriter writer = new BinaryWriter(file);
writer.Write(bytes);
file.Close();
texture.Apply();
}
/// <summary>
/// 合并后的材质球缓存到MaterialPath路径下,刷新
/// </summary>
/// <param name="materialNew"></param>
static void CreateMaterial(Material materialNew)
{
AssetDatabase.CreateAsset(materialNew, MaterialPath);
AssetDatabase.Refresh();
}
/// <summary>
/// 加载缓存合并图片,修改里面的参数
/// </summary>
static void LoadTextureAlter(string path)
{
TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
textureImporter.textureType = TextureImporterType.Default;
textureImporter.isReadable = true;
AssetDatabase.ImportAsset(path);
AssetDatabase.Refresh();
}
/// <summary>
/// 缓存的Material存在上面贴图丢失的现象,重新绑定贴图数据
/// </summary>
static void MaterialSetTexture(string materialPath, string jpgPath)
{
Material LoadMaterial = AssetDatabase.LoadAssetAtPath<Material>(materialPath);
Texture2D Loadtextur = AssetDatabase.LoadAssetAtPath<Texture2D>(jpgPath);
LoadMaterial.SetTexture("_MainTex", Loadtextur);
AssetDatabase.Refresh();
}
}
边栏推荐
- Explain in detail the communication mode between arm A7 and risc-v e907 on Quanzhi v853
- How to choose the appropriate automated testing tools?
- ADC采样率(HZ)是什么怎么计算
- 一次搞明白 Session、Cookie、Token,面试问题全稿定
- Typeorm automatically generates entity classes
- Apple further entered the financial sector through the 'virtual card' security function in IOS 16
- Sword finger offer 63 Maximum profit of stock
- Time convolution Network + soft threshold + attention mechanism to realize residual life prediction of mechanical equipment
- Leetcode1984. Minimum difference in student scores
- Debezium系列之:引入对 LATERAL 运算符的支持
猜你喜欢

LeetCode203. Remove linked list elements

What does it mean to prefix a string with F?

UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xf9 in position 56: illegal multibyte sequence

Why is network i/o blocked?

Line test - graphic reasoning - 4 - alphabetic class
Apple further entered the financial sector through the 'virtual card' security function in IOS 16
![Leetcode interview question 02.07 Linked list intersection [double pointer]](/img/a5/58b4735cd0e47f1417ac151a1bcca4.jpg)
Leetcode interview question 02.07 Linked list intersection [double pointer]

Form组件常用校验规则-2(持续更新中~)

Matplotlib quick start

Sword finger offer 28 Symmetric binary tree
随机推荐
Signal feature extraction +lstm to realize gear reducer fault diagnosis -matlab code
Debezium series: introducing support for the final operator
Common verification rules of form components -2 (continuously updating ~)
Form组件常用校验规则-2(持续更新中~)
Gazebo import the mapping model created by blender
Leetcode206. Reverse linked list
Years of summary, some core suggestions for learning programming
ASP.NET Core入门五
Line test graph reasoning graph group class
Line test - graphic reasoning -7- different graphic classes
PHP method of obtaining image information
Qt Graphicsview图形视图使用总结附流程图开发案例雏形
Leetcode1984. Minimum difference in student scores
筑起云端 “免疫”屏障,让你的数据有备无患
What is fake sharing after filling the previous hole?
Digital transformation: five steps to promote enterprise progress
行测-图形推理-2-黑白格类
Select sort (illustration +c code)
Debezium series: set role statement supporting mysql8
Line measurement - graphic reasoning -9- line problem class