Пример #1
0
        public ForestStatic(LevelGeneratorParameters parameters, ITreesSpacingController spacingController)
            : base(parameters)
        {
            this.spacingController = spacingController;

            grid = new StaticTreesLine[gridDepth];
            int firstTreeId = 0;

            for (int i = 0; i < grid.Length; i++)
            {
                int   lineId  = i - gridDepth;
                float spacing = spacingController.GetSpacingByUniqueTreesLineId(lineId);

                Vector3 startPos = parameters.startForesPposition + i * spacing * groundForward;
                grid[i] = new StaticTreesLine(startPos, gridWidth, firstTreeId, lineId);
                grid[i].treesSpacing = spacing;

                firstTreeId += grid[i].GetTreesCount();
            }
            lastFirstTreeId = firstTreeId;

            pool = new Stack <TreeObject>(treesCount);
            for (int i = 0; i < treesCount; i++)
            {
                pool.Push(new TreeObject(GameObject.Instantiate(treePrefab, 100 * Vector3.down, Quaternion.identity).transform));
            }

            Vector3 forward       = character.forward;
            Vector3 posForCulling = character.position + Vector3.back * 8;

            for (int d = 0; d < grid.Length; d++)
            {
                var line = grid[d];
                for (int x = 0; x < gridWidth; x++)
                {
                    var tree = line.trees[x];
                    tree.rotationIndex = 0;
                    tree.scaleIndex    = 0;
                    tree.position      = line.position + (x - gridWidth / 2) * line.treesSpacing * Vector3.right;
                    //tree.debugObject.transform.position = tree.position;
                    if ((Vector3.Angle(forward, tree.position - posForCulling) <= halfFOV) &&
                        (Vector3.Distance(tree.position, character.position) < 65) &&
                        (pool.Count > 0))
                    {
                        var go = pool.Pop();
                        go.mainTransform.position   = tree.position;
                        go.treeTransform.rotation   = rotationPresets[tree.rotationIndex];
                        go.mainTransform.localScale = scalePresets[tree.scaleIndex];
                        tree.treeObject             = go;
                    }
                }
                //Debug.Log("Line spacing " + line.treesSpacing + " pos " + line.position);
            }
        }
Пример #2
0
        protected Vector3 GetRandomOffset(StaticTreesLine line, Tree tree, uint uniqueTreeId)
        {
            tree.scaleIndex = (int)(3.99f * CustomRandom.Get(uniqueTreeId + 2));

            CheckTreePosition(tree, uniqueTreeId);

            prevPositions[uniqueTreeId] = tree.position;
            return((0.18f + 0.14f * CustomRandom.Get(uniqueTreeId)
                    * spacingDependencyByScale[tree.scaleIndex])
                   * gradients[(int)(15.99f * CustomRandom.Get(uniqueTreeId + 1))] * line.treesSpacing);
        }