Exemplo n.º 1
0
    public void OnTreePositionFound(object treePlacementObject)
    {
        Random random = new Random(135);
        ThreadsafePlaceable threadsafePlaceable = (ThreadsafePlaceable)treePlacementObject;
        Vector2             position            = _terrainGenerator.GetTerrainChunkPosition(threadsafePlaceable.Position.x, threadsafePlaceable.Position.z);

        Debug.Log("Tree Position Terrain Chunk: " + position);
        TerrainChunk  terrainChunk  = _terrainGenerator.GetTerrainChunk(position);
        TreeBehaviour treeBehaviour = (TreeBehaviour)threadsafePlaceable.MapPlaceable;

        treeBehaviour.transform.position = threadsafePlaceable.Position;
        treeBehaviour.gameObject.name    = "Tree: " + threadsafePlaceable.Position;
        foreach (NeededSpace neededSpace in threadsafePlaceable.NeededSpaces)
        {
            ProceduralNeededSpace proceduralNeededSpace = (ProceduralNeededSpace)neededSpace;
            GameObject            prefab = null;
            if (neededSpace.TerrainType == TerrainGenerator.TerrainType.Coast)
            {
                prefab = _coastModel;
            }
            else if (neededSpace.TerrainType == TerrainGenerator.TerrainType.Flatland)
            {
                prefab = _flatlandModel;
            }
            else if (neededSpace.TerrainType == TerrainGenerator.TerrainType.Hill)
            {
                prefab = _hillModel;
            }
            else if (neededSpace.TerrainType == TerrainGenerator.TerrainType.Mountain)
            {
                prefab = _mountainModel;
            }
            else
            {
                continue;
            }

            Vector3    absolutePosition = neededSpace.UsedCoordinate + threadsafePlaceable.Position;
            Vector2Int pos = new Vector2Int((int)absolutePosition.x, (int)absolutePosition.z);
            if (terrainChunk.EnvDictionary.ContainsKey(pos))
            {
                continue;
            }

            float      proceduralScalar = Mathf.Clamp(((proceduralNeededSpace.NoiseValue * 100f) % 10) / 7, 0.8f, 2f);
            GameObject go = GameObject.Instantiate(prefab, absolutePosition, Quaternion.Euler(0f, proceduralScalar * 360f, 0f), treeBehaviour.transform);
            // Debug.Log(proceduralNeededSpace.NoiseValue + " _ " + proceduralScalar);

            for (int i = 0; i < go.transform.childCount; i++)
            {
                go.transform.GetChild(i).localScale *= proceduralScalar;
            }
            terrainChunk.EnvDictionary.Add(pos, go);
        }
        if (!_placementController.PlaceObject(treeBehaviour))
        {
            GameObject.Destroy(treeBehaviour.gameObject);
        }
    }