版本:Unity 6 (6000.0)
语言中文
  • C#

网格 .GetBonesPerVertex

建议更改

成功!

感谢帮助我们改进 Unity 文档的质量。尽管我们无法接受所有提交,但我们确实会阅读用户提出的每项建议,并在适用时进行更新。

关闭

提交失败

出于某些原因,无法提交您建议的更改。请在几分钟后<a>重试</a>。感谢您花时间帮助我们改进 Unity 文档的质量。

关闭

取消

切换至手册

声明

public NativeArray<byte> GetBonesPerVertex();

返回

NativeArray<byte> 返回每个顶点的不为零的骨骼权重的数量。

描述

每个顶点的不为零的骨骼权重的数量。

返回的数组大小为 网格.vertexCount 或 0。该数组按顶点索引顺序排序。

使用 网格.GetAllBoneWeights 配合使用以获取网格中的顶点的骨骼权重。

您无需处理返回的原生数组。但是,原生数组指向可能被取消配置或重新配置的内存,因此您应该在每一帧中调用 GetBonesPerVertex 以获取正确的数据,或每帧检查原生数组是否仍然有效。

其他资源:网格.GetAllBoneWeights网格.SetBoneWeights模型导入器.maxBonesPerVertex质量设置.skinWeights蒙皮网格渲染器.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)); } } }