// Update is called once per frame void Update() { bezierPath script = GameObject.Find("bezierPath").GetComponent <bezierPath>(); if (positionPointer == 0) { uint i = 0; float dist = Vector3.Distance(script.vertices[(int)i], transform.position); float dist2; //Vector3 closestVertex; foreach (Vector3 vertex in script.vertices) { dist2 = Vector3.Distance(transform.position, vertex); if (dist > dist2) { dist = dist2; positionPointer = i++; } } } else { float predecessor = Vector3.Distance(transform.position, script.vertices[(int)positionPointer - 1]); float successor = Vector3.Distance(transform.position, script.vertices[(int)positionPointer + 1]); float actual = Vector3.Distance(transform.position, script.vertices[(int)positionPointer]); if (predecessor < actual) { positionPointer--; } if (successor < actual) { positionPointer++; } if (positionPointer > 99) { positionPointer = 99; } } //print (Vector3.Distance(transform.position,script.vertices[(int)positionPointer])+"<<<<<<<<<<<<<"); rotateToNoCollisionDirection(); Debug.DrawLine(transform.position, transform.position + transform.forward, Color.white); }
bool rotateToNoCollisionDirection() { bool colliding = false; Vector3 forwardPoint = transform.forward + transform.position; //print ("number of colliding objects = "+collidingObjects.Count); bezierPath script = GameObject.Find("bezierPath").GetComponent <bezierPath>(); //print(Vector3.Distance (forwardPoint, script.vertices [(int)positionPointer])+">>>>>>"+script.tunelScale); if (collidingObjects.Count != 0 || Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale) { //print ("colliding"); rigidbody.velocity = Vector3.zero; foreach (GameObject o in collidingObjects) { if (o == null) { continue; } float radius = (o.GetComponent <SphereCollider>().radius *o.transform.localScale.x); //print (o.GetComponent<SphereCollider>().radius+" "+o.transform.localScale.x); if (Vector3.Distance(forwardPoint, o.transform.position) < radius || Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale) { for (int i = 0; i < 20; i++) { transform.Rotate(Random.Range(180, -180), Random.Range(180, -180), Random.Range(180, -180)); if (Vector3.Distance(forwardPoint, o.transform.position) > radius) { //print ("break for- matching right angles"); break; } else if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) < script.tunelScale) { break; } } } else { //print("error of detection "+Vector3.Distance(forwardPoint,o.transform.position) +"< radius=" + radius); } } if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale) { for (int i = 0; i < 20; i++) { transform.Rotate(Random.Range(180, -180), Random.Range(180, -180), Random.Range(180, -180)); if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) < script.tunelScale) { break; } } } foreach (GameObject o in collidingObjects) { if (o == null) { continue; } float radius = o.GetComponent <SphereCollider>().radius *o.transform.localScale.x; if (Vector3.Distance(forwardPoint, o.transform.position) < radius) { //print ("colliding=true"); colliding = true; } else if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale) { colliding = true; } } } if (colliding == false) { rigidbody.velocity = transform.forward * speed; } return(colliding); }