Подгрузка уровней по сети для мобильных приложений

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Подгрузка уровней по сети для мобильных приложений

Сообщение Inessa 13 апр 2013, 20:37

Уважаемые форумчане!

Подскажите, пожалуйста, каким образом можно осуществить подгрузку уровней игры по сети для мобильных приложений?

Я имею в виду то, что мне хотелось бы иметь возможность расширять контент базового инсталл-пака своей игры без необходимости подгрузки пользователем новой версии пака со сборкой игры с дополненными уровнями.

Т.е. базовая версия игры имеет несколько готовых уровней, а для остальных уровней - в меню игры с моего веб-сервера должен будет подгрузиться список с дополнительными уровнями.

А после выбора опции для конкретного дополнительного уровня - с веб-сервера должен подгрузиться выбранный уровень.

Веб-сервер предполагаю организовать в виде веб-службы на С#.NET.

Еще раз повторюсь.

Каким образом можно осуществить такую подгрузку уровней игры по сети для мобильных приложений?

Подскажите, пожалуйста, поконкретней, чтобы можно было разобраться с этим вопросом.

Заранее благодарна за ответы.

С уважением, Инесса
Inessa
UNITрон
 
Сообщения: 160
Зарегистрирован: 13 мар 2013, 11:56

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение newArray 14 апр 2013, 01:38

Только asset bundle - про версия. Бандлы хранятся на хостинге и загружаются по WWW. В бандл можно загнать практически целую сцену. Там просто с дока надо взять скрипт и поместить его в своем проекте, тогда в меню появитсья пункт експортировать бандл(в папку Editor кинуть). И тогда можно сделать бандл из префаба или из целой папки. Ссылки на бандлы брать из базы.
Последний раз редактировалось newArray 14 апр 2013, 03:26, всего редактировалось 1 раз.
newArray
Адепт
 
Сообщения: 1226
Зарегистрирован: 14 фев 2013, 07:03
Откуда: оттуда

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение artk 14 апр 2013, 02:15

Синтаксис:
Используется csharp
using System.IO;
using UnityEditor;
using UnityEngine;

public class GenerateAssetBundles : EditorWindow {
    string[]    LevelPath;
    string      LevelOutputPath = @"E:\temp\BoXing_imj\Assets\BUNDLES\Levels\StandAlone\";
    BuildTarget Level_platform, Level_platform2;

    string      PrefabFolderPath = @"Assets\1\1Export";
    string      PrefabOutputPath = @"E:\temp\BoXing_imj\Assets\BUNDLES\DLC";
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    void OnEnable(){
        LevelPath       = new string[1];
        LevelPath[0]    = @"Assets\game1.unity";
        Level_platform  = BuildTarget.StandaloneWindows;
        Level_platform2 = BuildTarget.StandaloneWindows;
    }
        // Add menu item named "My Window" to the Window menu
        [MenuItem("Window/Creat Asset Bundle")]
        public static void ShowWindow()
        {
       
                //Show existing window instance. If one doesn't exist, make one.
                EditorWindow.GetWindow(typeof(GenerateAssetBundles));
        }
    //-----------------------------------------------------------------
        void OnGUI(){
                GUILayout.Label ("Level bundle", EditorStyles.boldLabel);
                LevelPath[0]    = EditorGUILayout.TextField ("Level path", LevelPath[0]);
        LevelOutputPath = EditorGUILayout.TextField ("Output folder path", LevelOutputPath);
        Level_platform  = (BuildTarget) EditorGUILayout.EnumPopup("Build target:",  Level_platform);
        if(GUILayout.Button ("Creat level bundle")){
            Generator( LevelPath, LevelOutputPath + Path.GetFileName(LevelPath[0])+"3d", Level_platform);
        }
        if(GUILayout.Button ("Creat ALL levels bundle")){
            GeneratingAllLevelBundle(Level_platform);
        }
        EditorGUILayout.Space();

        GUILayout.Label ("Prefab bundle", EditorStyles.boldLabel);
                PrefabFolderPath = EditorGUILayout.TextField ("Folder path", PrefabFolderPath);
        PrefabOutputPath = EditorGUILayout.TextField ("Out Folder path", PrefabOutputPath);
        Level_platform2  = (BuildTarget) EditorGUILayout.EnumPopup("Build target:",  Level_platform2);
        if(GUILayout.Button ("Creat prefab bundle")){
            GeneratorPrefab( PrefabFolderPath, PrefabOutputPath, "*.prefab", Level_platform2);
        }

        EditorGUILayout.Space();
        }

    //------------------------------------------------
    void GeneratingAllLevelBundle(BuildTarget platform){
        string platformBuild = "";
        string[] levels = new string[1];
        string output;
        if(platform == BuildTarget.StandaloneWindows)   platformBuild = @"StandAlone\";
        else
        if(platform == BuildTarget.WebPlayer)           platformBuild = @"WebPlayer\";
        else
        if(platform == BuildTarget.Android)             platformBuild = @"Android\";
        levels[0]=@"Assets\Base.unity";
        output=@"E:\temp\BoXing_imj\Assets\BUNDLES\Levels\"+platformBuild+@"Base.unity3d";
        BuildPipeline.BuildStreamedSceneAssetBundle(levels, output, platform);
        levels[0]=@"Assets\game1.unity";
        output=@"E:\temp\BoXing_imj\Assets\BUNDLES\Levels\"+platformBuild+@"game1.unity3d";
        BuildPipeline.BuildStreamedSceneAssetBundle(levels, output, platform);
        levels[0]=@"Assets\game2.unity";
        output=@"E:\temp\BoXing_imj\Assets\BUNDLES\Levels\"+platformBuild+@"game2.unity3d";
        BuildPipeline.BuildStreamedSceneAssetBundle(levels, output, platform);
    }

    [MenuItem("Assets/Build AssetBundle- Scene")]
    static void Generator(string[] levels, string outputPath, BuildTarget platform) {
        BuildPipeline.BuildStreamedSceneAssetBundle(levels, outputPath, platform);
    }
    [MenuItem("Assets/Build AssetBundle- Image")]
    static void Generator2() {
        string[] levels = new string[1];
        levels[0] = @"Assets/_TestScene.unity";
        BuildPipeline.BuildStreamedSceneAssetBundle(levels, @"Assets/Streamed-TestScene.unity3d", BuildTarget.StandaloneWindows);
    }
    //------------------------------------------------
    [MenuItem("Assets/Generate AssetBundles from Prefabs")]
    static void DoGenerateAssetBundles() {
        GeneratorPrefab("*.prefab");
    }

    [MenuItem("Assets/Generate AssetBundles from Prefabs", true)]
    static bool DoGenerateAssetBundlesValidate() {
        return Directory.Exists(AssetDatabase.GetAssetPath(Selection.activeObject));
    }

    //[MenuItem("Assets/Generate AssetBundles from FBX")]
    //static void DoGenerateAssetBundlesFbx() {
    //    Generator("*.jpg");
    //}

    //[MenuItem("Assets/Generate AssetBundles from FBX", true)]
    //static bool DoGenerateAssetBundlesFbxValidate() {
    //    return Directory.Exists(AssetDatabase.GetAssetPath(Selection.activeObject));
    //}

    static void GeneratorPrefab(string extansion) {
        string srcFolder = AssetDatabase.GetAssetPath(Selection.activeObject);
        string label = "";
        switch(Application.systemLanguage) {
            case SystemLanguage.English:
                label = "Save bundles to directory";
                break;
            case SystemLanguage.Russian:
                label = "Укажите папку для сохранения ресурсов";
                break;
        }
        string dstFolder = EditorUtility.SaveFolderPanel(label, srcFolder, "");
        if(dstFolder == "") return;

        int count = 0;
        foreach(string fname in Directory.GetFiles(srcFolder, extansion, SearchOption.AllDirectories)) {
            string name = Path.GetFileNameWithoutExtension(fname);
            Object obj = AssetDatabase.LoadMainAssetAtPath(fname);
            if(obj != null) {
                Debug.Log("Saving File : " + obj.name);
                BuildPipeline.BuildAssetBundle(obj, null, dstFolder + Path.DirectorySeparatorChar + name + ".unity3d",
                    BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
                count++;
            }
        }
        Debug.Log("Total saved files count : " + count);
    }

    static void GeneratorPrefab(string srcFolder, string dstFolder, string extansion, BuildTarget  platform) {
       
        int count = 0;
        string outFolder = dstFolder + Path.DirectorySeparatorChar;

        if(platform == BuildTarget.StandaloneWindows)   outFolder = dstFolder + Path.DirectorySeparatorChar + @"StandAlone\";
        else
        if(platform == BuildTarget.WebPlayer)           outFolder = dstFolder + Path.DirectorySeparatorChar + @"WebPlayer\";
        else
        if(platform == BuildTarget.Android)             outFolder = dstFolder + Path.DirectorySeparatorChar + @"Android\";
        foreach(string fname in Directory.GetFiles(srcFolder, extansion, SearchOption.AllDirectories)) {
            string name = Path.GetFileNameWithoutExtension(fname);
            Object obj = AssetDatabase.LoadMainAssetAtPath(fname);
            if(obj != null) {
                Debug.Log("Saving File : " + obj.name);
                BuildPipeline.BuildAssetBundle(obj, null, outFolder + name + ".unity3d",
                    BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, platform);
                count++;
            }
        }
        Debug.Log("Total saved files count : " + count);
    }
}

вам нужна конкретно функция BuildPipeline.BuildStreamedSceneAssetBundle
Она делать бандл из сцены.
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение Inessa 14 апр 2013, 08:59

Спасибо за советы.

Меня еще очень волнует вопрос по поводу правильного проектирования веб-сервера для своей игры.

Я прекрасно понимаю, что мне необходимо организовать корректное взаимодействие между серверной и клиентской частью.

Серверную часть я предполагаю создать при помощи запуска веб-сервиса на каком-нибудь хостинге, который поддерживает C#.NET.

1. Какой хороший хостинг Вы можете порекомендовать для размещения веб-сервера для игры под Unity?

Я начала самостоятельно писать свой веб-сервер, но т.к. я начала писать с нуля, то дело движется довольно медленно, т.к. мне приходится, по сути, изобретать велосипед.

2. Подскажите, пожалуйста, какие уже готовые веб-сервера существуют для Unity, чтобы их можно было использовать и запускать как веб-службы где-нибудь на хостинге в Сети, чтобы мне не приходилось изобретать велосипед, а можно было пользоваться уже готовыми инструментами для организации взаимодействия между серверной и клиентской частью игры?
Inessa
UNITрон
 
Сообщения: 160
Зарегистрирован: 13 мар 2013, 11:56

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение JIeo_NEED 15 апр 2013, 07:18

Да хватит уже прикидываться девушкой, дружище! #-o
Аватара пользователя
JIeo_NEED
UNITрон
 
Сообщения: 228
Зарегистрирован: 01 мар 2012, 14:37
Откуда: Владивосток, Приморский край, Россия.
Skype: Develeone
  • Сайт

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение pod4444 15 апр 2013, 07:44

А что за дискриминация по половому признаку? Вы правда думаете, что разработчик игр не может быть девушкой? Уверяю, что к большей части софта на Вашем компьютере прикоснулась девушка-программист. К сведению, девушки потенциально более стрессоустойчивые при рутинной работе, что положительно сказывается при разработке крупных проектов. Хотя девушки все же больше любят не кодить, а рисовать и моделить. В геймдеве много-много художников, моделеров, дизов девушек.
А по теме, к сожалению, мало чем могу помочь, почти не занимался решением подобных задач.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение newArray 15 апр 2013, 07:52

1. Я не много не понимаю как вы будете использовать хостинг для своего сервера. Это ж только VPS получается. Я вот видел бесплатный клауд 128 метров но там поддержка только пары языков - в основноном пхп, но html тоже держит - это разве что компилить под флеш - потому что веб плеер не будет работать у них юнити плеер не установлен http://c9.io/ (питон есть)
2. Готовые решения - самый популярный Photon на нем же посмотрите photon cloud это вообще просто - но у вас будут только клиенты http://www.exitgames.com/ Затем электро сервер http://www.electrotank.com/es5.html
Потом то что сделал человек с этого форума - там сервак наподобие фотона кстати с рускими доками vbprogr - это вот этот его серва описан на форуме (флешебл сервер какой то - тоже есть вариант для теста бесплатно) viewtopic.php?f=5&t=15147 да и то что сделал pod444 - просто пример кода viewtopic.php?f=13&t=10322
А по теме, к сожалению, мало чем могу помочь, почти не занимался решением подобных задач.

это человек пример кода которого я рекомендовал - я не понимаю о чем он говорит
newArray
Адепт
 
Сообщения: 1226
Зарегистрирован: 14 фев 2013, 07:03
Откуда: оттуда

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение pod4444 15 апр 2013, 08:39

Я про стриминг и ассетбандли, они мне пока не были необходимы по жизни. Обычный сервер-клиент, конечно не вызывает у меня проблем, да и необычный не вызовет :DD
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение Inessa 15 апр 2013, 11:59

Да, действительно, дизайн уровней и моделинг объектов нравиться мне несколько больше, чем само программирование.

Постараюсь определиться, какое из предложенных решений мне больше подойдет...
Inessa
UNITрон
 
Сообщения: 160
Зарегистрирован: 13 мар 2013, 11:56

Re: Подгрузка уровней по сети для мобильных приложений

Сообщение kocherovets 19 апр 2013, 01:36

А в iOS можно подгружать уровни или просто сцены со своими скриптами? Фактически хотелось бы миниприложение подгрузить как модуль. А первоначальное приложение использовать как контейнер для этих модулей. Я слышал, что есть какие-то ограничения на загрузку исполняемых файлов в iOS, но точно не знаю как это касается юнити.
kocherovets
UNец
 
Сообщения: 23
Зарегистрирован: 23 фев 2012, 17:43


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 25