かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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();
    }
}

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