for loop – whirling search loop

for loop – whirling search loop

how to create a whirling search loop, with 3 for…loop,

haven’t find any reference for this on internet may be I using the wrong keyword, so… here the thing I created.

public bool FindFreeSpace(Vector3 point, int searchRange, out Vector3 location)
{
	// init checker
	GameObject fakeObject = new GameObject();
	StructureController checker = fakeObject.AddComponent<StructureController>();
	// your controller should return the space is available or not.
	
	/*********************
	// loop pattern from range 1~5
	[5][5][5][5][5][5]
	[5][3][3][3][3]
	[5][3][1][1][4]
	[5][3][1][2][4]
	[5][2][2][2][4]
	[4][4][4][4][4]
	*********************/
	int range = searchRange;
	int dir = 1;				// -1/1
	float session = 0f;		// record next cycle start point, e.g. Vector2(session,session) , x == z
	float baseX = checker.transform.localPosition.x;
	float baseY = checker.transform.localPosition.y;
	float baseZ = checker.transform.localPosition.z;
	bool found = false;

	for (int r = 1; !found && r <= range; r++ )
	{
		int x = 0;
		int z = 0;
		for (x = 0; !found && (dir == 1 && x < r) || (dir == -1 && x > -r); x += dir)
		{
			// move x relative 0~r or 0~-r
			if (found = MoveChecker(checker, new Vector3(baseX + session + (float)x, baseY, baseZ + session + (float)z))) break;
		}
		for (z = 0; !found && (dir == 1 && z < r) || (dir == -1 && z > -r); z += dir)
		{
			// move z relative 0~r or 0~-r
			if (found = MoveChecker(checker, new Vector3(baseX + session + (float)x, baseY, baseZ + session + (float)z))) break;
		}
		session += (float)(dir * r);		// next cycle start point.
		dir *= -1;								// change direction
	}
	
	// update output variable
	if (found)
		location = checker.transform.localPosition;
	else
		location = point;
	GameObject.DestroyImmediate(fakeObject);
	return found;
}

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料