ドーナツを追い続ける、アニメーション付きのニワトリを、UniRx と DoTween で作りましょう。
Update から切り離して、UniRx を使うことで、値がメソッドで閉じて、Time.deltaTime などの和算も不要になります。
こんな感じで動きます
UniRx と DoTween でつくる Walk メソッド
private void Walk()
{
// Walk アニメーションを開始
animator.SetBool("Walk", true);
// ここから UniRx、 Interval を使うことで 0.1秒毎に Subscribe が呼ばれ続けます
var duration = 0.1f;
Observable
.Interval(TimeSpan.FromSeconds(duration))
.Subscribe(_ =>
{
// 移動距離を計算、早く動かしたければ 0.01f の値を大きくすればOK
var add = transform.rotation * new Vector3(0, 0, 0.01f);
// DoTween の Move で移動させます
transform.DOMove(transform.position + add, duration);
// DoTween の LookAt でドーナツの方向を向かせ続けます
transform.DOLookAt(target.position, duration, AxisConstraint.Y);
});
}
その他
ニワトリのAsset
- こちら
- 無料です。モデルとアニメーションが付いています。
停止方法
- var hoge = Observable.Interval... みたいな感じで書いて、hoge.Dispose(); すれば、止まります。
- 本当は Observable.Interval は AddTo(this) などをして、不要になったらリソースを破棄するべきです。ここでは省略しています。
全コード
ほとんど代わり映えしませんが、全コードです。
using System;
using DG.Tweening;
using UniRx;
using UnityEngine;
public class Chick : MonoBehaviour
{
[SerializeField] private Animator animator; // 自分自身を設定してください
[SerializeField] private Transform target; // 向かっていくドーナツを設定してください
void Start()
{
Walk();
}
private void Walk()
{
animator.SetBool("Walk", true);
var duration = 0.1f;
Observable.Interval(TimeSpan.FromSeconds(duration)).Subscribe(_ =>
{
var add = transform.rotation * new Vector3(0, 0, 0.01f);
transform.DOMove(transform.position + add, duration);
transform.DOLookAt(target.position, duration, AxisConstraint.Y);
});
}
}