Skip to content

Latest commit

 

History

History
256 lines (218 loc) · 11.3 KB

README-RU.md

File metadata and controls

256 lines (218 loc) · 11.3 KB

image

Version License

Unity-DebugX

Readme Languages:

Русский

English

中文

Многофункциональная, расширяемая и производительная утилита рисования Gizmos для Unity. Работает как в редакторе так и в сборке, а рисовать можно как в OnDrawGizmos так и в Update. Поддерживается HDRP, URP и BRP, но в BRP не поддерживается отрисовка в OnDrawGizmos.

Синтаксис:

DebugX.Draw(duration, color).*Gizmo Function*(...);

image


Оглавление


Установка

Семантика версионирования - Открыть

Unity-Package

Поддерживается установка в виде Unity-модуля, достаточно скопировать Git-URL в PackageManager или в Packages/manifest.json. Скопируйте этот Git-URL для установки актуальной рабочей версии:

https://github.com/DCFApixels/Unity-DebugX

作为源代码

Пакет так же может быть напрямую скопирован в папку проекта.


Базовый API

Общий синтаксис рисования заготовленных Gizmo:

DebugX.Draw(duration, color).*Gizmo Function*(...);

Среди заготовленных Gizmo есть разные вариации примитивов, линий, точек и текст. Пример некоторых Gizmo:

// Рисует обычную линию аналогично Debug.DrawLine(...).
// Показываться линия будет в течении секунды и красного цвета.
DebugX.Draw(1, Color.red).Line(startPoint, endPoint);
// Рисует куб, но всего один кадр и желтого цвета.
DebugX.Draw(Color.yellow).Cube(center, rotation, size);
// Рисует сферу.
DebugX.Draw(Color.yellow).Cube(center, radius);
// Рисует точку, точка имеет screen space размер. 
DebugX.Draw(Color.yellow).Dot(startPoint, endPoint);
// Рисует текст. Текст так же может показываться в течении заданного времени.
DebugX.Draw(1, Color.red).Text(center, text);
// Для расширенной настройки отображения используется DebugXTextSettings.
DebugX.Draw(Color.yellow).Text(center, text, DebugXTextSettings.Default.SetBackgroundColor(Color.black));

На случай если не хватает заготовленных примитивов есть методы для рисования кастомных меша и материала:

//Рисования любого меша lit материалом. Без GPU instancing. 
DebugX.Draw(...).Mesh(mesh, pos, rot, sc);
//UnlitMesh - меш с unlit материалом
//WireMesh - меш с wireframe материалом
//Рисования статического меша lit материалом. В режиме GPU instancing. 
DebugX.Draw(...).Mesh<IStaticMesh>(pos, rot, sc);
//UnlitMesh<IStaticMesh> - меш с unlit материалом
//WireMesh<IStaticMesh> - меш с wireframe материалом
//Рисования статического меша статическим материалом. В режиме GPU instancing. 
DebugX.Draw(...).Mesh<IStaticMesh, IStaticMat>(pos, rot, sc);

Для оптимизации отрисовки используются статические данные:

// Статический меш. Обязателен для отрисовки с GPU instancing. 
public struct SomeMesh : IStaticMesh
{
    public Mesh GetMesh() => StaticStorage.SomeMesh;
}
// Статический материал. 
public struct SomeMesh : IStaticMesh
{
    // Контроль порядка выполнения отрисовки. 
    public int GetExecuteOrder() => 100;
    public Mesh GetMaterial() => StaticStorage.SomeMaterial;
} 

В примере StaticStorage это условная реализация статического хранилища ассетов. Так как в Unity статические данные нельзя заполнять через инспектор, решение этой проблемы описано в главе Загрузка статических ассетов.


Настройки

Окно настроек "Tools -> DebugX -> Settings":

image


Расширение API

Самый простой вариант это создание метода расширения который комбинирует заготовленные гизмо, например:

public static class SomeGizmoExtensions
{
    public static DebugX.DrawHandler Distance(this DebugX.DrawHandler self, Vector3 start, Vector3 end)
    {
        // Рисуем линию.
        self.Line(start, end);
        // Рисуем текст посреди линии который показывает длину линии.
        self.Text(Vector3.Lerp(start, end, 0.5f), Vector3.Distance(start, end), DebugXTextSettings.Default.SetAnchor(TextAnchor.UpperCenter));
        // для поддержки Method Chaining синтаксиса.
        return self;
    }
}

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

Расширенная реализация Gizmo, на случай нехватки встроенных методов отрисовки:

public readonly struct SomeGizmo : IGizmo<SomeGizmo>
{
    // Данные. 

    public SomeGizmo(/*...*/)
    {
        // Заполнение данных.
    } 
    
    public IGizmoRenderer<SomeGizmo> RegisterNewRenderer() => new Renderer();
    private class Renderer : IGizmoRenderer<SomeGizmo>
    {
        // Контроль порядка выполнения рендереров. 
        public int ExecuteOrder => 0; //можно использовать default(SomeMat).GetExecutuonOrder();
        // Флаг системе о способе оптимизации.
        // Если метод рисовки или подготовки зависят от текущей камеры, то false,иначе true.
        // Если не уверены то выбирайте false. 
        public bool IsStaticRender => false;

        // Подготовка данных перед рендером, тут можно выполнить дополнительные расчеты или запланировать Job. 
        public void Prepare(Camera camera, GizmosList<SomeGizmo> list) 
        {
            foreach (var item in list)
            {
                //... 
            }
        } 

        // Рендер, тут можно напрямую воспользоваться графическим API или добавить команду в CommandBuffer. 
        public void Render(Camera camera, GizmosList<SomeGizmo> list, CommandBuffer cb)
        {
            foreach (var item in list)
            {
                //... 
            }
        }
    }
}
// Создание метода расширения. 
public static class SomeGizmoExtensions
{
    public static DebugX.DrawHandler SomeGizmo(this DebugX.DrawHandler self, /*...*/) 
    {
        self.Gizmo(new SomeGizmo(/*...*/);
        return self;
    }
}

Загрузка статических ассетов

Для загрузки имеется утилита DebugXUtility.LoadStaticData(...);.

  1. Сначала создаем хранилище для ассетов.
public readonly struct SomeAssets
{
    public readonly Mesh SomeMesh;
    public readonly Material SomeMaterial;
} 
  1. Далее необходимо создать префаб со списком ассетов. Каждый дочерний GameObject префаба рассматривается как один ассет, а его имя должно совпадать с полем в которое будет загружаться ассет. Для загрузки мешей в GameObject необходимо добавить компонент MeshFilter с ссылкой на нужный меш. Для загрузки материала нужен любой компонент унаследованный от Renderer с заданным материалом. Сам префаб должен быть расположен в папке Resources.

image

  1. После подготовки хранилища и префаба-списка можно загружать
SomeAssets assets = DebugXUtility.LoadStaticData(new SomeAssets(), "SomeAssets");
// Готово. 

Пример как с этой утилитой работать можно посмотреть в исходниках в файле DebugXAssets.cs.


Define Symbols

  • DISABLE_DEBUGX_INBUILD - по умолчанию Gizmo будут рисовать в сборке проекта, этот дефайн отключает рисование. Включить или выключить можно так же в окне настроек DebugX.