В Unity, если GameObject имеет BlendShape, этот GameObject всегда имеет SkinnedMeshRenderer.
Итак, я использую следующий код, чтобы определить, есть ли у присоединенного GameObject BlendShapes.
Test.cs
using UnityEngine;
using System;
public class Test : MonoBehaviour
{
SkinnedMeshRenderer testSkin;
// Start is called before the first frame update
void Start()
{
testSkin = GetComponent<SkinnedMeshRenderer>();
if (testSkin != null)
{
Debug.Log("this object have blendShapes");
}
else
{
Debug.Log("this object don't have blendShapes");
}
}
}
Однако бывают случаи, когда GameObject имеет SkinnedMeshRenderer, но не BlendShapes. Все объекты, затронутые скиннингом костей, имеют SkinnedMeshRenderer.
Есть ли способ получить только GameObjects с BlendShape?
Вы можете использовать BlendShape API, предоставленный для Meshes: Mesh Scripting API
Как видите, Unity предоставляет вам свойство blendShapeCount
или функцию GetBlendShapeName
, которая возвращает имя блендшейпа по определенному индексу. Поэтому такие решения могут быть вам полезны:
во-первых, получите ссылку на средство рендеринга скелетной сетки на gameObject:
var skinnedMesh = gobject.GetComponent<SkinnedMeshRenderer>();
if (!skinnedMesh || !skinnedMesh.sharedMesh)
{
Debug.LogError("the game object does not include any mesh on it");
}
затем проверьте количество blendShapes на сетке
if (skinnedMesh.sharedMesh.blendShapeCount > 0)
{
Debug.Log("This mesh has blendShapes");
}
Вы можете получить количество blendshapes через Mesh.blendShapeCount
так что вы можете фильтровать как
public bool HasBlendShapes()
{
if (!TryGetComponent<SkinnedMeshRenderer>(out var skinnedMeshRenderer))
{
Debug.LogWarning("This object doesn't even have a SkinnedMeshRenderer!", this);
return false;
}
if (!skinnedMeshRenderer.sharedMesh)
{
Debug.LogWarning("There is no Mesh attached to this SkinnedMeshRenderer!", this);
return false;
}
if (skinnedMeshRenderer.sharedMesh.blendShapeCount <= 0)
{
Debug.Log("this SkinnedMeshRenderer doesn't have blendShapes", this);
return false;
}
Debug.Log($"this SkinnedMeshRenderer has {skinnedMeshRenderer.sharedMesh.blendShapeCount} blendShapes", this);
return true;
}
Примечание: набрано на смартфоне, но надеюсь, что идея понятна.