private IEnumerator AttachHook() { yield return(0); Vector3 localHit = rope.transform.InverseTransformPoint(hookAttachment.point); // Procedurally generate the rope path (a simple straight line): blueprint.path.Clear(); blueprint.path.AddControlPoint(Vector3.zero, -localHit.normalized, localHit.normalized, Vector3.up, 0.1f, 0.1f, 1, 1, Color.white, "Hook start"); blueprint.path.AddControlPoint(localHit, -localHit.normalized, localHit.normalized, Vector3.up, 0.1f, 0.1f, 1, 1, Color.white, "Hook end"); blueprint.path.FlushEvents(); // Generate the particle representation of the rope (wait until it has finished): yield return(blueprint.Generate()); // Set the blueprint (this adds particles/constraints to the solver and starts simulating them). rope.ropeBlueprint = blueprint; rope.GetComponent <MeshRenderer>().enabled = true; // Pin both ends of the rope (this enables two-way interaction between character and rope): var pinConstraints = rope.GetConstraintsByType(Oni.ConstraintType.Pin) as ObiConstraints <ObiPinConstraintsBatch>; pinConstraints.Clear(); var batch = new ObiPinConstraintsBatch(); batch.AddConstraint(rope.solverIndices[0], character, transform.localPosition, Quaternion.identity, 0, 0, float.PositiveInfinity); batch.AddConstraint(rope.solverIndices[blueprint.activeParticleCount - 1], hookAttachment.collider.GetComponent <ObiColliderBase>(), hookAttachment.collider.transform.InverseTransformPoint(hookAttachment.point), Quaternion.identity, 0, 0, float.PositiveInfinity); batch.activeConstraintCount = 2; pinConstraints.AddBatch(batch); rope.SetConstraintsDirty(Oni.ConstraintType.Pin); }
private void PinRope(ObiRope rope, ObiCollider bodyA, ObiCollider bodyB, Vector3 offsetA, Vector3 offsetB) { // Pin both ends of the rope (this enables two-way interaction between character and rope): var pinConstraints = rope.GetConstraintsByType(Oni.ConstraintType.Pin) as ObiConstraints <ObiPinConstraintsBatch>; pinConstraints.Clear(); var batch = new ObiPinConstraintsBatch(); batch.AddConstraint(rope.solverIndices[0], bodyA, offsetA, Quaternion.identity, 0, 999, float.PositiveInfinity); batch.AddConstraint(rope.solverIndices[rope.activeParticleCount - 1], bodyB, offsetB, Quaternion.identity, 0, 999, float.PositiveInfinity); batch.activeConstraintCount = 2; pinConstraints.AddBatch(batch); }