private void SpawnResourcesAndDoodads() { Transform resources = transform.Find("Resources"); Transform doodads = transform.Find("Doodads"); ClearResources(resources, doodads); // TODO: get rid of this water junk GameObject water = GameObject.Find("Water4Simple"); List <GameObject> doodadPrefabs = ListUtility.From( (GameObject)Resources.Load("Doodads/DeadTree6"), (GameObject)Resources.Load("Doodads/DeadTree7"), (GameObject)Resources.Load("Doodads/Smallbush4"), (GameObject)Resources.Load("Doodads/SmallRock4"), (GameObject)Resources.Load("Doodads/SmallRock7")); var prefabs = new Dictionary <ResourcePlacementType, IReadOnlyList <GameObject> > { [ResourcePlacementType.Trees] = ListUtility.From(Resources.Load <GameObject>("Buildings/WoodSource")), [ResourcePlacementType.Stone] = ListUtility.From(Resources.Load <GameObject>("Buildings/StoneRocks")), [ResourcePlacementType.Gold] = ListUtility.From(Resources.Load <GameObject>("Buildings/GoldRocks")), [ResourcePlacementType.Fish] = ListUtility.From(Resources.Load <GameObject>("Prefabs/FishingHole")), [ResourcePlacementType.Berries] = ListUtility.From(Resources.Load <GameObject>("Buildings/ForagingGround")), [ResourcePlacementType.Doodad] = doodadPrefabs, }; TerrainData terrainData = GetComponent <Terrain>().terrainData; float waterHeight = (water.transform.position.y - transform.position.y) / terrainData.size.y; ResourcePlacer placer = new ResourcePlacer(terrainData, waterHeight, newGameSettings.seed, newGameSettings.ResourceSettings); Dictionary <ResourcePlacementType, List <GameObject> > placedResources = ((ResourcePlacementType[])Enum.GetValues(typeof(ResourcePlacementType))) .ToDictionary(it => it, _ => new List <GameObject>()); const int resolution = 45; for (int x = 0; x < resolution; ++x) { for (int y = 0; y < resolution; ++y) { float u = (x + 0.5f) / resolution; float v = (y + 0.5f) / resolution; ResourcePlacementType type = placer.GetPlacementType(u, v); if (type == ResourcePlacementType.None) { continue; } int index = mRandom.Next(0, prefabs[type].Count); GameObject prefab = prefabs[type][index]; GameObject instance = GameController.Factory.Instantiate(prefab); placedResources[type].Add(instance); instance.transform.position = RandomizePosition(u, v, terrainData); instance.transform.SetParent(type == ResourcePlacementType.Doodad ? doodads : resources); if (type == ResourcePlacementType.Fish) { instance.transform.position = new Vector3( instance.transform.position.x, water.transform.position.y, instance.transform.position.z); } else { instance.GetComponent <NeolithicObject>().SnapToGround(); } } } ClusterResources(placedResources[ResourcePlacementType.Trees], 200.0f, 3.0f); ClusterResources(placedResources[ResourcePlacementType.Berries], 400.0f, 12.0f); }