在游戏中,时常需要实时获取Mesh Vertex的世界坐标做一些操作,比如在攻击点生产特效,并且需要特效跟随伤口移动。我们知道mesh vertex的位置是受作用于这个顶点的每一根骨骼变化权重的叠加,只要记录下顶点初始位置然后每一帧重新算每根骨骼的变化矩阵,在按照权重相加就可以得到这时候的顶点位置。
话不多说直接上代码。
1.获取缓存顶点数据
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
public class SkinMeshRenderVertex : MonoBehaviour
{
internal Mesh mesh;
internal SkinnedMeshRenderer skin;
internal int vertexCount;
internal NativeArray<Vector3> vertices => mVertices;
internal NativeArray<Vector3> normals => mNormals;
public System.Action<SkinMeshRenderVertex> OnResultsReady;
private RendererVertexExchangeJob job;
private NativeArray<Matrix4x4> boneMatrices;
private NativeArray<BoneWeight> boneWeights;
private NativeArray<Vector3> meshNormals;
private NativeArray<Vector3> meshVertices;
private NativeArray<Vector3> mVertices;
private NativeArray<Vector3> mNormals;
private Transform[] bones;
private Matrix4x4[] binePose;
private int boneCount = 0;
void Start()
{
skin = GetComponent<SkinnedMeshRenderer>();
mesh = skin.sharedMesh;
vertexCount = mesh.vertexCount;
Debug.Log($"[Skin