private Vector4 AttractorDir(Vector3 dir, LineAttractor attractor) { LineAttractorData data = attractor.Data; Vector3 p0 = attractor.P0.position; Vector3 p1 = attractor.P1.position; Vector3 cp = Utils.ClosestPointOnLine(transform.position, p0, p1); Vector3 lineDir = (p1 - p0).normalized; int lineAlignment = Vector3.Dot(lineDir, dir) > 0 ? 1 : -1; if (dir == Vector3.zero) { lineAlignment = 0; } Vector3 attractorDir = lineDir * lineAlignment; float d = (transform.position - cp).magnitude; float d01 = Mathf.Clamp01(Mathf.InverseLerp(data.Range, 0, d)); // closer to the line, higher the value if (data.Curve != null) { d01 = data.Curve.Evaluate(d01); } Vector3 lerpDir = Vector3.Lerp(dir, attractorDir, d01 * data.Power); return(new Vector4(lerpDir.x, lerpDir.y, lerpDir.z, d)); }
private void OnDrawGizmos() { // positions history for (int i = 0; i < MoveVectorHistory.Count; i++) { Color color = Color.white; color.a = Mathf.Lerp(0.1f, 1, (float)i / (float)MoveVectorHistory.Count); Gizmos.color = color; Gizmos.DrawSphere(PositionHistory[i], .05f); //Gizmos.DrawRay(PositionHistory[i], MoveVectorHistory[i]); } // line attractor gizmos if (UseAttractor) { // get closest attractor LineAttractor closestAttractor = null; float closestDist = Mathf.Infinity; foreach (LineAttractor attractor in LineAttractorsList) { Vector4 attractorDir = AttractorDir(InputDirRelToCamera, attractor); if (attractorDir.w < closestDist) { closestDist = attractorDir.w; closestAttractor = attractor; } } // draw closest attractor dirs if (closestAttractor != null) { LineAttractorData data = closestAttractor.Data; Vector3 p0 = closestAttractor.P0.position; Vector3 p1 = closestAttractor.P1.position; // closest point and line Gizmos.color = Color.red; Vector3 cp = Utils.ClosestPointOnLine(transform.position, p0, p1); Gizmos.DrawSphere(cp, .2f); Gizmos.DrawLine(transform.position, cp); // temp values Vector3 inputDir = InputDirRelToCamera; Vector3 lineDir = (p1 - p0).normalized; Vector3 attractedDir = (lineDir + inputDir).normalized; Vector3 lerpDir = AttractorDir(inputDir, closestAttractor); // gizmos dirs Gizmos.color = Color.white; Gizmos.DrawRay(transform.position, inputDir * 2); Gizmos.color = Color.blue; Gizmos.DrawRay(transform.position, InputDirRelToCamera * 2); Gizmos.color = Color.yellow; Gizmos.DrawRay(transform.position, lineDir * 2); Gizmos.color = Color.green * .75f; Gizmos.DrawRay(transform.position, attractedDir * 1.8f); Gizmos.color = Color.green; Gizmos.DrawRay(transform.position, lerpDir * 1.8f); } } }