/** * Injects back into the rigidbodies the new velocities calculated by the solver in response to patrticle interactions: */ public void UpdateVelocities() { Oni.Rigidbody[] bodies = new Oni.Rigidbody[rigidbodyIDs.Count]; Oni.GetRigidbodies(oniColliderGroup, bodies, rigidbodyIDs.Count, 0); // Update 3d collider velocities: for (int i = 0; i < colliders.Count; ++i) { Collider collider = colliders[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody rb = collider.GetComponentInParent <Rigidbody>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity; } } } // Update 2d collider velocities: for (int i = 0; i < colliders2D.Count; ++i) { Collider2D collider = colliders2D[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; // For some weird reason, in 2D angular velocity is measured in *degrees* per second, // instead of radians/second. Seriously Unity, WTF?? rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity.z * Mathf.Rad2Deg; } } } }
void Gravity() { foreach (Object planet in PlanetaryObjects.planets) { if (planet == null || planet.GetInstanceID() == a.GetInstanceID()) { continue; } Rigidbody2D b = (Rigidbody2D)planet; Vector2 difference = -a.transform.position + b.transform.position; decimal dist = (decimal)difference.magnitude * 50000; decimal gMagnitude = (decimal)(6.7 * b.mass * a.mass) / (dist * dist); Vector2 difference2 = -a.transform.position + b.transform.position; Vector2 direction = difference2.normalized; Vector2 gravityVector = (direction * (float)gMagnitude); a.GetComponent <Rigidbody2D>().AddForce(gravityVector, ForceMode2D.Force); } }
public static void OscillateVelocity(this Rigidbody2D rigidbody, Vector2 frequency, Vector2 amplitude, Vector2 center, Axis axis = Axis.XY) { rigidbody.SetVelocity(rigidbody.velocity.Oscillate(frequency, amplitude, center, rigidbody.GetInstanceID() / 1000, axis), axis); }
public static void OscillateEulerAngles(this Rigidbody2D rigidbody, float frequency, float amplitude, float center) { rigidbody.SetEulerAngles(rigidbody.transform.eulerAngles.Oscillate(new Vector3(frequency, frequency, frequency), new Vector3(amplitude, amplitude, amplitude), new Vector3(center, center, center), rigidbody.GetInstanceID() / 1000, Axis.Z).z); }
/** * Injects back into the rigidbodies the new velocities calculated by the solver in response to patrticle interactions: */ public void UpdateVelocities() { if (!hasBeenUpdated) { return; } hasBeenUpdated = false; // Collider groups used by solvers simulating in local space do not support two-way interaction: if (usedInLocalSpace) { return; } usedInLocalSpace = false; Oni.Rigidbody[] bodies = new Oni.Rigidbody[rigidbodyIDs.Count]; Oni.GetRigidbodies(oniColliderGroup, bodies, rigidbodyIDs.Count, 0); // Update 3d collider velocities: for (int i = 0; i < colliders.Count; ++i) { Collider collider = colliders[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody rb = collider.GetComponentInParent <Rigidbody>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length && bodies[rigidBodyIndex].impulseCount > 0) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity; } } } // Update 2d collider velocities: for (int i = 0; i < colliders2D.Count; ++i) { Collider2D collider = colliders2D[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length && bodies[rigidBodyIndex].impulseCount > 0) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; // For some weird reason, in 2D angular velocity is measured in *degrees* per second, // instead of radians/second. Seriously Unity, WTF?? rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity.z * Mathf.Rad2Deg; } } } }
private void Update2DColliders() { for (int i = 0; i < colliders2D.Count; i++) { Collider2D source = colliders2D[i]; if (source == null || !source.enabled || !source.gameObject.activeInHierarchy) { continue; } Rigidbody2D rb = source.GetComponentInParent <Rigidbody2D>(); ObiCollider oc = source.GetComponent <ObiCollider>(); // Get the adequate rigidBodyIndex. If several colliders share a rigidbody, they'll get the same rigidBodyIndex. int rigidBodyIndex = -1; if (rb != null) { if (!rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { ObiRigidbody or = rb.GetComponent <ObiRigidbody>(); rigidBodyIndex = Oni.GetRigidbodyCount(oniColliderGroup); Oni.SetRigidbodies(oniColliderGroup, new Oni.Rigidbody[] { new Oni.Rigidbody(rb, (or != null) ? or.kinematicForParticles : false) }, 1, rigidBodyIndex); rigidbodyIDs[rb.GetInstanceID()] = rigidBodyIndex; } } float thickness = (oc != null)?oc.thickness:0; if (source is CircleCollider2D) { Oni.SetColliders(oniColliderGroup, new Oni.Collider[] { new Oni.Collider(source, Oni.ShapeType.Sphere, thickness, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Sphere), rigidBodyIndex, (oc != null)?oc.materialIndex:0) }, 1, Oni.GetColliderCount(oniColliderGroup)); Oni.SetSphereShapes(oniColliderGroup, new Oni.SphereShape[] { new Oni.SphereShape(source as CircleCollider2D) }, 1, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Sphere)); } else if (source is BoxCollider2D) { Oni.SetColliders(oniColliderGroup, new Oni.Collider[] { new Oni.Collider(source, Oni.ShapeType.Box, thickness, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Box), rigidBodyIndex, (oc != null)?oc.materialIndex:0) }, 1, Oni.GetColliderCount(oniColliderGroup)); Oni.SetBoxShapes(oniColliderGroup, new Oni.BoxShape[] { new Oni.BoxShape(source as BoxCollider2D) }, 1, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Box)); } else if (source is EdgeCollider2D) { EdgeCollider2D mc = source as EdgeCollider2D; EdgeColliderShapeAndData shapeAndData; if (!edgeColliderData.TryGetValue(source as EdgeCollider2D, out shapeAndData)) { // Get current amount of triangle mesh shapes: int shapeIndex = Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.EdgeMesh); // Generate mesh collider triangle data and shape: Oni.EdgeMeshData data = new Oni.EdgeMeshData(mc); Oni.EdgeMeshShape shape = new Oni.EdgeMeshShape(mc, thickness, data.AddrOfVertexData(), data.AddrOfEdgeData()); // Pack both in a small wrapper: shapeAndData = new EdgeColliderShapeAndData(data, shape, shapeIndex); // Tell Oni we want to define a new triangle mesh: Oni.SetEdgeMeshShapes(oniColliderGroup, new Oni.EdgeMeshShape[] { shapeAndData.meshShape }, 1, shapeIndex); Oni.UpdateEdgeMeshShapes(oniColliderGroup, 1, shapeIndex); // Store mesh collider data: edgeColliderData[mc] = shapeAndData; } Oni.SetColliders(oniColliderGroup, new Oni.Collider[] { new Oni.Collider(source, Oni.ShapeType.EdgeMesh, thickness, shapeAndData.shapeIndex, rigidBodyIndex, (oc != null)?oc.materialIndex:0) }, 1, Oni.GetColliderCount(oniColliderGroup)); } else { Debug.LogWarning("2D Collider type " + source.GetType() + " not supported by Obi. Ignoring it."); } } }
/** * Injects back into the rigidbodies the new velocities calculated by the solver in response to particle interactions: */ public void UpdateVelocities() { if (oniColliderGroup == IntPtr.Zero) { return; } if (!hasBeenUpdated) { return; } hasBeenUpdated = false; // Collider groups used by solvers simulating in local space do not support two-way interaction: if (usedInLocalSpace) { return; } usedInLocalSpace = false; Oni.RigidbodyVelocityDelta[] deltas = new Oni.RigidbodyVelocityDelta[rigidbodyIDs.Count]; Oni.GetRigidbodyVelocityDeltas(oniColliderGroup, deltas, rigidbodyIDs.Count, 0); // Update 3d collider velocities: for (int i = 0; i < colliders.Count; ++i) { Collider collider = colliders[i]; int rigidBodyIndex = -1; Rigidbody rb = collider.GetComponentInParent <Rigidbody>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < deltas.Length) { rb.velocity = deltas[rigidBodyIndex].linearVelocityDelta; rb.angularVelocity = deltas[rigidBodyIndex].angularVelocityDelta; } } } // Update 2d collider velocities: for (int i = 0; i < colliders2D.Count; ++i) { Collider2D collider = colliders2D[i]; int rigidBodyIndex = -1; Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < deltas.Length) { rb.velocity = (Vector2)deltas[rigidBodyIndex].linearVelocityDelta; // For some weird reason, in 2D angular velocity is measured in *degrees* per second, // instead of radians/second. Seriously Unity, WTF?? rb.angularVelocity = deltas[rigidBodyIndex].angularVelocityDelta.z * Mathf.Rad2Deg; } } } }