示例#1
0
        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);
        }
示例#2
0
        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);
        }