Пример #1
0
    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];
    }
Пример #2
0
 // Update is called once per frame
 void FixedUpdate()
 {
     if (rayDown)
     {
         rayControl pos = getPosInfo();
         hits = getHits(pos);
         doForce(pos);
     }
 }
Пример #3
0
    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);
    }
Пример #4
0
 RaycastHit[] getHits(rayControl control)
 {
     RaycastHit[] hits = getHits(control.center, control.halfExt, control.dir, control.maxRange, control.orientation, control.focus);
     return(hits);
 }