TomoGのごちゃまぜ倉庫

MENU

Unity BlendShapesを文字列で管理

今回は以前の記事で使用したSkinned Mesh RendererのBlendShapesを文字列で管理する方法を書きます。
↓以前の記事
tomog.hatenablog.com

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class ShapeRenderer : MonoBehaviour {

    private Dictionary<string, int> ShapeKeyList;

    public void SetMesh(GameObject TargetObject)
    {
        ShapeKeyList = new Dictionary<string, int>();
        SkinnedMeshRenderer target = TargetObject.GetComponent<SkinnedMeshRenderer>();
        
        for(int index = 0; index < target.sharedMesh.blendShapeCount; index++)
        {
            ShapeKeyList.Add(target.sharedMesh.GetBlendShapeName(index), index);
        }
    }

    public int GetIndex(string key)
    {
        if (ShapeKeyList.ContainsKey(key))
            return ShapeKeyList[key];

        return -1;
    }

    public string GetKey(int index)
    {
        if (ShapeKeyList.ContainsValue(index))
            return ShapeKeyList.First(x => x.Value == index).Key;

        return "";
    }
}

ソースコードの大まかな説明をすると、シェイプキーの数だけDictionaryにシェイプキーの名前と番号を追加
その追加されたDictionaryを使って、文字列による番号検索を行っている。

■使い方

シェイプキーを追加しているオブジェクトをTargetとすると
SetMesh(Target)で全てDictionaryに保存される。

後はGetIndex(使用するシェイプキー名)で番号をもらうか
GetKey(使用する番号)でシェイプキーをもらえます。

■細かな説明

・SkinnedMeshRenderer.sharedMesh.blendShapeCount
シェイプキーの数を返り値とするもの。

・SkinnedMeshRenderer.sharedMesh.GetBlendShapeName(int index)
index番目のシェイプキー名が返り値

◇参考サイト

onoty3d.hatenablog.com