protected override void MoveRight(Vector3 pos) { for (int i = 0; i < gridDepth; i++) { var treesLine = grid[i]; treesLine.position.x = pos.x; uint uniqueTreeId = treesLine.GetTreeUniqueId(treesLine.trees[treesLine.gridRightIndex]) + 1; float rightPos = treesLine.GetPositionXByUniqueId(uniqueTreeId); var tree = treesLine.trees[treesLine.gridLeftIndex]; tree.position = new Vector3(rightPos, treesLine.position.y, treesLine.position.z); tree.position += GetRandomOffset(treesLine, tree, uniqueTreeId); //tree.debugObject.transform.position = tree.position; if (tree.treeObject != null) { pool.Push(tree.treeObject); tree.treeObject = null; } treesLine.gridRightIndex = (treesLine.gridRightIndex + 1) % gridWidth; treesLine.gridLeftIndex = (treesLine.gridLeftIndex + 1) % gridWidth; tree.isActive = !RoadSystem.CheckCollision(tree.position); } }
protected override void MoveLeft(Vector3 pos) { float leftPos = pos.x - (treesSpacing * gridWidth / 2); for (int i = 0; i < gridDepth; i++) { var treesLine = grid[i]; treesLine.position.x = pos.x; var tree = treesLine.trees[treesLine.gridRightIndex]; tree.position = new Vector3(leftPos, tree.position.y, tree.position.z) + GetRandomOffset(tree.scaleIndex); if (tree.treeObject != null) { tree.treeObject.mainTransform.position = tree.position; } treesLine.gridRightIndex -= 1; if (treesLine.gridRightIndex < 0) { treesLine.gridRightIndex = gridWidth - 1; } treesLine.gridLeftIndex -= 1; if (treesLine.gridLeftIndex < 0) { treesLine.gridLeftIndex = gridWidth - 1; } tree.isActive = !RoadSystem.CheckCollision(tree.position); } }
protected override void ForestMoveZ(int sdi) { if (character.position.z - grid[sdi].position.z > treesSpacing * 3) { var treesLine = grid[sdi]; treesLine.gridLeftIndex = 0; treesLine.gridRightIndex = gridWidth - 1; int indexOfEnd = (sdi + gridDepth - 1) % gridDepth; Vector3 pos = grid[indexOfEnd].position + treesSpacing * groundForward; for (int x = 0; x < gridWidth; x++) { var tree = treesLine.trees[x]; tree.scaleIndex = (int)(3.99f * Random.value); tree.rotationIndex = (int)(3.99f * Random.value); tree.position = pos + (x - gridWidth / 2) * treesSpacing * Vector3.right + GetRandomOffset(tree.scaleIndex); if (tree.treeObject != null) { pool.Push(tree.treeObject); tree.treeObject = null; } tree.isActive = !RoadSystem.CheckCollision(tree.position); } treesLine.position = pos; startGridIndex = (startGridIndex + 1) % gridDepth; } }
public RoadSystem(LevelGeneratorParameters parameters, ForestBase forest) { instance = this; this.forest = forest; character = parameters.character; roadPrefab = parameters.roadPrefab; carPrefab = parameters.carPrefab; inversCarRotation = carPrefab.transform.rotation * Quaternion.AngleAxis(180, Vector3.up); Road.character = character; roadOffsetByY = parameters.roadOffsetByY; roadsRenderingNow = new Queue <Road>(roadsCount); roadsAwaitingRendering = new Queue <Road>(maxLogicRoadsCount); var meshFilter = roadPrefab.GetComponent <MeshFilter>(); Mesh mesh = meshFilter.mesh; //Debug.Log(mesh.bounds); Bounds bounds = mesh.bounds; bounds.extents = new Vector3(1000000, 0, 5); mesh.bounds = bounds; unusedRoads = new Queue <RoadObject>(roadsCount); for (int i = 0; i < roadsCount; i++) { var gameObject = GameObject.Instantiate(roadPrefab, Vector3.zero, Quaternion.identity); gameObject.SetActive(true); var renderer = gameObject.GetComponent <Renderer>(); renderer.enabled = true; unusedRoads.Enqueue(new RoadObject(gameObject.transform, renderer)); } usedRoads = new Queue <RoadObject>(roadsCount); int carsCount = 8; unusedCars = new Queue <Road.Car>(carsCount); for (int i = 0; i < carsCount; i++) { unusedCars.Enqueue(new Road.Car(GameObject.Instantiate( carPrefab, Vector3.zero, carPrefab.transform.rotation).GetComponent <Rigidbody>())); } }
protected override void ForestMoveZ(int sdi) { if (character.position.z - grid[sdi].position.z > 30) { var treesLine = grid[sdi]; treesLine.gridLeftIndex = 0; treesLine.gridRightIndex = gridWidth - 1; lastFirstTreeId += treesLine.GetTreesCount(); treesLine.firstTreeId = lastFirstTreeId; int indexOfEnd = (sdi + gridDepth - 1) % gridDepth; var endTreesLine = grid[indexOfEnd]; treesLine.uniqueLineId = endTreesLine.uniqueLineId + 1; treesLine.treesSpacing = spacingController.GetSpacingByUniqueTreesLineId(treesLine.uniqueLineId); Vector3 pos = endTreesLine.position + (endTreesLine.treesSpacing + treesLine.treesSpacing) * 0.5f * groundForward; treesLine.position = pos; float startTreePos = pos.x - (gridWidth / 2) * treesLine.treesSpacing; uint firstTreeLocalId = treesLine.GetLocalTreeId(startTreePos); pos.x = StaticTreesLine.lineLeft + firstTreeLocalId * treesLine.treesSpacing; for (int x = 0; x < gridWidth; x++) { var tree = treesLine.trees[x]; //tree.scaleIndex recalculated in GetRandomOffset tree.rotationIndex = (int)(3.99f * Random.value); pos.x += treesLine.treesSpacing; tree.position = pos; tree.position += GetRandomOffset(treesLine, tree); if (tree.treeObject != null) { pool.Push(tree.treeObject); tree.treeObject = null; } tree.isActive = !RoadSystem.CheckCollision(tree.position); //tree.debugObject.transform.position = tree.position; } startGridIndex = (startGridIndex + 1) % gridDepth; //Debug.Log("Line spacing " + treesLine.treesSpacing + " pos " + treesLine.position); } }