これは別に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(); } }
これで水平方向になるから、あとはお好きな方向を同じ要領で追加していくだけですね。