void DrawPath() { GravityObjectHandler[] gravityObjects = FindObjectsOfType <GravityObjectHandler>(); GravityObjectData[] gravityObjectsData = new GravityObjectData[gravityObjects.Length]; Vector3[][] linePoints = new Vector3[gravityObjects.Length][]; for (int i = 0; i < gravityObjects.Length; i++) { gravityObjectsData[i] = new GravityObjectData(gravityObjects[i]); linePoints[i] = new Vector3[iterations]; } for (int iteration = 0; iteration < iterations; iteration++) { foreach (GravityObjectData gravityObjectData in gravityObjectsData) { if (!gravityObjectData.frozen) { gravityObjectData.velocity += GravityAcceleration(gravityObjectData, gravityObjectsData) * timeStep; } } for (int i = 0; i < gravityObjectsData.Length; i++) { GravityObjectData gravityObjectData = gravityObjectsData[i]; if (!gravityObjectData.frozen) { Vector3 updatedPosition = gravityObjectData.position + gravityObjectData.velocity * timeStep; gravityObjectData.position = updatedPosition; if (gravityObjectData.showFuturePath) { linePoints[i][iteration] = updatedPosition; } } } } for (int j = 0; j < gravityObjectsData.Length; j++) { if (gravityObjectsData[j].showFuturePath && !gravityObjectsData[j].frozen) { Color lineColor = gravityObjects[j].gameObject.GetComponentInChildren <MeshRenderer>().sharedMaterial.color; // for (int i = 0; i < linePoints[j].Length - 1; i++) { if (Application.isPlaying) { Debug.DrawLine(linePoints[j][i], linePoints[j][i + 1], lineColor, playingPersistTime); } else { Debug.DrawLine(linePoints[j][i], linePoints[j][i + 1], lineColor); } } } } }
Vector3 GravityAcceleration(GravityObjectData gravityObjectData, GravityObjectData[] gravityObjectsData) { Vector3 acceleration = Vector3.zero; for (int j = 0; j < gravityObjectsData.Length; j++) { GravityObjectData otherGravityObjectData = gravityObjectsData[j]; if (gravityObjectData == otherGravityObjectData || !otherGravityObjectData.affectGravity) { continue; } Vector3 direction = otherGravityObjectData.position - gravityObjectData.position; float sqrDst = direction.sqrMagnitude; acceleration += direction.normalized * otherGravityObjectData.mass / sqrDst; } return(0.0667428f * acceleration); }