Unity SkinnedMeshRenderer---用.BakeMesh()从SkinnedMeshRenderer获取正确显示的普通Mesh

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

 

操作前提:1.一个带有骨骼动画且在场景中运行动画的Prefab(预制体)

                  Unity SkinnedMeshRenderer---用.BakeMesh()从SkinnedMeshRenderer获取正确显示的普通Mesh_第1张图片

本文要获取的是如图橙色线包围的网格

 

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();

        TgameObject = new GameObject("TarlingObject");//特效对象
		 
        var mr = TgameObject.AddComponent();//赋予材质
		mat = new Material(Shader.Find("Standard"));
		mr.material = mat;


        mf = TgameObject.AddComponent();
	  
  
	}
	
	// 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进行各种操作。

如下是挂载代码与不挂载代码的对比

Unity SkinnedMeshRenderer---用.BakeMesh()从SkinnedMeshRenderer获取正确显示的普通Mesh_第2张图片

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

Unity SkinnedMeshRenderer---用.BakeMesh()从SkinnedMeshRenderer获取正确显示的普通Mesh_第3张图片

 

 

你可能感兴趣的:(Unity SkinnedMeshRenderer---用.BakeMesh()从SkinnedMeshRenderer获取正确显示的普通Mesh)