using UnityEngine;
using System.Collections;
public class WayPoint : MonoBehaviour {
GetAngle angle; GameObject ex; Transform NearestRoad; GameObject destination; Transform forwardSide;
GameObject NearestPoint;float distance; int executeCode; int StagePoint; float accuredValue; float objectAngle; int direction;
// Use this for initialization
void findNearestPoint(){
GameObject[] wayPoint; int i; distance = 9999999; float newDistance; int index = 0;
float diffX; float diffZ;
wayPoint = GameObject.FindGameObjectsWithTag("WayPoint");
for(i = 0; i < wayPoint.Length; i++){
diffX = destination.transform.position.x - wayPoint[i].transform.position.x;
diffZ = destination.transform.position.z - wayPoint[i].transform.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ;
newDistance = Mathf.Sqrt(diffX + diffZ);
if(newDistance < distance){
distance = newDistance; index = i;
}
}
NearestPoint = wayPoint[index]; Debug.Log(NearestPoint.transform.parent.position);
}
void FindWayPoint (float x1, float z1) { float x2; float z2; float lastAngle;
GameObject[] wayPoint; int i; float diffX; float diffZ; GameObject tempPoint;
distance = 9999999; float newDistance; int index = 0;
wayPoint = GameObject.FindGameObjectsWithTag("WayPoint");
for(i = 0; i < wayPoint.Length; i++){
diffX = gameObject.transform.position.x - wayPoint[i].transform.position.x;
diffZ = gameObject.transform.position.z - wayPoint[i].transform.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ;
newDistance = Mathf.Sqrt(diffX + diffZ);
if(newDistance < distance){
distance = newDistance; index = i;
}
}
tempPoint = wayPoint[index]; NearestRoad = tempPoint.transform.parent;
if(tempPoint.name == "connection1"){
forwardSide = NearestRoad.GetChild(1);
}else{
forwardSide = NearestRoad.GetChild(0);
}
// x1 = gameObject.transform.position.x; z1 = gameObject.transform.position.z;
x2 = tempPoint.transform.position.x; z2 = tempPoint.transform.position.z;
lastAngle = gameObject.transform.eulerAngles.y;
objectAngle = angle.getAngle(x1,z1,x2,z2,lastAngle);
if(objectAngle < 0){
objectAngle = -objectAngle; direction = -1;
}else{
direction = 1;
}
executeCode = 1; Debug.Log(objectAngle);
}
void reConnect () {GameObject[] tempObject; GameObject doubleCheck; int i; GameObject[] temp3;
float x1; float z1; float x2; float z2; distance = 9999999; float lastAngle; float w; float h;
float diffX; float diffZ; float newDistance = 0; int index = 0; int a; Transform temp;
if(forwardSide.name == "connection1"){ a = 0; }else { a = 1; }
temp = forwardSide.transform.parent;
tempObject = GameObject.FindGameObjectsWithTag("WayPoint"); temp3 = new GameObject[4];
temp3[0] = null; temp3[1] = null; temp3[2] = null; temp3[3] = null;
for(i = 0; i < tempObject.Length; i++){
w = gameObject.transform.position.x; h = gameObject.transform.transform.position.z;
if(tempObject[i].transform.position.x < w + 2 && tempObject[i].transform.position.x > w - 2 &&
tempObject[i].transform.position.z < h + 2 && tempObject[i].transform.position.z > h - 2){
if(temp3[0] == null){ temp3[0] = tempObject[i]; }
else if(temp3[1] == null ){ temp3[1] = tempObject[i]; }
else if(temp3[2] == null ){ temp3[2] = tempObject[i]; }
else if(temp3[3] == null ){ temp3[3] = tempObject[i]; }
}
}
for( i = 0; i < 4; i++ ){
if( temp3[i] != null ){
diffX = destination.transform.position.x - temp3[i].transform.parent.position.x;
diffZ = destination.transform.position.z - temp3[i].transform.parent.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ;
newDistance = Mathf.Sqrt(diffX + diffZ); Debug.Log( "distance : " + newDistance );
if(newDistance < distance ){
index = i; distance = newDistance;
}
}Debug.Log( "distance is " + distance + " index : " + index);
}NearestRoad = temp3[index].transform.parent;
if( temp == forwardSide.transform.parent ){
if(a == 0){
a = 1;
}else{
a = 0;
}
}
forwardSide = NearestRoad.GetChild(a);
lastAngle = gameObject.transform.eulerAngles.y;
x1 = gameObject.transform.position.x; z1 = gameObject.transform.position.z;
x2 = forwardSide.transform.position.x; z2 = forwardSide.transform.position.z;
objectAngle = angle.getAngle(x1,z1,x2,z2,lastAngle);
if(objectAngle < 0){
objectAngle = -objectAngle; direction = -1;
}else { direction = 1; }
Debug.Log("re " + forwardSide.transform.parent.position);
diffX = gameObject.transform.position.x - forwardSide.transform.position.x;
diffZ = gameObject.transform.position.z - forwardSide.transform.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ; distance = Mathf.Sqrt( diffX + diffZ );
}
void Start () {
executeCode = 0; StagePoint = 0; angle = new GetAngle(); direction = 1; destination = GameObject.Find("destination");
findNearestPoint();
}
// Update is called once per frame
void Update () {
if(executeCode == 1){
if(StagePoint == 0 && accuredValue < objectAngle ){
gameObject.transform.Rotate(0, Time.deltaTime * 180 * direction , 0);
accuredValue += Time.deltaTime * 180;
}else if(StagePoint == 0){ accuredValue = 0; StagePoint = 1; Debug.Log("rotate end");}
if(StagePoint == 1 && accuredValue < distance){
gameObject.transform.Translate(Vector3.forward * Time.deltaTime * 10);
accuredValue += Time.deltaTime * 10;
}else if(StagePoint == 1){Debug.Log("forward End");
StagePoint = 2; accuredValue = 0;
objectAngle = angle.getAngle
(gameObject.transform.position.x, gameObject.transform.position.z, NearestRoad.position.x, NearestRoad.position.z , gameObject.transform.eulerAngles.y);
if( objectAngle < 0 ){
objectAngle = -objectAngle; direction = -1;
}else{ direction = 1; }
}
if(StagePoint == 2 && accuredValue < objectAngle ){
gameObject.transform.Rotate (0, Time.deltaTime * 180 * direction, 0);
accuredValue += Time.deltaTime * 180;
}
else if(StagePoint == 2){ float diffX; float diffZ;
accuredValue = 0; StagePoint = 3;
diffX = gameObject.transform.position.x - forwardSide.position.x;
diffZ = gameObject.transform.position.z - forwardSide.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ;
distance = Mathf.Sqrt(diffX + diffZ);
}
if(StagePoint == 3 && accuredValue < distance){
gameObject.transform.Translate(Vector3.forward * Time.deltaTime * 10);
accuredValue += Time.deltaTime * 10;
}else if( StagePoint == 3 && forwardSide.transform.parent == NearestPoint.transform.parent ){
accuredValue = 0; StagePoint = 0; executeCode = 0;
Debug.Log(forwardSide.transform.parent.position);
Debug.Log(NearestPoint.transform.parent.position);
}else if ( StagePoint == 3 ){
accuredValue = 0; StagePoint = 0; executeCode = 2;
Debug.Log(forwardSide.transform.parent.position);
Debug.Log(NearestPoint.transform.parent.position); reConnect();
}
}
if(executeCode == 2){
if( StagePoint == 0 && accuredValue < objectAngle ){
gameObject.transform.Rotate(0, Time.deltaTime * 180 * direction ,0);
accuredValue += Time.deltaTime * 180;
}else if(StagePoint == 0){
accuredValue = 0; StagePoint = 1; Debug.Log("re rotate"); Debug.Log("1 a : " + forwardSide.transform.parent.position + " b : " + NearestRoad.transform.position );
}
if( StagePoint == 1 && accuredValue < distance ){
gameObject.transform.Translate(Vector3.forward * Time.deltaTime * 10);
accuredValue += Time.deltaTime * 10;
float diffX = gameObject.transform.position.x - destination.transform.position.x;
float diffZ = gameObject.transform.position.z - destination.transform.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ; float temp = Mathf.Sqrt(diffX + diffZ);
if(temp < 4){ accuredValue = 0; StagePoint = 0; executeCode = 3; distance = temp; }
}else if( StagePoint == 1 && forwardSide.transform.parent.position == NearestPoint.transform.parent.position ){
accuredValue = 0; StagePoint = 0; executeCode = 3; Debug.Log ("end");
float diffX = gameObject.transform.position.x - destination.transform.position.x;
float diffZ = gameObject.transform.position.z - destination.transform.position.z;
diffX = diffX * diffX; diffZ = diffZ * diffZ;
distance = Mathf.Sqrt(diffX + diffZ);
objectAngle = angle.getAngle(gameObject.transform.position.x,gameObject.transform.position.z,
destination.transform.position.x,destination.transform.position.z,gameObject.transform.eulerAngles.y);
if(objectAngle < 0){
objectAngle = -objectAngle; direction = -1;
}else{
direction = 1;
}
if(forwardSide.transform.parent.position == NearestPoint.transform.parent.position){ Debug.Log("??????"); }
}else if(StagePoint == 1){
accuredValue = 0; StagePoint = 0; executeCode = 2; reConnect();
}
}
if(executeCode == 3){
if(StagePoint == 0 && accuredValue < objectAngle ){
gameObject.transform.Rotate(0, Time.deltaTime * 180 * direction, 0);
accuredValue += 180 * Time.deltaTime;
}else if( StagePoint == 0 ) {
StagePoint = 1; accuredValue = 0;
}
if(StagePoint == 1 && accuredValue < distance ) {
gameObject.transform.Translate(Vector3.forward * Time.deltaTime * 10);
accuredValue += Time.deltaTime * 10;
}else if(StagePoint == 1){
StagePoint = 0; executeCode = 0; accuredValue = 0; Debug.Log("complete");
}
}
if(Input.GetKeyDown(KeyCode.Space) && executeCode == 0){
FindWayPoint(gameObject.transform.position.x, gameObject.transform.position.z);
}
}
}