/*
     * Generates a static scene object line (a sidewalk, a road, a grass block...)
     */
    void GenerateStaticSceneObjectLine(SceneStaticObjectType type)
    {
        float capacity = settings.GameRightBoundary - Constants.PathSizeX;
        int   crosswalkGenerationCapacity = settings.crosswalkDensity;

        while (pointer.x <= capacity)
        {
            // Spawn a crosswalk if the scene object type is road
            if (type == SceneStaticObjectType.Road || type == SceneStaticObjectType.Crosswalk)
            {
                if (crosswalkGenerationCapacity > 0 && Random.value < Constants.ProbabilityMedium && IsInPlayableArea(pointer))
                {
                    type = SceneStaticObjectType.Crosswalk;
                    crosswalkGenerationCapacity -= 1;
                }
                else
                {
                    type = SceneStaticObjectType.Road;
                }
            }

            GenerateStaticSceneObject(type);                                                                                    // Creates new scene object
        }

        // Resets pointer
        pointer.x  = settings.GameLeftBoundary;
        pointer.z += GetSceneObjectZ(type);
    }
    Material GetOffGameAreaMaterial(SceneStaticObjectType type)
    {
        switch (type)
        {
        case SceneStaticObjectType.Sidewalk:
            return(mOffGameAreaSidewalk);

        case SceneStaticObjectType.Grass:
            return(mOffGameAreaGrass);

        default:
            return(mOffGameAreaSidewalk);
        }
    }
    /*
     * Generates a dynamic scene object (a sidewalk, a road, a grass block...)
     */
    GameObject GenerateDynamicSceneObject(SceneStaticObjectType type)
    {
        GameObject prefab = GetGameObjectByType(type);
        GameObject dummy  = Instantiate(prefab) as GameObject;

        dummy.name = prefab.name;
        dummy.transform.position = pointer;
        dummy.transform.parent   = GameObject.Find(settings.sceneObjectsNodeName).transform;                    // Change new object parent

        // changes object material to differentiate game area from off zone
        if (!IsInPlayableArea(pointer))
        {
            dummy.GetComponentInChildren <Renderer>().material = GetOffGameAreaMaterial(type);
        }

        pointer.x += GetSceneObjectX(type);                                                                                                                     // Jumps pointer to next element
        return(dummy);
    }
    /*
     * Translates a scene object type into a game object prefab
     */
    GameObject GetGameObjectByType(SceneStaticObjectType type)
    {
        switch (type)
        {
        case SceneStaticObjectType.Crosswalk:
            return(pfCrosswalk);

        case SceneStaticObjectType.Road:
            return(pfRoad);

        case SceneStaticObjectType.Sidewalk:
            return(pfSidewalk);

        case SceneStaticObjectType.Grass:
            return(pfGrass);

        default:
            return(null);
        }
    }
    float GetSceneObjectX(SceneStaticObjectType type)
    {
        switch (type)
        {
        case SceneStaticObjectType.Crosswalk:
            return(Constants.CrosswalkSizeX);

        case SceneStaticObjectType.Road:
            return(Constants.RoadSizeX);

        case SceneStaticObjectType.Sidewalk:
            return(Constants.PathSizeX);

        case SceneStaticObjectType.Grass:
            return(Constants.PathSizeX);

        default:
            return(0);
        }
    }