Пример #1
0
    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++;
        }
    }
Пример #2
0
 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);
        }
Пример #4
0
 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;
        }
Пример #6
0
    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);
        }