public static IEnumerable<NetInfo> Build(this INetInfoBuilder builder)
        {
            var newNetInfos = new List<NetInfo>();


            // Ground version--------------------------------------------------
            var mainInfo = builder.BuildVersion(NetInfoVersion.Ground, newNetInfos);
            mainInfo.m_UIPriority = builder.Priority;

            if (!builder.CodeName.IsNullOrWhiteSpace() && !builder.ThumbnailsPath.IsNullOrWhiteSpace())
            {
                var thumbnails = AssetManager.instance.GetThumbnails(builder.CodeName, builder.ThumbnailsPath);
                mainInfo.m_Atlas = thumbnails;
                mainInfo.m_Thumbnail = thumbnails.name;
            }

            if (!builder.CodeName.IsNullOrWhiteSpace() && !builder.InfoTooltipPath.IsNullOrWhiteSpace())
            {
                var infoTips = AssetManager.instance.GetInfoTooltip(builder.CodeName, builder.InfoTooltipPath);
                mainInfo.m_InfoTooltipAtlas = infoTips;
                mainInfo.m_InfoTooltipThumbnail = infoTips.name;
            }


            // Other versions -------------------------------------------------
            var mainInfoAI = mainInfo.GetComponent<RoadAI>();

            mainInfoAI.m_elevatedInfo = builder.BuildVersion(NetInfoVersion.Elevated, newNetInfos);
            mainInfoAI.m_bridgeInfo = builder.BuildVersion(NetInfoVersion.Bridge, newNetInfos);
            mainInfoAI.m_tunnelInfo = builder.BuildVersion(NetInfoVersion.Tunnel, newNetInfos);
            mainInfoAI.m_slopeInfo = builder.BuildVersion(NetInfoVersion.Slope, newNetInfos);

            return newNetInfos;
        }
        public static IEnumerable<NetInfo> Build(this INetInfoBuilder builder)
        {
            var newNetInfos = new List<NetInfo>();


            // Ground version--------------------------------------------------
            var mainInfo = builder.BuildVersion(NetInfoVersion.Ground, null, newNetInfos);
            mainInfo.m_UIPriority = builder.Priority;

            if (!builder.CodeName.IsNullOrWhiteSpace() && !builder.ThumbnailsPath.IsNullOrWhiteSpace())
            {
                var thumbnails = ToolsUnity.LoadThumbnails(builder.CodeName, builder.ThumbnailsPath);
                mainInfo.m_Atlas = thumbnails;
                mainInfo.m_Thumbnail = thumbnails.name;
            }

            if (!builder.CodeName.IsNullOrWhiteSpace() && !builder.InfoTooltipPath.IsNullOrWhiteSpace())
            {
                var infoTips = ToolsUnity.LoadInfoTooltip(builder.CodeName, builder.InfoTooltipPath);
                mainInfo.m_InfoTooltipAtlas = infoTips;
                mainInfo.m_InfoTooltipThumbnail = infoTips.name;
            }


            // Other versions -------------------------------------------------
            var mainInfoAI = mainInfo.GetComponent<RoadAI>();

            builder.BuildVersion(NetInfoVersion.Elevated, info => mainInfoAI.m_elevatedInfo = info, newNetInfos);
            builder.BuildVersion(NetInfoVersion.Bridge, info => mainInfoAI.m_bridgeInfo = info, newNetInfos);
            builder.BuildVersion(NetInfoVersion.Tunnel, info => mainInfoAI.m_tunnelInfo = info, newNetInfos);
            builder.BuildVersion(NetInfoVersion.Slope, info => mainInfoAI.m_slopeInfo = info, newNetInfos);

            Debug.Log(string.Format("NExt: Initialized {0}", builder.Name));

            return newNetInfos;
        }
        public static IEnumerable<NetInfo> Build(this INetInfoBuilder builder, ICollection<Action> lateOperations)
        {
            // Ground versions
            var groundInfo = builder.BuildVersion(NetInfoVersion.Ground, lateOperations);
            var groundGrassInfo = builder.BuildVersion(NetInfoVersion.GroundGrass, lateOperations);
            var groundTreesInfo = builder.BuildVersion(NetInfoVersion.GroundTrees, lateOperations);

            var groundInfos = new[] {groundInfo, groundGrassInfo, groundTreesInfo};
            groundInfos = groundInfos.Where(gi => gi != null).ToArray();

            if (!groundInfos.Any())
            {
                yield break;
            }

            // Other versions
            var elevatedInfo = builder.BuildVersion(NetInfoVersion.Elevated, lateOperations);
            var bridgeInfo = builder.BuildVersion(NetInfoVersion.Bridge, lateOperations);
            var tunnelInfo = builder.BuildVersion(NetInfoVersion.Tunnel, lateOperations);
            var slopeInfo = builder.BuildVersion(NetInfoVersion.Slope, lateOperations);

            // Setup MenuItems
            if (builder is IMenuItemBuilder)
            {
                if (groundInfos.Count() > 1)
                {
                    throw new Exception("Multiple netinfo menuitem cannot be build with the IMenuItemBuilder, use the IMenuItemBuildersProvider");
                }

                var mib = builder as IMenuItemBuilder;
                groundInfos[0].SetMenuItemConfig(mib);
            }
            else if (builder is IMenuItemBuildersProvider)
            {
                var mibp = builder as IMenuItemBuildersProvider;
                var mibs = mibp.MenuItemBuilders.ToDictionary(x => x.Name, StringComparer.InvariantCultureIgnoreCase);

                foreach (var mainInfo in groundInfos)
                {
                    if (mibs.ContainsKey(mainInfo.name))
                    {
                        var mib = mibs[mainInfo.name];
                        mainInfo.SetMenuItemConfig(mib);
                    }
                }
            }
            else
            {
                throw new Exception("Cannot set the menuitem on netinfo, either implement IMenuItemBuilder or IMenuItemBuildersProvider");
            }

            // Setup AI
            foreach (var mainInfo in groundInfos)
            {
                var ai = mainInfo.GetComponent<RoadAI>();

                ai.m_elevatedInfo = elevatedInfo;
                ai.m_bridgeInfo = bridgeInfo;
                ai.m_tunnelInfo = tunnelInfo;
                ai.m_slopeInfo = slopeInfo;
            }

            // Returning
            foreach (var mainInfo in groundInfos)
            {
                yield return mainInfo;
            }
            if (elevatedInfo != null) yield return elevatedInfo;
            if (bridgeInfo != null) yield return bridgeInfo;
            if (tunnelInfo != null) yield return tunnelInfo;
            if (slopeInfo != null) yield return slopeInfo;
        }