コード例 #1
0
	// 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);
	}
コード例 #2
0
	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 ();
	}