かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

UniRxを使って慣性っぽいのが働いてるような動きをさせる

これは別にUniRxじゃなくてもいいかな…。でも細かくUpdateを分割して書けるのは個人的に好きかも。

using UnityEngine;
using System.Collections;
using UniRx;

public class MoveBehaviour : ObservableMonoBehaviour
{
    public override void Awake()
    {
        // 加速度
        var a = 5.0f;
        // 減速するスピード
        var downSpeed = 0.7f;
        // 最高速度
        var maxSpeed = 10.0f;
        // 物体にかかってる力
        var velocity = new Vector3();
        // 速度を押されている水平キーに応じて加算していく
        this.UpdateAsObservable()
            .Select(_ => Input.GetAxis("Horizontal"))
            .Subscribe(x =>
            {
                velocity.x += x * a * Time.deltaTime;
                velocity.x = Mathf.Min(velocity.x, maxSpeed);
            });
        // 何も押されてないけど動いてるときは適当に減速する(右に動いてるとき)
        this.UpdateAsObservable()
            .Where(_ => velocity.x > 0)
            .Where(_ => !Input.GetButton("Horizontal"))
            .Subscribe(_ =>
            {
                velocity.x -= downSpeed * a * Time.deltaTime;
                if (velocity.x < 0) { velocity.x = 0; }
            });
        // 何も押されてないけど動いてるときは適当に減速する(左に動いてるとき)
        this.UpdateAsObservable()
            .Where(_ => velocity.x < 0)
            .Where(_ => !Input.GetButton("Horizontal"))
            .Subscribe(_ =>
            {
                velocity.x += downSpeed * a * Time.deltaTime;
                if (velocity.x > 0) { velocity.x = 0; }
            });

        // 力を物体にくわえる
        this.UpdateAsObservable()
            .Subscribe(_ =>
            {
                this.rigidbody.velocity = velocity;
            });

        base.Awake();
    }
}

これで水平方向になるから、あとはお好きな方向を同じ要領で追加していくだけですね。