예제 #1
0
        /// <summary>
        /// Is called when this component is added to a GameObject.
        /// Sets up some default areas.
        /// </summary>
        void Reset()
        {
            // Set up some default areas
            areaDatas = new AreaData[4];
            int transitionCount = System.Enum.GetNames(typeof(Direction)).Length;

            for (int i = 0; i < areaDatas.Length; i++)
            {
                int         minTransition   = Random.Range(1, transitionCount);
                int         transitionStart = Random.Range(minTransition, transitionCount);
                Direction[] transitions     = new Direction[transitionCount - transitionStart];

                int counter = 0;
                for (int j = transitionStart; j < transitionCount; j++)
                {
                    transitions[counter] = (Direction)j;
                    counter++;
                }

                areaDatas[i] = new AreaData(AreaData.GetTransitionList(transitions), transitions);
            }
        }
예제 #2
0
        void Generate()
        {
            generatedAreas = new List <AreaData>();

            // Select a random area to start with.
            int      randomAreaIndex = Random.Range(0, areaDatas.Length);
            AreaData randomArea      = areaDatas[randomAreaIndex];

            // Create a copy of the AreaData.
            AreaData newArea = new AreaData(randomArea.name, randomArea.availableTransitions);

            for (int i = 0; i < iterations; i++)
            {
                // Iterate through this area's transitions and add connections
                // however, we'll also need to check for existing areas blocking the way or that should be connected
                for (int j = 0; j < newArea.availableTransitions.Length; j++)
                {
                    Direction transition = newArea.availableTransitions[j];

                    if (transition == Direction.None)
                    {
                        continue;
                    }

                    Direction opposite = transition.GetOpposite();

                    Coordinates adjacentAreaCoordinate = newArea.coordinates.GetAdjacentCoordinate(transition);
                    AreaData    adjacentArea           = GetGeneratedAreaByCoordinate(adjacentAreaCoordinate);

                    // if there's an area in the way check if it has an available transition opposite of this transition.
                    if (adjacentArea != null)
                    {
                        if (!adjacentArea.GetIsTransitionAvailable(opposite))
                        {
                            // The adjecent area cannot be transitioned to from this area.
                            adjacentArea = null;

                            // We should actually now flag this direction as no longer viable.
                            newArea.availableTransitions[j] = Direction.None;
                        }
                    }
                    // otherwise create a new area
                    else
                    {
                        adjacentArea = CreateRandomAreaWithTransition(opposite);

                        if (adjacentArea == null)
                        {
                            Debug.LogErrorFormat(
                                "Could not GetRandomAreaWithTransition({0}). " +
                                "Please ensure areaDatas has available transitions on all sides",
                                opposite);
                        }
                        else
                        {
                            adjacentArea.coordinates = adjacentAreaCoordinate;
                            generatedAreas.Add(adjacentArea);
                        }
                    }

                    if (adjacentArea != null)
                    {
                        // assign the connection between the two areas.
                        newArea.SetTransitionUsed(transition, adjacentArea, opposite);
                        adjacentArea.SetTransitionUsed(opposite, newArea, transition);
                    }
                }

                // check to see if we assigned any transitions to this new area, if so add it to the generatedAreas list.
                if (newArea.GetTransitionCount() > 0)
                {
                    if (!generatedAreas.Contains(newArea))
                    {
                        generatedAreas.Add(newArea);
                    }
                }
                // otherwise did something go wrong?
                else
                {
                    Debug.LogWarning("No transitions assigned to area: " + newArea.ToString());
                }

                // Now we need to get the next area to work on.
                newArea = null;
                foreach (var item in generatedAreas)
                {
                    if (item.HasAnyAvailableTransition())
                    {
                        newArea = item;
                        break;
                    }
                }

                if (newArea == null)
                {
                    Debug.Log("Can't find any generated areas with avilable transitions. Quitting.");
                    break;
                }
            }
        }