void doForce(rayControl control) { foreach (RaycastHit hit in hits) { float dist = (1.0f - (hit.distance) / (control.maxRange)); dist *= (strength + Mathf.Abs(rb.velocity.x) / (float.MaxValue / 100.0f)); Rigidbody other = hit.collider.GetComponent <Rigidbody>(); if (rb.velocity.y < 0.0f) { dist *= 2.0f; } Vector3 forcePos = hit.point + Vector3.up * hit.distance; Debug.DrawLine(hit.point + Vector3.up * hit.distance, hit.point, Color.black, 0.02f, false); rb.AddForceAtPosition((rb.rotation * Vector3.up) * dist, forcePos, ForceMode.Acceleration); if (other != null) { other.AddForceAtPosition(Vector3.down * dist, hit.point, ForceMode.Acceleration); } Debug.DrawLine(forcePos, forcePos + (rb.rotation * Vector3.up) * dist, Color.green, 0.02f, false); } hits = new RaycastHit[0]; }
// Update is called once per frame void FixedUpdate() { if (rayDown) { rayControl pos = getPosInfo(); hits = getHits(pos); doForce(pos); } }
rayControl getPosInfo() { float range = cl.size.y * rb.transform.localScale.y; Quaternion orie = rb.rotation; Vector3 testPos = rb.position + orie * (cl.center + new Vector3(0.0f, range * 0.5f, 0.0f)); Vector3 halfsies = new Vector3(transform.parent.localScale.x * cl.size.x / 2.0f, 0.0f, transform.parent.localScale.z * cl.size.z / 2.0f); rayControl ret = new rayControl(testPos, halfsies, Vector3.down, range, orie, 5); return(ret); }
RaycastHit[] getHits(rayControl control) { RaycastHit[] hits = getHits(control.center, control.halfExt, control.dir, control.maxRange, control.orientation, control.focus); return(hits); }