遇到的问题:SkinnedMeshRenderer是骨骼动画中,经过蒙皮处理的Mesh必须带有的组件。骨骼动画均通过这个组件控制Mesh的变化。有时候,开发者想要制作自定义和骨骼动画相关的及时特效(残影,拖尾),就想要通过程序获取SkinnedMeshRenderer中的Mesh。
操作前提:1.一个带有骨骼动画且在场景中运行动画的Prefab(预制体)

本文要获取的是如图橙色线包围的网格
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TrailingMesh : MonoBehaviour {
private Material mat;
private Mesh Tmesh;
private GameObject TgameObject;
private MeshFilter mf;
private SkinnedMeshRenderer render;
// Use this for initialization
void Start () {
render = GetComponent<SkinnedMeshRenderer>();
TgameObject = new GameObject("TarlingObject");//特效对象
var mr = TgameObject.AddComponent<MeshRenderer>();//赋予材质
mat = new Material(Shader.Find("Standard"));
mr.material = mat;
mf = TgameObject.AddComponent<MeshFilter>();
}
// Update is called once per frame
void Update () {
#region-------从SkinnedMeshRenderer上拷贝可以正确显示的网格
TgameObject.transform.position = transform.position;
TgameObject.transform.rotation = transform.rotation;
Tmesh = new Mesh();
render.BakeMesh(Tmesh);
#endregion
mf.mesh = Tmesh;
}
}
将上述C#代码挂载到网格的控件中,运行,就能够生成一个和原网格重叠的新建的Mesh,而不是骨骼动画通过SkinnedMeshRenderer计算出的Mesh,你可以在此基础上可以对这个普通的Mesh进行各种操作。
如下是挂载代码与不挂载代码的对比

白色的就是新生成的普通Mesh

版权声明:本文为Traip原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。