GetAllBoneWeights()
Gets the bone weights for the Mesh.
Read time 1 minuteLast updated 13 days ago
Definition
- Type: Method
- Namespace: UnityEngine
- Assembly: UnityEngine.CoreModule
public NativeArray<BoneWeight1> GetAllBoneWeights()
Returns
Type | Description |
|---|---|
| NativeArray<BoneWeight1> | Returns all non-zero bone weights for the Mesh, in vertex index order. |
Remarks
Use Mesh.GetBonesPerVertex to get the number of non-zero weights for each vertex, and then use that to iterate over this data.
For each vertex, the BoneWeight1 structs are sorted by BoneWeight1.weight, in descending order.
Additional Resources: Mesh.SetBoneWeights, Mesh.GetBonesPerVertex, Mesh.boneWeights, Mesh.GetBoneWeights ModelImporter.maxBonesPerVertex, QualitySettings.skinWeights, SkinnedMeshRenderer.quality.
Examples
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)); } }}