【Unity】Animation中でも任意の方向に顔などを振り向かせる方法

どうも、だらはです。
今回は、Animation中でも任意の方向に顔などを振り向かせる方法についてまとめたいと思います。

スポンサーリンク

手順

  1. PackageManagerよりAnimation Riggingをインストールする。
  2. 以下の階層構造でコンポーネントをアタッチする。
    • 親 (AnimatorがアタッチされているGameObject):Rig Builder
    • 子:Rig
    • 孫:Multi-Aim Constraint
  3. 振り向かせ先となるGameObjectを作成する。(下図ではLookAtAnchor)
  4. Rig Builderに、子のRigを登録する。
  5. Multi-Aim Constraintに、以下のように設定する。
    1. Constrained Object:振り向かせたいGameObjectのTransformを設定する。(NeckやHeadなど)
    2. Source Objects:振り向かせ先となるGameObject(LookAtAnchor)を設定する。
  6. キャラクターのルートに後述のDynamicLookAt.csをアタッチして、LookAtAnchorを設定する。

using UnityEngine;

public class DynamicLookAt : MonoBehaviour
{
    [SerializeField] private Transform lookAtAnchor; // Multi-Aim Constraintに登録した空のGameObject
    [SerializeField] private float smoothSpeed = 5f;  // 視線移動の滑らかさ
    
    private Transform currentTarget;

    // 外部からこのメソッドを呼んでターゲットを切り替える
    public void SetTarget(Transform newTarget)
    {
        currentTarget = newTarget;
    }

    void LateUpdate()
    {
        if (currentTarget == null || lookAtAnchor == null) return;

        // アンカーをターゲットの位置へ滑らかに移動させる
        lookAtAnchor.position = Vector3.Lerp(
            lookAtAnchor.position, 
            currentTarget.position, 
            Time.deltaTime * smoothSpeed
        );
    }
}

以上です。

参考図では、Mixamoよりダウンロードしたfbxモデルに対し、RigBuilder, Rig, Multi-Aim Constraintをアタッチしています。
DynamicLookAtのSetTargetに注目先のTransformを引数を与えて実行すると、振り向いてくれます。

以上、だらはでした。

スポンサーリンク

基礎

Posted by daraha_gm