オブジェクトを向いている方向に傾けたい
まず一般的(?)なドローンを想像して欲しい。4つの羽で飛ぶあれだ。
あれはホバリングするだけならば地面に対して水平方向を向いているが、移動する場合は移動する方向に傾く。
また、移動速度によって傾きも変わる。
今回はそんな感じの物を実装したいと思います。
何をするか
今回必要な情報は"移動方向のベクトル"、その中でも必要なのは"X方向"と"Z方向"のみになります。
それで得られた情報にほんの少し手を加えるだけで、良い感じの傾きを得る事が出来ます。
書いてみた
ForwardTilt.cs
using UnityEngine;
using System.Collections;
public class TestRotater : MonoBehaviour {
// X方向のベクトル
[SerializeField, Range(-5f, 5f)]
float vectorX = 0f;
// Z方向のベクトル
[SerializeField, Range(-5f, 5f)]
float vectorZ = 0f;
// 傾きベクトルの調整値
[SerializeField, Range(1f, 10f)]
float devideNum = 5f;
// Update is called once per frame
void Update () {
// 向きベクトルから縦の傾きを得る
float y = Mathf.Pow ((vectorX*vectorX)+(vectorZ*vectorZ), 0.5f) / devideNum;
Vector3 tiltVector = new Vector3(vectorX, -y, vectorZ);
// 回転をかける
transform.rotation = Quaternion.Slerp (transform.rotation,
Quaternion.LookRotation(tiltVector - transform.position),
0.1f);
}
}
解説
手続きを簡単に説明しますと、以下の様になります。
- vectorXとvectorZからベクトルの大きさ(仮にvectorLengthと置きます)を取得。
- vectorLengthをdevideNumで割り、傾きのベクトルとなるtiltVectorのYを作成。
- tiltVectorをtransform.positionで引くと向いて欲しい座標を取得できるので、これをクォータニオンに変換。
- Sleap()でゆっくり回転させる。
vectorLengthをdevideNumで割っているのは傾きベクトルのYがとてつもなく大きい数字になるのを防ぐためです。
devideNumの値が大きければ傾きは小さくなり、小さければ大きくなります。