Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

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

$
0
0

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

using UnityEngine;
using System.Collections;
using UniRx;

publicclass MoveBehaviour : ObservableMonoBehaviour
{
    publicoverridevoid 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();
    }
}

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


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>