public IObservable <Unit> Execute() { return(WaitForRoundStart() .ContinueWith(Observable.Merge( _inputController.OnPlayerFired() .Where(_ => _lastTimeFired < Time.time) .Do(_ => FireMissile()) .Do(_ => _lastTimeFired = Time.time + cooldownSeconds), _inputController.OnPlayerMovedLeft().Do(_ => _playerView.MoveLeft()), _inputController.OnPlayerMovedRight().Do(_ => _playerView.MoveRight()) )) .TakeUntil(DeathOrRoundEnd()) .DoOnCompleted(() => _viewProvider.Return(_playerView))); }