(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


BlendShapes(ブレンドシェイプ)の値をプログラムで操作する【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2020.3.25f1


はじめに

Unityの3Dモデル(SkinnedMeshRenderer)には

BlendShapes(ブレンドシェイプ)で表情等の操作が出来るものがありますが、

f:id:kan_kikuchi:20220118075241g:plain


今回はこのBlendShapesの値をプログラムで操作してみようという感じの記事です!

f:id:kan_kikuchi:20220118075722g:plain


なお、記事中では以下のアセットを使っています。



BlendShapesの値をプログラムで操作する

早速ですが、BlendShapesの値をプログラムで操作するには

SkinnedMeshRendererのSetBlendShapeWeight

第1引数に変更したい所のindex、第2引数が設定したい値を渡して実行するだけ。

(※以下の例のButton属性はOdinの属性)

[Button]//Inspectorにメソッドを実行するボタンを表示
public void ChangeSmile() {
  _skinnedMeshRenderer.SetBlendShapeWeight(21, 100);
  _skinnedMeshRenderer.SetBlendShapeWeight(29, 100);
  _skinnedMeshRenderer.SetBlendShapeWeight(38, 100);
  _skinnedMeshRenderer.SetBlendShapeWeight(45, 100);
}
f:id:kan_kikuchi:20220118075418g:plain


ちなみにindexは上から順に0,1,2……という感じです。

f:id:kan_kikuchi:20220118075230p:plain


また、GetBlendShapeWeightで指定したIndexの値を取得する事も出来ます。

[Button]
public void GetBlendShapeWeight() {
  Debug.Log($"0番目のブレンドシェイプの値 : {_skinnedMeshRenderer.GetBlendShapeWeight(0)}");
  Debug.Log($"2番目のブレンドシェイプの値 : {_skinnedMeshRenderer.GetBlendShapeWeight(2)}");
  Debug.Log($"5番目のブレンドシェイプの値 : {_skinnedMeshRenderer.GetBlendShapeWeight(5)}");
}
f:id:kan_kikuchi:20220118075813j:plain


ちなみにsharedMeshのblendShapeCountで設定されているBlendShapesの数を取得できるので、

以下のようなループで回して全てに0を設定すればリセットする事も可能です。

[Button]
public void ResetFace() {
  for (int i = 0; i < _skinnedMeshRenderer.sharedMesh.blendShapeCount; i++) {
    _skinnedMeshRenderer.SetBlendShapeWeight(i, 0);
  }
}
f:id:kan_kikuchi:20220118075459g:plain