しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity でカメラの方向に 3D モデルを向かせる

※ これは 2018/01/08 Unity 2017.3.0f3 時点の情報です

最新版では動作が異なる可能性がありますのでご注意ください

ラッキービーストのモデルの準備ができたので、今回はこのモデルをカメラの向きを向くようにしてみたいと思います

まずは Blender の エクスポートメニューから fbx ファイルとして出力後、Unity の新規プロジェクトにインポートします

fbx のインポート設定は上記のように UV マップ生成と自動スムージングだけ変更しました

さらにマテリアルを新規に作成し、テクスチャを作成したマテリアルの Albedo マップに指定します

そしてインポートした fbx のモデルを Hierarchy 上にドラッグドロップして配置します

先ほど作成したマテリアルもつかんでモデルにドロップすることで適用、カメラの位置などなど調整してとりあえず舞台は整いました

さて、ラッキービーストをカメラに向けるため、C# スクリプトを追加します

Hierarchy 上の beast を選択後、Inspector の Add Component ボタンからスクリプト追加で Beast.cs を追加します

Beast.cs はこんな感じ

using UnityEngine;

public class Beast : MonoBehaviour
{
    /// <summary>
    /// 顔の部分のボーン
    /// </summary>
    [SerializeField]
    private Transform coreBone = null;

    /// <summary>
    /// キャッシュ用カメラ Transform
    /// </summary>
    private Transform camra;

    /// <summary>
    /// 初期処理
    /// </summary>
    public void Start()
    {
        this.camra = Camera.main.transform;
    }

    /// <summary>
    /// 固定毎フレームの処理
    /// </summary>
    public void FixedUpdate()
    {
        var cameraPosition = this.camra.position;

        // 目の高さに合わせる
        cameraPosition.y -= 0.3f;

        // 顔だけカメラに向かせる(X軸の回転)
        this.transform.LookAt(cameraPosition);
        var angle = this.transform.rotation.eulerAngles.x;
        angle = angle > 180f ? angle - 360f : angle;
        this.coreBone.localRotation
            = Quaternion.Euler(90f + Mathf.Clamp(angle, -30f, 30f), 0f, 0f);

        // 身体全体をカメラに向ける(Y軸の回転)
        cameraPosition.y = this.transform.position.y;
        this.transform.LookAt(cameraPosition);
    }
}

基本 Transform.LookAt() メソッドで対象に向けて回転できるのですが、X 軸の高低差に応じた回転だけは特別にモデルのボーンだけ回転させて向きを変えています

また、ラッキービーストが見た目上不自然なほど傾かないように、Mathf.Clamp() メソッドでボーンの回転角度は上下30度以内に制限しています

最後に Beast.cs の coreBone に UnityEditor 上でボーンをドラッグドロップで設定

これで動かしてみます

それっぽく動きました!