【Unity】人型キャラクターの構成要素について(キャラクターのパーツのTransformを取得する)

Unityにおいて変数を知ることは熟練度を上げることや、思ったことを再現することに非常に重要な要素だと最近思っています。

 

今回はUnityの公式アセット、Unity-chanを使いながら人型キャラクターについて軽めに説明します。

別にこれがわからないとキャラクターをうごかせない訳ではないのですが、知っておくとキャラクターの情報を取得するときに使えるかもしれません。またキャラクターのアニメーションクリップを作成するときや、一部分のパーツだけ動かしたいときなどは知っていることが必須の項目になります。

 

ユニティちゃんは一つのオブジェクトとして存在していますが中身は腕や脚・頭、詳しくみると手や足などこんな感じに細かく要素に分かれています。

f:id:graphicalpoxy:20190615130413p:plain

たとえばもしユニティちゃんの脚だけ動かしたいとなった場合は

f:id:graphicalpoxy:20190615131414p:plain

このようにCharacter1_LeftUpLegのローテーションをいじると脚だけを動かすことができます。

アニメーションはこのように各要素の数値を時間ごとに記録させ、それを再生させることで決まったモーションで動かしています。

したがってこの要素を理解し、数値を取得できるようになるとアニメーションクリップも作成できます。

 

ちなみにポジションを動かすと・・・

f:id:graphicalpoxy:20190615131652p:plain

あー!僕達のアイドルユニティちゃんの脚がああああ!

となります。

 

 

ではこの要素ってどうすれば取得できるのでしょうか?

毎回getfindしたりpublicで設定するのって非常にめんどくさいですよね。


Unity上ではこの要素についてHumanBodyBonesとして定義されています。

要素の詳細は公式のマニュアルにありますので参考にしてみてください。

docs.unity3d.com

 

どうやって使うかなのですが、実際にユニティちゃんの左脚の情報を取得するスクリプトで説明します。

using UnityEngine;

public class test : MonoBehaviour
{
    // キャラクターのオブジェクト.
    [SerializeField]
    private Transform _unitychan;
    //左脚
    private Transform _leftUpperLeg;
    // アニメーターから抜き出すため.
    private Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        // キャラクターからアニメーションを取り出す.
        animator = _unitychan.GetComponent<Animator>();
        // GetBoneTransform(HumanBodyBones.”要素名”)transformを取得可能.
        _leftUpperLeg = animator.GetBoneTransform(HumanBodyBones.LeftUpperLeg);
    }

    // Update is called once per frame
    void Update()
    {
        // ポジション.
        Debug.Log(_leftUpperLeg.localPosition.x.ToString());
        Debug.Log(_leftUpperLeg.localPosition.y.ToString());
        Debug.Log(_leftUpperLeg.localPosition.z.ToString());
        // 回転(オイラー角に変換して見やすくしています).
        Debug.Log(_leftUpperLeg.localRotation.eulerAngles);
        // スケール.
        Debug.Log(_leftUpperLeg.localScale);
    }
}

 

このような手法で取得できます。

実際に実行すると

f:id:graphicalpoxy:20190615140258p:plain

このようにきちんとTransformの情報を取得できていることがわかると思います。

 

次回はこれを基礎としてアニメーションクリップを作成する方法を紹介できたらなと思います。