Mesh.GetBonesPerVertex
Declaration
public NativeArray<byte> GetBonesPerVertex();Возвращаемое значение
NativeArray<byte> Возвращает число ненулевых весов костей для каждой вершины.
Описание
Число ненулевых весов костей для каждой вершины.
Размер возвращаемого массива является либо Mesh.vertexCount, либо нулевым. Массив сортируется в порядке индекса вершин.
Используйте в сочетании с Mesh.GetAllBoneWeights для получения весов костей для вершин в Mesh.
Нет необходимости распоряжаться возвращаемым нативным массивом. Однако нативный массив указывает на память, которая может быть выделена или перераспределена, поэтому вы должны вызывать GetBonesPerVertex каждый кадр для получения правильных данных или проверять, что нативный массив все еще действителен каждый кадр.
Дополнительные ресурсы: Mesh.GetAllBoneWeights, Mesh.SetBoneWeights, ModelImporter.maxBonesPerVertex, QualitySettings.skinWeights, SkinnedMeshRenderer.quality.
using UnityEngine;
public class TestSkinnedMesh : MonoBehaviour { void Start() { // Get a reference to the mesh var skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>(); var mesh = skinnedMeshRenderer.sharedMesh;
// Get the number of bone weights per vertex var bonesPerVertex = mesh.GetBonesPerVertex(); if (bonesPerVertex.Length == 0) { return; }
// Get all the bone weights, in vertex index order var boneWeights = mesh.GetAllBoneWeights();
// Keep track of where we are in the array of BoneWeights, as we iterate over the vertices var boneWeightIndex = 0;
// Iterate over the vertices for (var vertIndex = 0; vertIndex < mesh.vertexCount; vertIndex++) { var totalWeight = 0f; var numberOfBonesForThisVertex = bonesPerVertex[vertIndex]; Debug.Log("This vertex has " + numberOfBonesForThisVertex + " bone influences");
// For each vertex, iterate over its BoneWeights for (var i = 0; i < numberOfBonesForThisVertex; i++) { var currentBoneWeight = boneWeights[boneWeightIndex]; totalWeight += currentBoneWeight.weight; if (i > 0) { Debug.Assert(boneWeights[boneWeightIndex - 1].weight >= currentBoneWeight.weight); } boneWeightIndex++; } Debug.Assert(Mathf.Approximately(1f, totalWeight)); } } }