あるオブジェクトの
transformのrotationを変更することで
向きは変えることができる
rotationは四元数なので
四元数のクラスである
Quaternionの補完を使うことができる
今向いている向きから
特定の向きへ
向きをなめらかに変えたい場合
現在のrotationと
向きたい向きのオブジェクトのrotationとを
Slerpで補完することができる
void TurnAround(Transform target, int count)
{
StartCoroutine(TurnAroundCore(target, count));
}
IEnumerator TurnAroundCore(Transform target, int count)
{
var from = transform.rotation;
var to = target.transform.rotation;
var quaternions = Enumerable.Range(1, count)
.Select(i => (float)i / (float)count)
.Select(f => Quaternion.Slerp(from, to, f));
foreach (var quaternion in quaternions)
{
transform.rotation = quaternion;
yield return new WaitForEndOfFrame();
}
}
これだと向きの振り方が
素直すぎるので
補完関数をかましてみる
void TurnAround(Transform target, int count)
{
Func<float, float> curve = (v) =>
{
var rad = v * Mathf.PI / 2f;
var sin = Mathf.Sin(rad);
return sin;
};
StartCoroutine(TurnAroundCore(target, count, curve));
}
IEnumerator TurnAroundCore(Transform target, int count, Func<float, float> curve)
{
var from = transform.rotation;
var to = target.transform.rotation;
var quaternions = Enumerable.Range(1, count)
.Select(i => (float)i / (float)count)
.Select(curve)
.Select(f => Quaternion.Slerp(from, to, f));
foreach (var quaternion in quaternions)
{
transform.rotation = quaternion;
yield return new WaitForEndOfFrame();
}
}
補完といえば、Robert Pennerさんのeasingですね。
http://robertpenner.com/easing/
ところがUnity的には肝心のC#のコードがリンク切れ。
と思ったら、acron0さんがgithubに補完関数を上げてくれていた。
https://github.com/acron0/Easings/blob/master/Easings.cs
acron0さんのは関数が正規化してあるので、上のTurnAroundCore関数の引数curveにそのまま渡すことができる。
Func<float, float> curve = Easings.BounceEaseOut;
StartCoroutine(TurnAroundCore(target, count, curve));
acron0さんの補完関数を使う前の、いわゆるLinerの状態だとコレ
あれっanimationGifだめなん?