void SpawnNewRoad() { if (numberOfElements < NumberOfElements) { Debug.Log("Spawn road"); int roadType = (int)lastRoad.StreetEnd; int rnd = Random.Range(0, RoadTypes[roadType].PossibleRoads.Length); RoadPart newPart = Instantiate(RoadTypes[roadType].PossibleRoads[rnd]); roadParts.Add(newPart); activeRoadParts.Add(newPart); numberOfElements++; newPart.transform.parent = this.transform; newPart.transform.position = new Vector3(lastRoad.transform.position.x + lastRoad.Length / 2 + newPart.Length / 2, 0, 0); lastRoad = roadParts[roadParts.Count - 1]; newPart.Init(); } else if (NumberOfElements == numberOfElements) { int roadType = (int)lastRoad.StreetEnd; RoadPart newPart = Instantiate(EndParts[roadType]); roadParts.Add(newPart); activeRoadParts.Add(newPart); numberOfElements++; newPart.transform.parent = this.transform; newPart.transform.position = new Vector3(lastRoad.transform.position.x + lastRoad.Length / 2 + newPart.Length / 2, 0, 0); lastRoad = roadParts[roadParts.Count - 1]; numberOfElements++; } }
void ClearRoad() { Debug.Log("Clear Road"); roadParts[0].Clear(); roadParts.Remove(roadParts[0]); fistRoad = roadParts[0]; }
private void AddRoadPart(RoadPart roadPart) { while (road.RoadParts.Count >= roadSettings.MaxLength) { RoadPart roadPartForDestroy = road.RoadParts.Dequeue(); roadPartForDestroy.Destroy(); } road.RoadParts.Enqueue(roadPart); }
void Awake() { for (int i = 0; i < StartParts.Length; i++) { if (StartParts[i] != null) { roadParts.Add(StartParts[i]); } } fistRoad = roadParts[0]; lastRoad = roadParts[roadParts.Count - 1]; }
public void CreateStartingPad() { List <Vector2[]> startingPadRoadPartsTilesPlacements = new List <Vector2[]> { new[] { new Vector2(-1.0f, -1.0f), new Vector2(0.0f, -1.0f), new Vector2(1.0f, -1.0f) }, new[] { new Vector2(-1.0f, 0.0f), new Vector2(0.0f, 0.0f), new Vector2(1.0f, 0.0f) }, new[] { new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f), new Vector2(1.0f, 1.0f) } }; foreach (Vector2[] roadPartTilesPlacement in startingPadRoadPartsTilesPlacements) { Transform roadPartRoot = new GameObject("RoadPart(StartingPad)").transform; roadPartRoot.parent = road.transform; roadPartRoot.transform.localPosition = Vector3.zero; roadPartRoot.transform.localRotation = Quaternion.identity; RoadPart newRoadPart = roadPartFactory.Create(); newRoadPart.Root = roadPartRoot; foreach (Vector2 tilePosition in roadPartTilesPlacement) { Tile newTile = tileFactory.Create(); newTile.transform.parent = roadPartRoot; newTile.transform.rotation = road.transform.rotation; newTile.transform.localPosition = tilePosition.ToV3FromX0Y(); newRoadPart.Tiles.Add(newTile); } AddRoadPart(newRoadPart); } lastRoadPartPosition = new Vector2(0.0f, 1.5f + roadBuilderSettingsGroups.GetObject().StartPointShift); lastAbsoluteMoveDirection = Road.AbsoluteMoveDirection.Forward; }
private void SetRoadType(RoadPart road, int roadIndex) { var roadType = RoadPart.RoadType.normal; var buildingType = BuildingController.BuildingType.none; if (roadIndex % parkingEveryNth == 0) { int parkingIndex = roadIndex / parkingEveryNth; if (parkingIndex % 2 == 0) { roadType = RoadPart.RoadType.parkingOnRight; } else { roadType = RoadPart.RoadType.parkingOnLeft; } #region Pick building float buildingRng = (buildingsNoise.GetWhiteNoiseInt(parkingIndex, 199) + 1) / 2; buildingType = BuildingController.BuildingType.none; float lowestPossibleOdd = float.MaxValue; if (buildingOdds != null && buildingOdds.Length == System.Enum.GetNames(typeof(BuildingController.BuildingType)).Length) { for (int i = 0; i < buildingOdds.Length; i++) { if (buildingRng <= buildingOdds[i] && buildingOdds[i] < lowestPossibleOdd) { buildingType = (BuildingController.BuildingType)i; lowestPossibleOdd = buildingOdds[i]; } } } else { Debug.LogError("Repeater(" + gameObject.name + "): Building odds array length should equal to BuildingController.BuildingType length"); } #endregion } road.SetRoadType(roadType); road.SetBuilding(buildingType); }
public RoadPart CreateNextRoadPart(bool isSwitchDirection, bool needCrystal) { Road.AbsoluteMoveDirection newAbsoluteMoveDirection = lastAbsoluteMoveDirection; Road.RelativeMoveDirection newRelativeMoveDirection = Road.RelativeMoveDirection.Forward; if (isSwitchDirection) { switch (lastAbsoluteMoveDirection) { case Road.AbsoluteMoveDirection.Forward: newAbsoluteMoveDirection = Road.AbsoluteMoveDirection.Right; newRelativeMoveDirection = Road.RelativeMoveDirection.Right; break; case Road.AbsoluteMoveDirection.Right: newAbsoluteMoveDirection = Road.AbsoluteMoveDirection.Forward; newRelativeMoveDirection = Road.RelativeMoveDirection.Left; break; default: throw new ArgumentOutOfRangeException(); } } Vector2 newRoadPartPositionShift; Quaternion newRoadPartLocalRotationQuaternion; switch (newAbsoluteMoveDirection) { case Road.AbsoluteMoveDirection.Forward: newRoadPartPositionShift = Vector2.up; newRoadPartLocalRotationQuaternion = Quaternion.identity; break; case Road.AbsoluteMoveDirection.Right: newRoadPartPositionShift = Vector2.right; newRoadPartLocalRotationQuaternion = Quaternion.Euler(0.0f, 90.0f, 0.0f); break; default: throw new ArgumentOutOfRangeException(); } Vector2 newRoadPartLocalPosition = lastRoadPartPosition + newRoadPartPositionShift; RoadPart newRoadPart = roadPartFactory.Create(); Vector2[] tilesPlacement = roadBuilderSettingsGroups.GetTilesPlacement(newRelativeMoveDirection); Transform roadPartRoot = new GameObject($"RoadPart({newRelativeMoveDirection})").transform; roadPartRoot.parent = road.transform; roadPartRoot.transform.localPosition = newRoadPartLocalPosition.ToV3FromX0Y(); roadPartRoot.transform.localRotation = newRoadPartLocalRotationQuaternion; newRoadPart.Root = roadPartRoot; foreach (Vector2 tilePosition in tilesPlacement) { Tile newTile = tileFactory.Create(); newTile.transform.parent = roadPartRoot; newTile.transform.localPosition = tilePosition.ToV3FromX0Y(); newTile.transform.rotation = road.transform.rotation; newRoadPart.Tiles.Add(newTile); } lastRoadPartPosition = newRoadPartLocalPosition; lastAbsoluteMoveDirection = newAbsoluteMoveDirection; if (needCrystal) { Crystal.Crystal newCrystal = crystalFactory.Create(); newCrystal.transform.parent = roadPartRoot; newCrystal.transform.localPosition = Vector3.forward * roadBuilderSettingsGroups.GetObject().CrystalPositionShift; newCrystal.transform.rotation = road.transform.rotation; newCrystal.transform.localScale = Vector3.one; newRoadPart.Crystal = newCrystal; } AddRoadPart(newRoadPart); return(newRoadPart); }