Объявление
public NativeArrayВозвращает
NativeArray
Описание
Получает веса костей для сетки.
Используйте Mesh.GetBonesPerVertex, чтобы получить количество ненулевых весов для каждой вершины, а затем используйте его для итерации по этим данным.
Для каждой вершины структуры BoneWeight1 сортируются по BoneWeight1.weight в порядке убывания.
Смотрите так же: Mesh.SetBoneWeights, Mesh.GetBonesPerVertex, Mesh.boneWeights, Mesh.GetBoneWeightsModelImporter.maxBonesPerVertex, QualitySettings.skinWeights, SkinnedMeshRenderer.quality.
using UnityEngine;
public class TestSkinnedMesh : MonoBehaviour {
void Start()
{
// Получить ссылку на меш
var skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
var mesh = skinnedMeshRenderer.sharedMesh;
// Получаем количество весов костей на вершину
var bonesPerVertex = mesh.GetBonesPerVertex();
if (bonesPerVertex.Length == 0)
{
return;
}
// Получить все веса костей в порядке индекса вершины
var boneWeights = mesh.GetAllBoneWeights();
// Keep track of where we are in the array of BoneWeights, as we iterate over the vertices
var boneWeightIndex = 0;
// Перебираем вершины
for (var vertIndex = 0; vertIndex < mesh.vertexCount; vertIndex++)
{
var totalWeight = 0f;
var numberOfBonesForThisVertex = bonesPerVertex[vertIndex];
Debug.Log("This vertex has " + numberOfBonesForThisVertex + " bone influences");
// Для каждой вершины перебрать ее 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));
}
}
}