ご質問させていただきます。よろしくお願いいたします。
Unity用のRxプラグインを使用させていただき開発しております。その中でストリームの合成がすごく難しくコードが複雑になってしまいこれで正しいのか分からないのでご質問させていただきたいです。
###環境
・Unity 2017.2.0p4
・UniRx 5.5.0
###実装したい処理
- (初期化) Vector2のデータをランダムに1つ生成
- (初期化) ランダムに1度00秒遅延させる
- (開始) UpdateAsObservableでループ開始
- (判定) 1で生成したデータとオブジェクトの距離が一定の距離になるまで処理を続ける
- (OnNext) Subscribeで1で生成したデータに徐々に近づける
- (Oncompleted) 完了後1から繰り返し
###実現したいこと
コードが複雑になっているので簡潔な方法がありましたらご教授いただきたいです。プロパティまたはフィールド(クロージャ)などの外部からの参照無しで実装したいです。言語は問いません。大変お手数ですがよろしくお願いいたします。
###現状のコード
C#
1static readonly float WALK_SPEED = .7f; 2static readonly float RAND_INTERVAL_MIN = 4; 3static readonly float RAND_INTERVAL_MAX = 10; 4static readonly float DISTANCE = .05f; 5static readonly Vector2 RAND_POS_LEFT_TOP = new Vector2(-1, 3); 6static readonly Vector2 RAND_POS_RIGHT_BOTTOM = new Vector2(-2, 4); 7Transform MyTransform; 8 9void Start () 10{ 11 MyTransform = gameObject.transform; 12 13 Observable.Empty<Vector2>().StartWith(() => GetRandPos()) 14 .SelectMany(pos => 15 Observable.Timer(TimeSpan.FromSeconds(UnityEngine.Random.Range(RAND_INTERVAL_MIN, RAND_INTERVAL_MAX))) 16 .Select(_ => pos) 17 ) 18 .SelectMany(pos => this.UpdateAsObservable().Select(_ => pos)) 19 .TakeWhile(pos => Vector2.Distance(pos, MyTransform.position) >= DISTANCE) 20 .Select(pos => GetNextPos(pos, MyTransform.position)) 21 .RepeatUntilDestroy(this) 22 .Subscribe(pos => MyTransform.position = pos); 23} 24 25Vector2 GetNextPos(Vector2 target,Vector2 me) 26{ 27 var rad = Mathf.Atan2(target.y - me.y, target.x - me.x); 28 29 me.x += WalkSpeed * Time.deltaTime * Mathf.Cos(rad); 30 me.y += WalkSpeed * Time.deltaTime * Mathf.Sin(rad); 31 return me; 32} 33 34Vector2 GetRandPos() 35{ 36 var x = UnityEngine.Random.Range( 37 RAND_POS_LEFT_TOP.x, 38 RAND_POS_RIGHT_BOTTOM.x 39 ); 40 41 var y = UnityEngine.Random.Range( 42 RAND_POS_LEFT_TOP.y, 43 RAND_POS_RIGHT_BOTTOM.y 44 ); 45 46 return new Vector2(x, y); 47}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/27 02:41
2017/12/28 10:21
2018/01/05 04:48
2018/01/05 12:06