public void spawnTrees(Fairway fairway) { for (int i = 0; i < treeOptions.numberOfTrees; i++) { var pos = MathfEx.RandomPointOnTerrain(terrain); if (fairway.isPointInsideOuterHull(pos)) { continue; } var randPrefab = treeOptions.randomTreePrefab; Quaternion rot = Quaternion.identity * Quaternion.Euler(0, Random.value * 360, 0); var obj = GameObject.Instantiate(randPrefab, pos, rot); obj.transform.localScale = Vector3.one * (1f + Random.Range(-treeOptions.treeScaleVariance, treeOptions.treeScaleVariance)); } }
/// <summary> /// Generates a random golf course /// </summary> private void GenerateCourse() { //Save the seed RNGStateManager.Push(seed); //Generate a new fairway fairway = new Fairway(transform, fairwayOptions); //Generate sandtraps this.GenerateSandtraps(); //Generate the terrain terrainGenerator = new TerrainGenerator(terrain, splatOptions, treeOptions); terrainGenerator.setMaps(sandtraps, fairway, terrain); //Move the flag up a bit fairway.flagObject.transform.Translate(Vector3.up * sandtrapOptions.sinkDepth * terrain.terrainData.size.y); //Now spawn the trees terrainGenerator.spawnTrees(fairway); //Return it RNGStateManager.Pop(); }
public void GenerateMap() { map = new Map(); map.mapSizeX = 13; map.mapSizeY = 10; map.fields = new SortedDictionary <int, SortedDictionary <int, Field> >(); // First row only water. int y = 0; SortedDictionary <int, Field> row = new SortedDictionary <int, Field>(); for (int x = 0; x <= 12; x++) { row[x] = new Water(x, y); } map.fields[y] = row; // Second row ship track fairway. Track goes from right to left. y = 1; row = new SortedDictionary <int, Field>(); // First fairway (left side) doesn't have a next track. row[0] = new Fairway(0, y, null); for (int x = 1; x <= 12; x++) { row[x] = new Fairway(x, y, (Fairway)row[x - 1]); } map.fields[y] = row; // 12 train rails going left. y = 2; row = new SortedDictionary <int, Field>(); // First train rail (left side) doesn't have a next track. row[0] = new TrainRails(0, y, null, TrainRails.Axis.HORIZONTAL); for (int x = 1; x <= 11; x++) { // Ninth is the dock. if (x == 9) { row[x] = new Dock(x, y, (TrainRails)row[x - 1], TrainRails.Axis.HORIZONTAL); } else { row[x] = new TrainRails(x, y, (TrainRails)row[x - 1], TrainRails.Axis.HORIZONTAL); } } map.fields[y] = row; // Next row is only one track downwards. y = 3; row = new SortedDictionary <int, Field>(); row[11] = new TrainRails(11, y, (TrainRails)map.fields[y - 1][11], TrainRails.Axis.VERTICAL); map.fields[y] = row; // Rows 4, 5, 6, 7 and 8 are a bit weird because of switches. Going to have to work a bit different now... for (y = 4; y <= 9; y++) { map.fields[y] = new SortedDictionary <int, Field>(); } map.fields[4][11] = new TrainRails(11, 4, (TrainRails)map.fields[3][11], TrainRails.Axis.VERTICAL); map.fields[5][11] = new TrainRails(11, 5, (TrainRails)map.fields[4][11], TrainRails.Axis.HORIZONTAL); map.fields[5][10] = new TrainRails(10, 5, (TrainRails)map.fields[5][11], TrainRails.Axis.HORIZONTAL); TrainRails upperRails = new TrainRails(9, 4, null, TrainRails.Axis.HORIZONTAL); TrainRails lowerRails = new TrainRails(9, 6, null, TrainRails.Axis.HORIZONTAL); Switch trainSwitch = new Switch(9, 5, (TrainRails)map.fields[5][10], Switch.Direction.LEFT, upperRails, lowerRails); upperRails.nextTrack = trainSwitch; lowerRails.nextTrack = trainSwitch; map.fields[4][9] = upperRails; map.fields[6][9] = lowerRails; map.fields[5][9] = trainSwitch; map.fields[4][8] = new TrainRails(8, 4, (TrainRails)map.fields[4][9], TrainRails.Axis.HORIZONTAL); map.fields[4][7] = new TrainRails(7, 4, (TrainRails)map.fields[4][8], TrainRails.Axis.HORIZONTAL); map.fields[4][6] = new TrainRails(6, 4, (TrainRails)map.fields[4][7], TrainRails.Axis.HORIZONTAL); upperRails = new TrainRails(5, 4, (TrainRails)map.fields[4][6], TrainRails.Axis.HORIZONTAL); lowerRails = new TrainRails(5, 6, null, TrainRails.Axis.HORIZONTAL); trainSwitch = new Switch(5, 5, null, Switch.Direction.RIGHT, upperRails, lowerRails); map.fields[4][5] = upperRails; map.fields[6][5] = lowerRails; map.fields[5][5] = trainSwitch; map.fields[5][4] = new TrainRails(4, 5, trainSwitch, TrainRails.Axis.HORIZONTAL); upperRails = new TrainRails(3, 4, null, TrainRails.Axis.HORIZONTAL); lowerRails = new TrainRails(3, 6, null, TrainRails.Axis.HORIZONTAL); trainSwitch = new Switch(3, 5, (TrainRails)map.fields[5][4], Switch.Direction.LEFT, upperRails, lowerRails); upperRails.nextTrack = trainSwitch; lowerRails.nextTrack = trainSwitch; map.fields[4][3] = upperRails; map.fields[6][3] = lowerRails; map.fields[5][3] = trainSwitch; map.fields[4][2] = new TrainRails(2, 4, upperRails, TrainRails.Axis.HORIZONTAL); map.fields[4][1] = new TrainRails(1, 4, (TrainRails)map.fields[4][2], TrainRails.Axis.HORIZONTAL); map.fields[4][0] = new Warehouse(0, 4, 'A'); map.fields[6][2] = new TrainRails(2, 6, lowerRails, TrainRails.Axis.HORIZONTAL); map.fields[6][1] = new TrainRails(1, 6, (TrainRails)map.fields[4][2], TrainRails.Axis.HORIZONTAL); map.fields[6][0] = new Warehouse(0, 6, 'B'); upperRails = new TrainRails(8, 6, (TrainRails)map.fields[6][9], TrainRails.Axis.HORIZONTAL); lowerRails = new TrainRails(8, 8, null, TrainRails.Axis.HORIZONTAL); trainSwitch = new Switch(8, 7, null, Switch.Direction.RIGHT, upperRails, lowerRails); map.fields[6][8] = upperRails; map.fields[8][8] = lowerRails; map.fields[7][8] = trainSwitch; map.fields[7][7] = new TrainRails(7, 7, trainSwitch, TrainRails.Axis.HORIZONTAL); upperRails = new TrainRails(6, 6, null, TrainRails.Axis.HORIZONTAL); lowerRails = new TrainRails(6, 8, null, TrainRails.Axis.HORIZONTAL); trainSwitch = new Switch(6, 7, (TrainRails)map.fields[7][7], Switch.Direction.LEFT, upperRails, lowerRails); upperRails.nextTrack = trainSwitch; lowerRails.nextTrack = trainSwitch; map.fields[6][6] = upperRails; map.fields[8][6] = lowerRails; map.fields[7][6] = trainSwitch; TrainRails rails = (TrainRails)map.fields[6][5]; rails.nextTrack = upperRails; map.fields[8][5] = new TrainRails(5, 8, lowerRails, TrainRails.Axis.HORIZONTAL); map.fields[8][4] = new TrainRails(4, 8, (TrainRails)map.fields[8][5], TrainRails.Axis.HORIZONTAL); map.fields[8][3] = new TrainRails(3, 8, (TrainRails)map.fields[8][4], TrainRails.Axis.HORIZONTAL); map.fields[8][2] = new TrainRails(2, 8, (TrainRails)map.fields[8][3], TrainRails.Axis.HORIZONTAL); map.fields[8][1] = new TrainRails(1, 8, (TrainRails)map.fields[8][2], TrainRails.Axis.HORIZONTAL); map.fields[8][0] = new Warehouse(0, 8, 'C'); // Parking map.fields[9][1] = new Parking(1, 9, null, TrainRails.Axis.HORIZONTAL); map.fields[9][2] = new Parking(2, 9, (TrainRails)map.fields[9][1], TrainRails.Axis.HORIZONTAL); map.fields[9][3] = new Parking(3, 9, (TrainRails)map.fields[9][2], TrainRails.Axis.HORIZONTAL); map.fields[9][4] = new Parking(4, 9, (TrainRails)map.fields[9][3], TrainRails.Axis.HORIZONTAL); map.fields[9][5] = new Parking(5, 9, (TrainRails)map.fields[9][4], TrainRails.Axis.HORIZONTAL); map.fields[9][6] = new Parking(6, 9, (TrainRails)map.fields[9][5], TrainRails.Axis.HORIZONTAL); map.fields[9][7] = new Parking(7, 9, (TrainRails)map.fields[9][6], TrainRails.Axis.HORIZONTAL); map.fields[9][8] = new Parking(8, 9, (TrainRails)map.fields[9][7], TrainRails.Axis.HORIZONTAL); map.fields[9][9] = new TrainRails(9, 9, (TrainRails)map.fields[9][8], TrainRails.Axis.HORIZONTAL); map.fields[9][10] = new TrainRails(10, 9, (TrainRails)map.fields[9][9], TrainRails.Axis.HORIZONTAL); map.fields[9][11] = new TrainRails(11, 9, (TrainRails)map.fields[9][10], TrainRails.Axis.VERTICAL); map.fields[8][11] = new TrainRails(11, 8, (TrainRails)map.fields[9][11], TrainRails.Axis.VERTICAL); map.fields[8][10] = new TrainRails(10, 8, (TrainRails)map.fields[8][11], TrainRails.Axis.HORIZONTAL); map.fields[8][9] = new TrainRails(9, 8, (TrainRails)map.fields[8][10], TrainRails.Axis.HORIZONTAL); rails = (TrainRails)map.fields[8][8]; rails.nextTrack = (TrainRails)map.fields[8][9]; }
public void setMaps(List <Sandtrap> sandtraps, Fairway fairway, Terrain terrain) { //Alias for terrain data TerrainData tdata = terrain.terrainData; //Get terrain detail size int terrainDetailSize = tdata.alphamapWidth; //Not the best way to deal with this, but it is being done before //the game starts.. so not that bad //Outside = 0 (rough) //Inside = 1 (green) //Inside, last node = 2 (green hole) //Inside, sandtrap = 3 (sandtrap) //Array for height map var heightMap = tdata.GetHeights(0, 0, tdata.heightmapResolution, tdata.heightmapResolution); //Array for detail maps, get the first layer var detailLayer = new int[tdata.detailWidth, tdata.detailHeight]; //Get the maps float[,,] maps = new float[tdata.alphamapWidth, tdata.alphamapHeight, 4]; for (int y = 0; y < terrainDetailSize; y++) { //Get normalised y var normY = (y / (float)terrain.terrainData.alphamapHeight); for (int x = 0; x < terrainDetailSize; x++) { //Get normalised x var normX = (x / (float)terrain.terrainData.alphamapWidth); //Calculate world pos var nx = terrain.transform.position.x + normX * Terrain.activeTerrain.terrainData.size.x; var ny = terrain.transform.position.z + normY * Terrain.activeTerrain.terrainData.size.z; var point = new Vector3(nx, 0, ny); //Running through each (x, y) in the detail map //.. heightMap[y, x] = sandtraps[0].options.sinkDepth; //Is it inside a sandtrap? if (sandtraps.Any(s => s.isPointInside(point))) { maps[y, x, 3] = 1.0f; //Make it a bit lower heightMap[y, x] -= sandtraps[0].options.sinkDepth; } //Is the point inside the hole? else if (fairway.isPointInsideHole(point)) { maps[y, x, 2] = 1.0f; } //Otherwise, is it inside the fairway? else if (fairway.isPointInside(point)) { maps[y, x, 1] = 1.0f; } //It's not in the hole, fairway or sandtraps else { maps[y, x, 0] = 1.0f; if (!fairway.isPointInsideOuterHull(point)) { detailLayer[y, x] = splatOptions.densityPerPixel; } // else // detailLayer[y, x] = 1; } } } //Set the detail layer map tdata.SetDetailLayer(0, 0, 0, detailLayer); //Set the heightmap tdata.SetHeights(0, 0, heightMap); //And set the alphamaps tdata.SetAlphamaps(0, 0, maps); terrain.Flush(); }