1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xianfengkeji-XFGameFramework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
XFGameFramework快速入门.md 24 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 10:46 8f0d1c2

XFGameFramework: быстрое начало работы

Функциональное описание

XFGameFramework — это основанная на MVC игровая платформа для Unity3D. Она предоставляет функции управления представлениями, пользовательским интерфейсом, аудио, событиями, HTTP-запросами, таймерами, пулом объектов и адаптацией пользовательского интерфейса!

Особенности платформы

Платформа состоит из модулей. В одном проекте может быть один или несколько модулей. Обычно в проекте достаточно создать один модуль. Однако в некоторых особых проектах, таких как проекты с большим количеством игр, можно создать несколько модулей. Например, в таких проектах обычно есть игровой зал, где есть много игр. Пользователи могут скачать соответствующую игру, а затем запустить её. В этом случае мы можем создать основной модуль в качестве базового модуля, который отвечает за реализацию зала и некоторых общих функций. Затем мы создаём отдельный модуль для каждой дочерней игры, чтобы реализовать соответствующую логику. Как создать модуль? Пожалуйста, ознакомьтесь с дальнейшим содержанием!

Создание модуля

  1. Щёлкните правой кнопкой мыши в окне проекта и выберите Create/XFKT/XFGameFramework/CreateModule (см. рисунок ниже).

  2. После того как вы щёлкнете CreateModule, появится следующее окно:

Название Описание
ModuleName Имя модуля
ProjectName Имя текущего используемого модуля ресурсов
BaseModule Является ли модуль базовым модулем. Если есть только один модуль, установите значение True или False. Если имеется несколько модулей, то модули, которые не могут быть закрыты или являются общими функциями, должны быть установлены как базовые модули. Модули, которые могут быть закрыты или завершены, должны быть установлены как не базовые модули, т. е. false
DefaultStartUpScene Сцена запуска модуля по умолчанию. Если она не установлена, оставьте её пустой
  1. Введите соответствующую информацию после заполнения полей и нажмите кнопку «Создать». Это автоматически создаст следующие файлы:

  2. Содержимое 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);
   }
}
  1. Создайте модуль ресурсов:

Создание подробного руководства по модулю ресурсов

На этом создание модуля завершено. Далее нам нужно запустить модуль. Пожалуйста, продолжайте читать!

Запуск модуля

1. Создайте класс входа в игру и прикрепите его к игровому объекту:

2. Добавьте код запуска модуля:


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

3. Добавьте логику подготовки ресурсов:


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);**
       }
   } 

} }


Так модуль запуска логики завершается.

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

Использование модели

1. Создание и добавление

public class UserModel : Model
{
   public string UserName; 
}
public class MainModule : Module
{ 
   // 当模块启动时触发
   public override void OnStart()
   {
       // 创建Model
       UserModel userModel = new UserModel();
       // 添加
       AddModel(userModel);
   }
}

2. Запрос

public class MainModule : Module
{ 
   // 当模块启动时触发
   public override void OnStart()
   {
       // 如果有多条数据,请指定Id查询
       UserModel model = GetModel<UserModel>();
   }
}

3. Удаление

public class MainModule : Module
{ 
   // 当模块启动时触发
   public override void OnStart()
   {
       UserModel model = GetModel<UserModel>();
       // 移除数据
       RemoveModel(model);
   }
}

Подробнее о методах работы с моделью можно узнать в документации.

Использование View

1. Создание View

Создаём TestView и прикрепляем к нему скрипт TestView. SpriteRenderer используется для отображения изображения.

2. Загрузка View

public class MainModule : Module
{ 
   // 当模块启动时触发
   public override void OnStart()
   {
       // 加载View(здесь TestView — это префаб и скрипт с именем TestView, поэтому можно опустить имя ресурса, если они не совпадают, то нужно указать соответствующее имя ресурса (имя префаба))
       TestView view = LoadView<TestView>();
   }
}

После запуска получаем следующий результат:

3. Создание Panel

4. Загрузка Panel

public class MainModule : Module
{ 
   // 当模块启动时触发
   public override void OnStart()
   {
       // 加载Panel(здесь TestPanel — это префаб и скрипт с именем TestPanel, поэтому можно опустить имя ресурса, если они не совпадают, то нужно указать соответствующее имя ресурса (имя префаба))
       TestPanel panel = LoadPanel<TestPanel>();
   }
}

Результат после запуска:

О других способах использования Panel можно узнать из документации.

Примечание: параметры Canvas можно изменить в (Assets/Resources/XFGameFramework/Canvas.prefab).

Примечание: если в пользовательском интерфейсе необходимо использовать эффекты частиц, рекомендуется использовать плагин UIParticles.

Использование Controller

1. Создание Controller

public class TestController : Controller
{
   public void Test1() {
       Debug.Log("TestController Test1");
   }
}

2. Загрузка Controller

public class TestPanel : Panel
{
   protected override void Awake()
   {
       base.Awake();
       // 加载TestController и вызов метода Test1
       Module.LoadController<TestController>().Test1();
   } 
}

3. Удаление Controller

public class TestPanel : Panel
{
   protected override void Awake()
   {
       base.Awake();
       // удаление TestController
       Module.RemoveController<TestController>();
   } 
} **Предварительная загрузка конфигурационных таблиц**

Предварительная загрузка конфигурационных таблиц

Система событий

Система событий

Воспроизведение аудио

  1. Регистрация AudioController Перед воспроизведением аудио необходимо зарегистрировать AudioController.
public class MainModule : Module
{ 
   // Когда модуль запускается, он срабатывает
   public override void OnStart()
   {
       // Регистрация фоновой музыки AudioController, поскольку фоновая музыка должна воспроизводиться постоянно, поэтому установите для цикла значение True, 0 представляет 2D-эффект
       AudioPlayer.RegisterAudioController("Music", true, 0); 
       // Зарегистрируйте AudioController звукового эффекта, если это звуковой эффект кнопки, вы можете использовать этот AudioController для воспроизведения
       AudioPlayer.RegisterAudioController("Sound",false, 0);
   }
}
  1. Воспроизведение
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 аудиофайла назначается не через код, а вручную перетаскивается в инспекторе, эта ситуация не повлияет!

Потому что ручное перетаскивание для назначения создаст зависимость, ресурсы не будут удалены напрямую!

  1. Без кода для воспроизведения В предыдущих шагах мы представили использование AudioPlayer для воспроизведения аудио, но требуется написать код. Если в повседневной разработке нам нужно воспроизводить звуковые эффекты при нажатии кнопок, то добавление кода для воспроизведения аудио в каждом событии обратного вызова кнопки слишком хлопотно. Мы можем сделать следующее:

Вы можете прикрепить компонент AudioPlayer и заполнить соответствующие параметры, а затем вызвать метод AudioPlayer.Play() в событии нажатия кнопки, чтобы избежать написания кода для воспроизведения звука. Если кнопок слишком много, и вы беспокоитесь о том, что добавление компонентов к каждой кнопке может привести к созданию слишком большого количества объектов, вы можете создать общий объект AudioPlayer в интерфейсе и использовать его для воспроизведения всех кнопок!

  1. Изменение настроек звуковых эффектов, таких как громкость и отключение звука
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;  // Отключить звук
   } 
}
  1. Воспроизведение 3D звуковых эффектов

При разработке игр часто требуется воспроизводить 3D звуковые эффекты, и в этом случае вам потребуется несколько источников звука (AudioSource). Как синхронизировать громкость этих источников звука и отключить ли звук?

Просто прикрепите AudioPlayer к игровому объекту, содержащему источники звука, следующим образом:

В этом примере AudioPlayer синхронизирует настройки звука с Sound, а также использует AudioSource игрового объекта для воспроизведения звука! Вы можете настроить AudioSource, чтобы достичь желаемого эффекта!

Подробное использование AudioPlayer

Http-запрос сети

Использование Http-запроса сети

Таймер

Использование таймера

Менеджер событий обновления

Управление событиями обновления

LogUtil — инструмент ведения журнала

LogUtil — ведение журнала

Адаптация пользовательского интерфейса

Адаптация фона

Граничная адаптация

XFGameFrameworkEvents

Внутренние события фреймворка, пожалуйста, обратитесь к документации XFGameFramework API.

Примечание: если вам нужно изменить разрешение в игре, после завершения изменения разрешения инициируйте событие: XFGameFrameworkEvents.ON_SCREEN_RESOLUTION_CHANGE. Если у вас есть вопросы или вы что-то упустили, пожалуйста, своевременно свяжитесь с администратором группы в QQ: 946441033.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xianfengkeji-XFGameFramework.git
git@api.gitlife.ru:oschina-mirror/xianfengkeji-XFGameFramework.git
oschina-mirror
xianfengkeji-XFGameFramework
xianfengkeji-XFGameFramework
master