覚え書きブログ

読者です 読者をやめる 読者になる 読者になる

Unity覚え書き(LookAtを用いたキャラクターの回転)

Unityで、移動するオブジェクトの方向を、キャラクターが見るスクリプトをLookAtを用いて作ってみた。

1)移動するターゲットオブジェクトを追加し、inspectorのAdd Componentで以下のスクリプト(movingTarget)を追加する。
f:id:hirotaka_hachiya:20170307234411p:plain

using UnityEngine;
using System.Collections;

public class movingTarget : MonoBehaviour {

    bool movingPlus = true;     // プラス方向に移動中か?
    Vector3 initial_position;   // オブジェクトの初期位置
    float randRange = 3f;       // 乱数の範囲
    float posRange = 5f;        // オブジェクトの移動範囲
    float speed = 3f;           // オブジェクトの移動速度
    bool xAxis = true;          // x軸方向か? 

    // Use this for initialization
    void Start()
    {

        // キャラクターの頭部位置取得
        Transform headObj = GameObject.Find("SuitMan").transform;

        // オブジェクトの移動軸の選定
        if (Random.Range(-1f, 1f) > 0)
            xAxis = true;
        else
            xAxis = false;

        // オブジェクトの位置を、頭部位置+ランダムに設定
        Vector3 rand = new Vector3(Random.Range(-randRange, randRange), 0, Random.Range(-randRange, randRange));
        transform.position = headObj.position + rand;
        initial_position = transform.position;
    }

    // Update is called once per frame
    void Update()
    {

        if (movingPlus)
        {
            if (xAxis)
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0f, 0f);
                if ((transform.position.x - initial_position.x) >= posRange)
                    movingPlus = false;
            }
            else
            {
                transform.position += new Vector3(0f, 0f, speed * Time.deltaTime);
                if ((transform.position.z - initial_position.z) >= posRange)
                    movingPlus = false;
            }
        }
        else
        {
            if (xAxis)
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0f, 0f);
                if ((transform.position.x - initial_position.x) <= -posRange)
                    movingPlus = true;
            }
            else
            {
                transform.position -= new Vector3(0f, 0f, speed * Time.deltaTime);
                if ((transform.position.z - initial_position.z) <= -posRange)
                    movingPlus = true;
            }
        }
    }
}

このスクリプトでは、キャラクターSuitManの位置を中心にランダムに、ターゲットオブジェクトの位置を設定し、ランダムに選択したx軸またはy軸の方向に移動するものである。

2)キャラクターSuitManに、以下のスクリプト(LookAt)追加する
f:id:hirotaka_hachiya:20170307235102p:plain

using UnityEngine;
using System.Collections;

public class LookAt : MonoBehaviour {

    Transform targetObj;    // ターゲットオブジェクト

	// Use this for initialization
	void Start () {

        // ターゲットオブジェクトの取得
        targetObj = GameObject.Find("Target").transform;
	}
	
	// Update is called once per frame
	void Update () {

        // 体をターゲットオブジェクトに向ける
        transform.LookAt(targetObj);
	}
}

体ごと回転するので不自然さはあるが、これでキャラクターを移動するターゲットオブジェクト方向を向かせることができる。
なお、自然な動きをさせるためには、FinalIKのLookAtIKを使った方がよい。
https://www.assetstore.unity3d.com/jp/#!/content/14290
Look At IK