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); } }
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); }