void Awake() { navfieldManager = GameObject.FindObjectOfType <NavfieldManager>(); boids = new Boid[numberOfBoids]; boids[0] = GetComponentInChildren <Boid>(); boids[0].init(); boids[0].setNeighbors(new Boid[0]); leader = boids[0]; for (int i = 1; i < numberOfBoids; i++) { boids[i] = Instantiate(boidPrefab, transform.position, Quaternion.identity) as Boid; boids[i].transform.parent = transform; boids[i].init(); } // Set neighbors int index = 0; int neighborIndexLeft = numberOfBoids - 1; Boid[] neighbors; List <Boid> neighborsLeft = new List <Boid>(boids); for (int i = 1; i < numberOfBoids; i++) { neighbors = new Boid[1]; for (int j = 0; j < 1; j++) { index = Random.Range(1, neighborIndexLeft); neighbors[j] = neighborsLeft[index]; neighborsLeft.RemoveAt(index); neighborIndexLeft--; } boids[i].setNeighbors(neighbors); } // Init barycenter = Vector3.zero; timeSinceLastCheck = 0f; randomWalkTime = 0f; returnTime = 0f; timeSinceLastRandomWalk = 0f; timeSinceLastReturn = 0f; randomWalk = false; returnWalk = false; target = Vector3.zero; }
private void Create(NavfieldManager manager, Flock flock, Quaternion orientation, NavFieldPrimitives primitive, float duration) { this.manager = manager; origin = flock.getBarycenter(); rotation = orientation; size = manager.minSize; cellSize = manager.minCellSize; int count = 0; for (int i = 0; i < flock.numberOfBoids; i++) { if (isInside(flock.boids[i].transform.position)) { count++; } } float ratio = (float)count / (float)flock.numberOfBoids, minRatio = (manager.minSize * manager.minCellSize) / flock.boundRadius; if (ratio >= minRatio) { cellSize = (float)manager.minCellSize / ratio; } else { cellSize = (float)manager.minCellSize / minRatio; } forces = new Vector3[size, size, size]; this.duration = duration; time = 0f; switch (primitive) { case NavFieldPrimitives.dispersal: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * new Vector3((i - (size * 0.5f)) / (size * 0.5f), (j - (size * 0.5f)) / (size * 0.5f), (k - (size * 0.5f)) / (size * 0.5f)); } } } break; case NavFieldPrimitives.gathering: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * -new Vector3((i - (size * 0.5f)) / (size * 0.5f), (j - (size * 0.5f)) / (size * 0.5f), (k - (size * 0.5f)) / (size * 0.5f)); } } } break; case NavFieldPrimitives.horizontal_compressor: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * -new Vector3((i - (size * 0.5f)) / (size * 0.5f), 0, 0); } } } break; case NavFieldPrimitives.vertical_compressor: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * -new Vector3(0, (j - (size * 0.5f)) / (size * 0.5f), 0); } } } break; case NavFieldPrimitives.ascension: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * new Vector3(0, 1, 0); } } } break; case NavFieldPrimitives.descent: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { forces[i, j, k] = manager.force * -new Vector3(0, 1, 0); } } } break; case NavFieldPrimitives.tube: for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { if (i - (size * 0.5f) < 0) { forces[i, j, k] = manager.force * new Vector3(1, 1, 0); } else { forces[i, j, k] = manager.force * new Vector3(-1, 1, 0); } } } } break; } }
public Navfield(NavfieldManager manager, Flock flock, Quaternion orientation, NavFieldPrimitives primitive, float duration) { Create(manager, flock, orientation, primitive, duration); }