// Use this for initialization void Start () { if (!FieldTile.GetComponent<GridField> ()) return; StartMarker.gameObject.SetActive(false); EndMarker.gameObject.SetActive(false); CurrentFieldMarker.gameObject.SetActive(false); ResearchFieldMarker.gameObject.SetActive(false); openListOut = new StringBuilder (); CurrentWay = new List<GridField>(); Charcters = new List<Character> (); for (int charCount = 0; charCount < CharctersAmmount; charCount++) { GameObject go = (GameObject)GameObject.Instantiate(WalkChar.gameObject); go.SetActive(false); Charcters.Add(go.GetComponent<Character>()); } Field = new List<GridField> (); FieldArray = new GridField[X_Size,Y_Size]; tileWidth = FieldTile.renderer.bounds.size.x; tileHight = FieldTile.renderer.bounds.size.z; Vector3 origin = transform.position; for (int x = 0; x<X_Size; x++) { for (int y = 0; y<Y_Size; y++) { Vector3 offsetPosition = new Vector3(origin.x + x*tileWidth,origin.y ,origin.z + y*tileHight); GameObject go = (GameObject)GameObject.Instantiate(FieldTile); go.transform.position = offsetPosition; go.transform.parent = transform; GridField selectedField = go.GetComponent<GridField>(); selectedField.evaValue = Random.value; go.renderer.material.color = Default_Color.Evaluate(selectedField.evaValue); selectedField.X = x; selectedField.Y = y; Field.Add(selectedField); FieldArray[x,y] = selectedField; } } StartMarker.gameObject.SetActive(true); start = FieldArray [Mathf.RoundToInt(Random.Range(0,X_Size)), Mathf.RoundToInt(Random.Range(0,Y_Size))]; start.setState(GridField.FieldState.Unknown,Start_Color.Evaluate(start.evaValue)); StartMarker.SetPos (start.transform.position); EndMarker.gameObject.SetActive(true); do { end = FieldArray [Mathf.RoundToInt (Random.Range (0, X_Size)), Mathf.RoundToInt (Random.Range (0, Y_Size))]; } while(end == start); end.setState(GridField.FieldState.Unknown,End_Color.Evaluate(end.evaValue)); EndMarker.SetPos (end.transform.position); disVis.gameObject.SetActive (false); }
void nextNeighbour (GridField gField, GridField currentField) { if (microSearch && reseached == 0) { reseached++; } else { reseached++; if (gField.State == GridField.FieldState.Unknown) { if (gField != start && gField != end) gField.setState (GridField.FieldState.Open, Open_Color.Evaluate (gField.evaValue)); else gField.State = GridField.FieldState.Open; gField.accumulatedDistance = currentField.accumulatedDistance + Vector3.Distance (currentField.transform.position, gField.transform.position); if (!useDijkstra) disVis.VisDistance (gField.transform.position + Vector3.up, end.transform.position + Vector3.up); gField.guessedTargetDistance = gField.accumulatedDistance + (useDijkstra ? 0 : Vector3.Distance (gField.transform.position, end.transform.position)); gField.PrevLink = currentField; if (!OpenList.ContainsKey (gField.guessedTargetDistance)) { OpenList.Add (gField.guessedTargetDistance, new List<GridField> ()); } OpenList [gField.guessedTargetDistance].Add (gField); } else if (gField.State == GridField.FieldState.Open) { float accDistance = currentField.accumulatedDistance + Vector3.Distance (currentField.transform.position, gField.transform.position);// + (useDijkstra ? 0 : Vector3.Distance (gField.transform.position, end.transform.position)); if (gField.accumulatedDistance > accDistance) { OpenList [gField.guessedTargetDistance].Remove (gField); if (OpenList [gField.guessedTargetDistance].Count == 0) { OpenList.Remove (gField.guessedTargetDistance); } gField.accumulatedDistance = accDistance; if (!useDijkstra) disVis.VisDistance (gField.transform.position + Vector3.up, end.transform.position + Vector3.up); gField.guessedTargetDistance = gField.accumulatedDistance + (useDijkstra ? 0 : Vector3.Distance (gField.transform.position, end.transform.position)); gField.PrevLink = currentField; if (!OpenList.ContainsKey (gField.guessedTargetDistance)) { OpenList.Add (gField.guessedTargetDistance, new List<GridField> ()); } OpenList [gField.guessedTargetDistance].Add (gField); } } } researchFieldInfo.setInfo (gField.X, gField.Y, gField.State, gField.accumulatedDistance, (useDijkstra ? gField.accumulatedDistance : gField.guessedTargetDistance)); ResearchFieldMarker.SetPos (gField.transform.position); openListOut.Length = 0; openListOut.AppendLine ("OpenList:"); foreach(KeyValuePair<float,List<GridField>> kp in OpenList){ openListOut.Append(kp.Key); openListOut.Append(" : "); foreach(GridField gf in kp.Value){ openListOut.Append("["); openListOut.Append(gf.X); openListOut.Append(","); openListOut.Append(gf.Y); openListOut.Append("]"); openListOut.Append(" "); } openListOut.AppendLine(); } OpenListOut.text = openListOut.ToString (); }