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