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); } } }
public static GameObject SplatFromDamageInfo(DamageInfo info) { return(SplatFromDirection(info.TargetPosition, info.TargetPosition - info.SourcePosition, info.Damage)); }