public static Vector3 AggregateAffectorsInfCurve(Vector3 position, List <ParticleAffectorRB> affectors) { Vector3 extra = new Vector3(); for (int i = 0; i < affectors.Count; i++) { ParticleAffectorRB affector = affectors[i]; if (affector == null) { affectors.RemoveAt(i); i--; continue; } Vector3 delta = affector.transform.position - position; float distanceSquared = delta.sqrMagnitude; float minDistanceSquared = affector.influenceStartRadius * affector.influenceStartRadius; float maxDistanceSquared = (affector.influenceStartRadius + affector.influenceSpan) * (affector.influenceStartRadius + affector.influenceSpan); if (distanceSquared < maxDistanceSquared && distanceSquared > minDistanceSquared) { float distance = Mathf.Sqrt(distanceSquared); float t = (distance - affector.influenceStartRadius) / affector.influenceSpan; float pullForce = affector.influence.Evaluate(t) * affector.strength; Vector3 pull = delta / distance * pullForce; // Optimize with calculated values extra += pull; } } return(extra); }
public static Vector3 AggregateAffectors(Vector3 position, float mass, List <ParticleAffectorRB> affectors) { Vector3 extra = new Vector3(); for (int i = 0; i < affectors.Count; i++) { ParticleAffectorRB affector = affectors[i]; if (affector == null) { affectors.RemoveAt(i); i--; continue; } Vector3 delta = affector.transform.position - position; float distanceSquared = delta.sqrMagnitude; extra += delta.normalized * ((mass * affector.gravityPull) / distanceSquared); } return(extra); }