Exemplo n.º 1
0
        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);
        }