Nexus Lab. Blog

上半身を他のオブジェクトに向ける

f:id:nexusyuumilo:20180129115958p:plain
今回はキャラクターに敵の方向を向かせたいと思います。

使うのは、

  • animator.SetLookAtWeight()
  • animator.SetLookAtPosition()

たったコレだけでできるんです!
驚かないかもしれませんが。。。
僕はこの方法を見つけるまで結構時間がかかりました。

では、さっそく方法を見ていきましょう。

準備としてAnimatorControllerの設定をいじる

今回は簡単のため、Ethanで試してみました。
EthanのAnimatorControllerを開いて、BaseLayerの設定を開きます。
f:id:nexusyuumilo:20180129120949p:plain
そして、IK Passにチェックを入れます。
これで準備は完了!
あとはスクリプトを書いていきます。

コードを見てみよう!

LookAtObjectというスクリプトを作って、Ethanに取り付けました。

public class LookAtObject : MonoBehaviour
{

    Animator animator;
    Vector3 targetPos;

    public GameObject targetObject;       // テスト用のオブジェクト(敵)

    void Start()
    {
        this.animator = GetComponent<Animator>();
        this.targetPos = targetObject.transform.position;
    }

    void Update()
    {
        this.targetPos = targetObject.transform.position;
    }

  // IK Passにチェックをつけると使える。
    private void OnAnimatorIK(int layerIndex)
    {
        this.animator.SetLookAtWeight(1f, 0.3f, 1f, 0f, 0.5f);     // LookAtの調整
        this.animator.SetLookAtPosition(this.targetPos);          // ターゲットの方向を向くよ
    }
}

これで、Ethanは敵の方向に上半身を向けるようになりました。
では、OnAnimatorIKでは何をしているのでしょう。

OnAnimatorIKって?

リファレンスを見てもよくわからなった。

  • OnAnimatorIKはIk Passにチェックを入れると使える
  • SetLookAtWeight(全体の調整?, 体の調整, 頭の調整, 眼の調整, 可動域の調整)
  • SetLookAtPosition(LookAtの方向)

という理解です。動けばよい。
これで、空中の敵にも体を向けられる。