public void Start() { var rigidBody = GetComponent <Rigidbody2D>(); var collider = GetComponent <Collider2D>(); gameCameraState.pointsOfInterest.Add(transform); gameObject.OnDestroyAsObservable() .First() .Subscribe(_ => gameCameraState.pointsOfInterest.Remove(transform)); signalBus.GetStream <GoalScoredSignal>() .TakeUntilDestroy(this) .Subscribe(_ => { Instantiate(goalExplosion, transform.position, transform.rotation).AutoDestruct(); ProjectUtils.AddExplosionForce(1000, transform.position, 20, explosionMask.value); gameObject.SetActive(false); gameCameraState.pointsOfInterest.Add(resetPoint); Observable.Timer(TimeSpan.FromSeconds(5)) .TakeUntilDestroy(this) .Subscribe(__ => { gameObject.SetActive(true); gameCameraState.pointsOfInterest.Remove(resetPoint); Reset(); }); }); // Add the toggling of the slowdown effect bool slowingEffectActive = true; signalBus.GetStream <GoalScoredSignal>() .Select(_ => true) .Merge(signalBus.GetStream <BallResetSignal>().Select(_ => false)) .TakeUntilDestroy(this) .Subscribe(isBetweenScoreAndReset => slowingEffectActive = !isBetweenScoreAndReset); // Init the slowdown effect Observable.EveryUpdate() .TakeUntilDestroy(this) .Where(_ => slowingEffectActive) .Select(_ => Physics2D.CircleCast(transform.position, collider.bounds.extents.x, rigidBody.velocity, rigidBody.velocity.magnitude, pathCastingMask.value)) .Where(hit => hit.collider != null) // HACK .Where(hit => hit.collider.gameObject.GetComponent <Goal>() != null) .Subscribe(hit => signalBus.Fire(new TimeSlowSignal { slowTime = .1f })); Reset(); }