XFGameFramework: быстрое начало работы
XFGameFramework — это основанная на MVC игровая платформа для Unity3D. Она предоставляет функции управления представлениями, пользовательским интерфейсом, аудио, событиями, HTTP-запросами, таймерами, пулом объектов и адаптацией пользовательского интерфейса!
Платформа состоит из модулей. В одном проекте может быть один или несколько модулей. Обычно в проекте достаточно создать один модуль. Однако в некоторых особых проектах, таких как проекты с большим количеством игр, можно создать несколько модулей. Например, в таких проектах обычно есть игровой зал, где есть много игр. Пользователи могут скачать соответствующую игру, а затем запустить её. В этом случае мы можем создать основной модуль в качестве базового модуля, который отвечает за реализацию зала и некоторых общих функций. Затем мы создаём отдельный модуль для каждой дочерней игры, чтобы реализовать соответствующую логику. Как создать модуль? Пожалуйста, ознакомьтесь с дальнейшим содержанием!
Щёлкните правой кнопкой мыши в окне проекта и выберите Create/XFKT/XFGameFramework/CreateModule (см. рисунок ниже).
После того как вы щёлкнете CreateModule, появится следующее окно:
Название | Описание |
---|---|
ModuleName | Имя модуля |
ProjectName | Имя текущего используемого модуля ресурсов |
BaseModule | Является ли модуль базовым модулем. Если есть только один модуль, установите значение True или False. Если имеется несколько модулей, то модули, которые не могут быть закрыты или являются общими функциями, должны быть установлены как базовые модули. Модули, которые могут быть закрыты или завершены, должны быть установлены как не базовые модули, т. е. false |
DefaultStartUpScene | Сцена запуска модуля по умолчанию. Если она не установлена, оставьте её пустой |
Введите соответствующую информацию после заполнения полей и нажмите кнопку «Создать». Это автоматически создаст следующие файлы:
Содержимое MainModule также можно изменить в сценарии, например, ProjectName, BaseModule, DefaultStartUpScene и т. д.
using UnityEngine; public class MainModule : Module { // Текущий модуль использует имя модуля ресурсов public override string ProjectName => "MainModule"; // Является ли это базовым модулем, базовый модуль не может быть закрыт, если модуль может быть закрыт, пожалуйста, установите его в false public override bool BaseModule => true; // Имя сцены запуска по умолчанию, если сцена запуска не требуется, сохраните её по умолчанию public override string DefaultStartUpScene => string.Empty; // Необходимо предварительно загрузить таблицы конфигурации (поддерживается только json) key: имя файла json value: тип public override Dictionary<string, Type> PreloadConfigTables => base.PreloadConfigTables; // Срабатывает при запуске модуля public override void OnStart() { UnityEngine.Debug.Log("OnStart:"+ModuleName); } }
Создание подробного руководства по модулю ресурсов
На этом создание модуля завершено. Далее нам нужно запустить модуль. Пожалуйста, продолжайте читать!
using UnityEngine; public class Main : MonoBehaviour { // Start is called before the first frame update IEnumerator Start() { // Запустить MainModule StartUpModuleRequest request = ModuleManager.StartUpModule<MainModule>(); yield return request; if (!string.IsNullOrEmpty(request.error)) Debug.LogErrorFormat("Ошибка запуска модуля:{0}",request.error); } }
В этой логике завершается запуск модуля, но перед запуском модуля нам необходимо подготовить ресурсы, необходимые для текущего модуля. Конкретные операции следующие:
Дополнительные функции ModuleManager
using UnityEngine; public class Main : MonoBehaviour { // Start is called before the first frame update IEnumerator Start() { // Подготовить ресурсы MainModule yield return StartCoroutine(ReadyMainModuleRes()); // Запуск MainModule StartUpModuleRequest request = ModuleManager.StartUpModule<MainModule>(); yield return request; if (!string.IsNullOrEmpty(request.error)) Debug.LogErrorFormat("Ошибка запуска модуля:{0}",request.error); } /// <summary> /// Подготовить ресурсы MainModule /// </summary> /// <returns></returns> IEnumerator ReadyMainModuleRes() { // Бесконечный цикл: если подготовка ресурсов не удалась, повторите попытку, если она прошла успешно, выйдите из цикла while (true) { // Проверить ресурсы CheckResUpdateRequest request_check = AssetBundleManager.CheckResUpdate("MainModule"); yield return request_check; if (string.IsNullOrEmpty(request_check.error)) { // Проверка ресурсов прошла успешно if (request_check.result.updateType == UpdateType.DontNeedUpdate) break; // Если необходимо обновить, здесь можно дать некоторые подсказки в соответствии с типом обновления, // например: обычно пользователи будут получать уведомления перед обновлением, сколько ресурсов необходимо загрузить, содержание обновления и т.д. TODO // Если нет необходимости давать подсказки, нет необходимости выполнять какую-либо обработку } else { // Ошибка проверки ресурсов, после выдачи соответствующего сообщения снова проверьте ресурсы TODO continue; } // Подготовьте ресурсы ReadyResRequest request = AssetBundleManager.ReadyRes(request_check.result);
Примечание: в тексте запроса присутствуют фрагменты кода на языке C#, однако они не содержат синтаксических ошибок и представляют собой законченные фрагменты, поэтому были оставлены без изменений. Вот перевод текста на русский язык:
while (!request.isDone)
{ **yield return null;** // 可以在这里更新UI界面 TODO **switch (request.ExecutionType)** { **case ExecutionType.Download:** // 正在下载资源 **break;** **case ExecutionType.Decompression:** // 解压资源 **break;** **case ExecutionType.Verify:** // 校验资源(资源下载完成后,需要校验文件是否损坏) **break;** **case ExecutionType.ExtractLocal:** // 释放资源(把资源从内置目录复制到数据目录) **break**; } } **if (string.IsNullOrEmpty(request.error))** { // 资源准备成功跳出循环 **break;** } **else {** // 资源准备失败,给出相应提示,然后再次准备 TODO **yield return new WaitForSeconds(2);** } }} }
Так модуль запуска логики завершается.
public class UserModel : Model { public string UserName; }
public class MainModule : Module { // 当模块启动时触发 public override void OnStart() { // 创建Model UserModel userModel = new UserModel(); // 添加 AddModel(userModel); } }
public class MainModule : Module { // 当模块启动时触发 public override void OnStart() { // 如果有多条数据,请指定Id查询 UserModel model = GetModel<UserModel>(); } }
public class MainModule : Module { // 当模块启动时触发 public override void OnStart() { UserModel model = GetModel<UserModel>(); // 移除数据 RemoveModel(model); } }
Подробнее о методах работы с моделью можно узнать в документации.
Создаём TestView и прикрепляем к нему скрипт TestView. SpriteRenderer используется для отображения изображения.
public class MainModule : Module { // 当模块启动时触发 public override void OnStart() { // 加载View(здесь TestView — это префаб и скрипт с именем TestView, поэтому можно опустить имя ресурса, если они не совпадают, то нужно указать соответствующее имя ресурса (имя префаба)) TestView view = LoadView<TestView>(); } }
После запуска получаем следующий результат:
public class MainModule : Module { // 当模块启动时触发 public override void OnStart() { // 加载Panel(здесь TestPanel — это префаб и скрипт с именем TestPanel, поэтому можно опустить имя ресурса, если они не совпадают, то нужно указать соответствующее имя ресурса (имя префаба)) TestPanel panel = LoadPanel<TestPanel>(); } }
Результат после запуска:
О других способах использования Panel можно узнать из документации.
Примечание: параметры Canvas можно изменить в (Assets/Resources/XFGameFramework/Canvas.prefab).
Примечание: если в пользовательском интерфейсе необходимо использовать эффекты частиц, рекомендуется использовать плагин UIParticles.
public class TestController : Controller { public void Test1() { Debug.Log("TestController Test1"); } }
public class TestPanel : Panel { protected override void Awake() { base.Awake(); // 加载TestController и вызов метода Test1 Module.LoadController<TestController>().Test1(); } }
public class TestPanel : Panel { protected override void Awake() { base.Awake(); // удаление TestController Module.RemoveController<TestController>(); } } **Предварительная загрузка конфигурационных таблиц**
Предварительная загрузка конфигурационных таблиц
Система событий
Воспроизведение аудио
public class MainModule : Module { // Когда модуль запускается, он срабатывает public override void OnStart() { // Регистрация фоновой музыки AudioController, поскольку фоновая музыка должна воспроизводиться постоянно, поэтому установите для цикла значение True, 0 представляет 2D-эффект AudioPlayer.RegisterAudioController("Music", true, 0); // Зарегистрируйте AudioController звукового эффекта, если это звуковой эффект кнопки, вы можете использовать этот AudioController для воспроизведения AudioPlayer.RegisterAudioController("Sound",false, 0); } }
public class MainModule : Module { // Когда модуль запускается, он срабатывает public override void OnStart() { // Загрузить аудиоклип click AudioClip clip = AssetBundleManager.LoadAsset<AudioClip>("MainModule","click"); // Используйте ранее зарегистрированный Sound для воспроизведения AudioPlayer.Play("Sound", clip, true); } }
Примечание: при использовании AudioPlayer для воспроизведения звуковых эффектов не следует использовать другие методы воспроизведения, например:
public class TestPanel : Panel { protected override void Awake() { base.Awake(); // Способ 1: использование AudioPlayer для воспроизведения музыки AudioClip clip = AssetBundleManager.LoadAsset<AudioClip>("MainModule", "click"); AudioPlayer.Play("Sound", clip, true); // Метод 2: Использование пользовательского AudioSource для воспроизведения AudioSource source = transform.GetComponent<AudioSource>(); source.clip = clip; source.Play(); } }
Рекомендуется избегать одновременного использования этих двух методов, поскольку воспроизведение аудио с помощью AudioPlayer будет ссылаться на счётчик, и если аудио не используется, оно будет удалено в соответствующее время. В этом случае использование второго метода для воспроизведения аудио не приведёт к нормальному воспроизведению аудио.
Однако, если AudioSource аудиофайла назначается не через код, а вручную перетаскивается в инспекторе, эта ситуация не повлияет!
Потому что ручное перетаскивание для назначения создаст зависимость, ресурсы не будут удалены напрямую!
Вы можете прикрепить компонент AudioPlayer и заполнить соответствующие параметры, а затем вызвать метод AudioPlayer.Play() в событии нажатия кнопки, чтобы избежать написания кода для воспроизведения звука. Если кнопок слишком много, и вы беспокоитесь о том, что добавление компонентов к каждой кнопке может привести к созданию слишком большого количества объектов, вы можете создать общий объект AudioPlayer в интерфейсе и использовать его для воспроизведения всех кнопок!
public class TestPanel : Panel { protected override void Awake() { base.Awake(); // Например, мы хотим изменить громкость фоновой музыки AudioController music = AudioPlayer.GetAuidoController("Music"); // Сначала найдите Music AudioController и измените его через Controller music.Volume = 1.0f; // Изменить громкость (здесь изменение является постоянным сохранением, и данные не будут потеряны из-за закрытия игры) music.Mute = false; // Отключить звук } }
При разработке игр часто требуется воспроизводить 3D звуковые эффекты, и в этом случае вам потребуется несколько источников звука (AudioSource). Как синхронизировать громкость этих источников звука и отключить ли звук?
Просто прикрепите AudioPlayer к игровому объекту, содержащему источники звука, следующим образом:
В этом примере AudioPlayer синхронизирует настройки звука с Sound, а также использует AudioSource игрового объекта для воспроизведения звука! Вы можете настроить AudioSource, чтобы достичь желаемого эффекта!
Подробное использование AudioPlayer
Http-запрос сети
Использование Http-запроса сети
Таймер
Менеджер событий обновления
Управление событиями обновления
LogUtil — инструмент ведения журнала
Адаптация пользовательского интерфейса
XFGameFrameworkEvents
Внутренние события фреймворка, пожалуйста, обратитесь к документации XFGameFramework API.
Примечание: если вам нужно изменить разрешение в игре, после завершения изменения разрешения инициируйте событие: XFGameFrameworkEvents.ON_SCREEN_RESOLUTION_CHANGE. Если у вас есть вопросы или вы что-то упустили, пожалуйста, своевременно свяжитесь с администратором группы в QQ: 946441033.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )