public void OnGameplayStarted()
    {
        Ball.onBallEnteredTrigger += handleTriggerEnter;
        Ball.onBallExitedTrigger  += handleTriggerExit;

        multipliers = Object.FindObjectsOfType <Multiplier>();
        locks       = Object.FindObjectsOfType <Lock>();
        windZones   = Object.FindObjectsOfType <LocalWindZone>();
        portals     = Object.FindObjectsOfType <Portal>();

        key = Object.FindObjectOfType <Key>();

        foreach (var multiplier in multipliers)
        {
            ballSystem.AddBallSpawner(multiplier);
        }

        foreach (var @lock in locks)
        {
            ballSystem.AddBallSpawner(@lock);
            ballSystem.AddBallDestroyer(@lock);
        }

        onTriggerEnterChain =
            new OnTriggerEnterHandler(multipliers,
                                      new OnTriggerEnterHandler(locks,
                                                                new OnTriggerEnterHandler(windZones,
                                                                                          new OnTriggerEnterHandler(portals, null))));

        onTriggerExitChain =
            new OnTriggerExitHandler(windZones, null);
    }
    public GameInteractionsSystem(BallSystem ballSystem, KeysSystem keysSystem, StageSystem stageSystem)
    {
        this.ballSystem = ballSystem;
        stageSystem.AddFinishTrigger(this);
        ballSystem.AddBallDestroyer(this);
        keysSystem.AddKeyCollector(this);

        var gamezone = Object.FindObjectOfType <GameZone>();

        finishCollider  = gamezone.FinishTrigger;
        destroyCollider = gamezone.DestroyTrigger;

        handleTriggerEnter += (ball, trigger) =>
        {
            bool isMainTrigger = TestMainTriggers(ball, trigger);
            if (!isMainTrigger)
            {
                onTriggerEnterChain.Handle(ball, trigger);
            }
        };

        handleTriggerExit += (ball, trigger) =>
        {
            onTriggerExitChain.Handle(ball, trigger);
        };
    }