static void SpawnRocks(PrefabSpawner spawner) { var allowedNodeTypes = new MapGraph.NodeType[] { MapGraph.NodeType.Grass, MapGraph.NodeType.TallGrass, MapGraph.NodeType.Rocky }; var rockNodes = mapGraph.FilterNodes(allowedNodeTypes).ToList(); int numRocks = (int)(rockNodes.Count * settings.rockAvgDensity); for (int i = 0; i < numRocks; i++) { // Randomly select a node. If it has more than the maximum number // of occupants, try again. var node = rockNodes.ElementAt(prng.Next(rockNodes.Count)); if (node.numEnvironmentOccupants > 0) { i--; continue; } MeshRenderer obj = spawner.SpawnPrefab( settings.rockPrefab, RandomOffset(node.centerPoint, mapGraph.center, settings.rockPositionDeviation), RandomRotation(settings.rockRotationDeviation), RandomScaling(settings.rockScale, settings.rockScaleDeviation) ); obj.transform.gameObject.AddComponent <MeshCollider>(); // Increment the number of environmental occupants for the // current node. node.numEnvironmentOccupants++; } }
private static void FloodFill( MapGraph.Node node, MapGraph.NodeType targetType, MapGraph.NodeType replacementType ) { if (targetType == replacementType || node.nodeType != targetType) { return; } node.nodeType = replacementType; foreach (var neighbor in node.GetNeighbourNodes()) { FloodFill(neighbor, targetType, replacementType); } }