Многофункциональная, расширяемая и производительная утилита рисования Gizmos для Unity. Работает как в редакторе так и в билде, а рисовать можно и в Update.
Go to file
2025-02-28 20:06:12 +08:00
Editor polishing 2025-02-24 18:18:49 +08:00
Runtime rework drawgizmo callback 2025-02-28 20:06:09 +08:00
Samples Update DebugXSample_Lines.cs 2025-02-28 20:06:12 +08:00
.gitattributes init 2025-02-22 17:25:54 +08:00
.gitignore init 2025-02-22 17:25:54 +08:00
DebugX.asmdef init 2025-02-22 17:25:54 +08:00
DebugX.asmdef.meta init 2025-02-22 17:25:54 +08:00
Editor.meta init 2025-02-22 17:25:54 +08:00
LICENSE init 2025-02-22 17:25:54 +08:00
LICENSE.meta init 2025-02-22 17:25:54 +08:00
package.json up version to 0.7.5 2025-02-24 18:27:27 +08:00
package.json.meta init 2025-02-22 17:25:54 +08:00
README.md Update README.md 2025-02-25 12:18:11 +08:00
README.md.meta init 2025-02-22 17:25:54 +08:00
Runtime.meta init 2025-02-22 17:25:54 +08:00
Samples.meta init 2025-02-22 17:25:54 +08:00

Unity-DebugX

image

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

Синтаксис:

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

image

Оглавление

Установка

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

Unity-пакет

Поддерживается установка в виде Unity-пакета через добавление в PackageManager или ручного добавления в Packages/manifest.json этого git-URL:

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

В виде исходников

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

API

Синтаксис рисования заготовленных Gizmo:

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

Рисование кастомных меша и материала:

//Рисования любого меша 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;
} 

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

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

Сначала создаем хранилище для ассетов.

public readonly struct SomeAssets
{
    public readonly Mesh SomeMesh;
    public readonly Material SomeMaterial;
} 

Далее необходимо создать префаб со списком ассетов. Каждый дочерний GameObject префаба рассматривается как один ассет, а его имя должно совпадать с полем в которое будет загружаться ассет. Для загрузки мешей в GameObject необходимо добавить компонент MeshFilter с ссылкой на нужный меш. Для загрузки материала нужен любой компонент унаследованный от Renderer с заданным материалом. Сам префаб должен быть расположен в папке Resources.

После подготовки хранилища и префаба-списка можно загружать

SomeAssets assets = DebugXUtility.LoadStaticData(new SomeAssets(), "SomeAssets");
// Готово. 

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

Настройки

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

image

Кастомный Gizmo

Кастомная реализация 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;
    }
}

Define Symbols

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