public void MoveLeg(LegData leg, Vector2 delta) { bool isTopLeg = leg.legPos == Legs.TopLeft || leg.legPos == Legs.TopRight; float inverse = isTopLeg ? -1.0f : 1.0f; if (!leg.spring && delta.SqrMagnitude() > 0) { float force = delta.x * inverse; float sensitivity = 3; float angle = leg.gameObject.transform.localEulerAngles.z; if ((force > 0 && angle - sensitivity * force > leg.angleLimits.x) || (force < 0 && angle - sensitivity * force < leg.angleLimits.y)) { leg.gameObject.transform.Rotate(new Vector3(0, 0, -sensitivity * force)); } } }
public void MoveLeg(LegData leg, Vector2 delta) { if (!leg.spring && (Math.Abs(delta.x) > 0.0f || Math.Abs(delta.y) > 0.0f)) { delta = Quaternion.Euler(0, 0, leg.arctanRotation) * (-delta); float diffAngle = Mathf.Rad2Deg * Mathf.Atan2(delta.y, delta.x); if (diffAngle < 0) { diffAngle = diffAngle < -90.0F ? 180.0F : 0.0F; } diffAngle = (leg.startMaxRange + diffAngle) - leg.currentAngle; if (Mathf.Abs(diffAngle) > leg.maxFrameDeltaAngle) { diffAngle = Mathf.Sign(diffAngle) * leg.maxFrameDeltaAngle; } float finalAngle; if (leg.currentAngle + diffAngle > leg.angleLimits.y) { finalAngle = leg.angleLimits.y; } else if (leg.currentAngle + diffAngle < leg.angleLimits.x) { finalAngle = leg.angleLimits.x; } else { finalAngle = leg.currentAngle + diffAngle; } leg.currentAngle = finalAngle; leg.gameObject.transform.localEulerAngles = new Vector3(0, 0, finalAngle); } }
void WebControl(KeyCode key, LegData leg) { if (Input.GetKeyDown(key)) { if (!leg.spring) { GameObject legObject = leg.gameObject; Transform legTransform = legObject.transform; LayerMask layerMask = ~(1 << LayerMask.NameToLayer("Player")); // shoot web from the tip of the leg Vector2 legEnd = legTransform.position + (legTransform.up * leg.height); RaycastHit2D hitInfo = Physics2D.Raycast(legEnd, legTransform.up, WebSwingRange, layerMask); if (hitInfo.collider) { if (hitInfo.collider.tag == "Enemy") { DamageInfo dmgSource = new DamageInfo(Damage, Position, hitInfo.collider.gameObject.transform.position, leg.PlayerNumber, hitInfo.collider); hitInfo.rigidbody.SendMessage("Die", dmgSource); } // if out leg is inside the wall don't create spring if (!legEnd.Equals(hitInfo.point)) { leg.webHitInfo = hitInfo; SpringJoint2D spring = legObject.AddComponent <SpringJoint2D> (); spring.autoConfigureDistance = false; spring.distance = 0; spring.dampingRatio = 0.9F; spring.frequency = 0.3F; // it should be up because joint start should be attached to the tip of the leg, but due to // hingejoint bugs its atm connected to the body spring.anchor = Vector2.zero; spring.connectedAnchor = hitInfo.point; leg.spring = spring; leg.swingCollision = true; leg.lr.SetPosition(1, leg.spring.connectedAnchor); leg.lr.enabled = true; } } else { // did not hit anything, change web color to red with the end at the maximum range leg.swingCollision = false; Vector2 reachedPoint = legTransform.position + legTransform.up * (leg.height + WebSwingRange); leg.lr.SetPosition(1, reachedPoint); leg.lr.enabled = true; } AudioUtils.Play("Laser"); } } else if (Input.GetKeyUp(key)) { leg.lr.enabled = false; SpringJoint2D spring = leg.spring; if (spring) { Destroy(spring); leg.webHitInfo = new RaycastHit2D(); } } if (leg.lr.enabled) { if (leg.webHitInfo.collider && !leg.webHitInfo.collider.name.ToLower().Contains("enemy")) // if we're connected to (not enemy) // shoot ray again to check if the string should be destroyed { LayerMask layerMask = ~(1 << LayerMask.NameToLayer("Player")); Transform legTransform = leg.gameObject.transform; Vector2 legEnd = legTransform.position + (legTransform.up * leg.height); RaycastHit2D hitInfo = Physics2D.Raycast(legEnd, leg.webHitInfo.point - legEnd, WebSwingRange, layerMask); if (Vector2.SqrMagnitude(hitInfo.point - leg.webHitInfo.point) > 0.001F) { leg.lr.enabled = false; SpringJoint2D spring = leg.spring; Destroy(spring); leg.webHitInfo = new RaycastHit2D(); AudioUtils.Play("FabricTorn", hitInfo.point); return; } } Vector2 legTip = leg.gameObject.transform.position + Quaternion.Euler(0, 0, leg.gameObject.transform.eulerAngles.z) * new Vector2(0, leg.height); if (leg.swingCollision) { leg.lr.SetPosition(0, legTip); leg.lr.SetColors(Color.white, Color.white); } else { leg.lr.SetColors(Color.red, Color.red); leg.lr.SetPosition(0, legTip); } } }