public void FixedUpdate() { collidedAttractor = null; playerCollidesWithAny = false; foreach (Attractor a in attractors) { if (Physics2D.OverlapCircleAll(a.center, a.pullRadius, 1 << LayerMask.NameToLayer("Player")).Length > 0) { // player is inside any attractor collidedAttractor = a; playerCollidesWithAny = true; break; } } if (playerCollidesWithAny && collidedAttractor == this) { Vector2 forceDirection = Vector3.up; float dist = 1000F; if (playerRb != null) { // calculate direction from player to center of this forceDirection = center - new Vector2(Player._instance.transform.position.x, Player._instance.transform.position.y); // calculate distance to the center of this dist = Mathf.Abs(Vector3.Distance(Player._instance.transform.position, transform.position)); // calculate an amplifier value based on the distance to the center float distAmp = Mathf.InverseLerp(pullRadius, 0, dist); Debug.Log("distAmp " + distAmp); // apply force on player towards center of this playerRb.AddForce(forceDirection.normalized * maxPullForce * Time.fixedDeltaTime * pullAmplifier * distAmp); } // update shader attractorMaterial.SetFloat("_AttractorRadius", pullRadius); Vector3 localPos = transform.InverseTransformPoint(transform.position); localPos.z = transform.position.z; attractorMaterial.SetVector("_AttractionCenter", localPos); attractorMaterial.SetFloat("_PlayerDistance", dist); // update camera shake float shake = Mathf.InverseLerp(pullRadius, 0, dist); CamShake.attractorDistance = shake; SoundPlayer.rumbleAlive = true; SoundPlayer.rumbleVolume = shake; } if (playerCollidesWithAny == true && shaking == false && collidedAttractor == this) { SoundPlayer.rumbleAlive = true; SoundManager.PlayRumbleSound(transform.position); CamShake.AttractorShake(); shaking = true; } else if (playerCollidesWithAny == false) { SoundPlayer.rumbleAlive = false; CamShake.AttractorShakeBreak(); } }