Unity游戏开发优化(动态合并SkinnedMeshrender)

Unity游戏开发优化(动态合并SkinnedMeshrender)代码
先上代码,再对⽐效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ComBineSM : MonoBehaviour
{
// 待合并的skinnedrender(需要所有skinnedMeshrenderer使⽤同⼀个材质,否则⽆法起到合并dc的⽬的)
public SkinnedMeshRenderer[] renders;
// 合并后使⽤的材质
public Material material;
午睡宝
void Start()
{
// 先记录当前预制件的变换矩阵,合并之后再赋值回来
Vector3 l_position = transform.position;
Quaternion l_rotation = ation;
Vector3 l_scale = transform.localScale;
transform.position = ;
transform.localScale = ;
// 待合并的skinnedrender需要记录的信息
List<Transform> bones = new List<Transform>();
List<BoneWeight> boneWeights = new List<BoneWeight>();
List<CombineInstance> combineInstances = new List<CombineInstance>();
int length = renders.Length;
int boneOffset = 0;
for (int i = 0; i < length; i++)
{
SkinnedMeshRenderer oneRender = renders[i];
// 记录⾻骼
bones.AddRange(oneRender.bones);
// 记录权重
BoneWeight[] meshBoneweight = oneRender.sharedMesh.boneWeights;
for (int j = 0; j < meshBoneweight.Length; ++j)
{
BoneWeight bw = meshBoneweight[j];
手机包装BoneWeight bWeight = bw;
bWeight.boneIndex0 += boneOffset;
bWeight.boneIndex1 += boneOffset;
bWeight.boneIndex2 += boneOffset;
bWeight.boneIndex3 += boneOffset;
boneWeights.Add(bWeight);
}
// offset是为了合并之后BoneWeight.boneIndex还能正确定向⾻骼
boneOffset += oneRender.bones.Length;
// 记录⽹格相关信息
CombineInstance combineInstance = new CombineInstance();
侧搅拌>家家乐酸奶发酵剂Mesh mesh = new Mesh();
oneRender.BakeMesh(mesh);
mesh.uv = oneRender.sharedMesh.uv;
combineInstances.Add(combineInstance);
oneRender.gameObject.SetActive(false);
}
}
// 将所有的⾻骼变换矩阵从⾃⾝转换到当前预制件下
List<Matrix4x4> bindposes = new List<Matrix4x4>();
int boneLength = bones.Count;
for (int i = 0; i < boneLength; i++)
{
bindposes.Add(bones[i].worldToLocalMatrix * transform.worldToLocalMatrix);
}
// 在当前预制下创建新的蒙⽪渲染器,设置属性
SkinnedMeshRenderer combinedSkinnedRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();        Mesh combinedMesh = new Mesh();
combinedMesh.CombineMeshes(combineInstances.ToArray(), true, true);
combinedSkinnedRenderer.sharedMesh = combinedMesh;
combinedSkinnedRenderer.bones = bones.ToArray();
合金加工combinedSkinnedRenderer.sharedMesh.boneWeights = boneWeights.ToArray();
combinedSkinnedRenderer.sharedMesh.bindposes = bindposes.ToArray();
combinedSkinnedRenderer.sharedMesh.RecalculateBounds();
combinedSkinnedRenderer.material = material;
// 还原⾃⾝的变换矩阵
transform.position = l_position;
transform.localScale = l_scale;
}
}
合并前
数显计数器
合并后
这⾥贴图并没有合并所以看起来有点奇怪,不必纠结哈哈,主要是优化功能。
最终在合并的情况下也能正常修改⾻骼点。
关于换装
关于动态蒙⽪渲染器合并可以延申到⼀个换装的⼩功能。
只需要将每个部件(每个部件都是⼀个蒙⽪渲染器)⽤脚本管理起来,切换部件的时候重新合并⼀次。另外,由于换装的部件可能有很多很多,⽆法保证都在同⼀个图集下⾯。
因此需要做动态合并贴图,并且重算uv。
后续有时间在把这块发上来吧。

本文发布于:2024-09-21 18:45:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/314224.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:合并   部件   动态   记录   渲染器   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议