~3 мин чтения

2D в Unity 6 — Box2D v3 и Hybrid Scenes

2D-pipeline, Box2D v3 в Unity 6.3, multi-threaded physics, Hybrid 2D/3D Scenes.

Эта энциклопедия про 3D, но Unity 6.3 LTS принёс важные 2D-новинки, о которых стоит знать — особенно если у вас гибридный проект (3D мир + 2D HUD/effects) или вы прототипируете 2D-фичу внутри 3D-проекта.

2D-pipeline Unity вкратце

Unity исторически имеет отдельный 2D-стек, который параллелен 3D:

  • Sprite Renderer — рисует sprite вместо Mesh.
  • Tilemap — массивный паттерн сеточных тайлов с rule tiles.
  • 2D Animation — riggable 2D-скелеты (для cutout-анимации).
  • 2D Light (в URP) — освещение для sprite-сцен с Normal Map поддержкой.
  • Box2D для физики (отдельно от PhysX 3D).

Все 2D-сущности живут на тех же GameObject с Transform (не RectTransform — RectTransform только для UGUI).

Веб

Canvas 2D или PixiJS — sprite-based rendering. С физикой — Matter.js / Box2D в WASM.

Unity

Sprite Renderer + Rigidbody2D + Collider2D. Параллельный к 3D стек с Box2D-движком под капотом.

Box2D v3 в Unity 6.3 — почему это важно

В Unity 6.3 LTS произошла главная новинка 2D-стека за годы: переход с Box2D v2 на Box2D v3.

Что меняется:

  • Multi-threaded simulation — 2D-физика теперь использует все ядра. До этого Box2D v2 был чисто single-threaded.
  • До 10× ускорение на сценах с тысячами тел (по бенчмаркам Unity).
  • Новый Continuous Collision Detection — точнее ловит быстро движущиеся объекты, без проскоков сквозь тонкие стены.
  • Joints API обновлён — некоторые имена методов поменялись, миграция нужна для существующих проектов.

Включается автоматически в новых проектах 6.3+. Существующие — через Edit → Project Settings → Physics 2D → Physics Engine: Box2D V3.

Существующий 2D-проект — есть нюансы

Box2D v3 не 100% совместим с v2: некоторые collision callback порядки изменились, joint API скорректирован, behavior penetration resolution может отличаться. Если ваш 2D-gameplay tuned под v2, после миграции проверьте: прыжки, столкновения, joint-цепочки. Unity предоставляет migration guide.

Hybrid 2D/3D Scenes

Ещё одна 6.3-новинка: Hybrid 2D/3D Scenes — официальная поддержка смеси 2D и 3D-объектов в одной сцене с правильной отрисовкой и сортировкой.

Раньше: если нужен 2.5D-проект (например, sprite-персонаж на 3D-фоне), приходилось вручную настраивать sorting layers, billboarding и shader-passes.

Теперь:

  • 2D Renderer Feature (URP) умеет принимать 3D-объекты в сцену и правильно их сортировать относительно sprite’ов.
  • Pixel Perfect Camera работает с 3D-фоном.
  • Light2D и Light3D могут сосуществовать.

Применение:

  • 2.5D-платформер — sprite-character в 3D-локации (как Octopath Traveler, Sea of Stars).
  • 2D HUD над 3D-миром — Worldspace UI остаётся возможным, но Hybrid даёт больше контроля над sorting.
  • Карты-миниатюры — 2D-overlay рендерит схематичный 3D в реальном времени.

Минимальный 2D-пример

Контроллер 2D-персонажа:

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D), typeof(BoxCollider2D))]
public class Player2D : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpForce = 8f;
    [SerializeField] private LayerMask groundMask;
    [SerializeField] private Transform groundCheck;

    private Rigidbody2D _rb;
    private bool _isGrounded;

    private void Awake() => _rb = GetComponent<Rigidbody2D>();

    private void FixedUpdate() {
        // Box2D v3: тот же API, но multithreaded под капотом
        _isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.1f, groundMask);

        float horizontal = Input.GetAxis("Horizontal");
        _rb.linearVelocity = new Vector2(horizontal * speed, _rb.linearVelocity.y);
        // Заметьте: linearVelocity и для Rigidbody2D (раньше — velocity)

        if (_isGrounded && Input.GetButtonDown("Jump")) {
            _rb.linearVelocity = new Vector2(_rb.linearVelocity.x, jumpForce);
        }
    }
}

Кардинальной разницы с 3D-кодом не видно — API параллельный (Rigidbody2DRigidbody, Collider2DCollider, Physics2DPhysics). Box2D v3 работает прозрачно — никаких изменений в коде не требуется.

2D в гибридных 3D-проектах

Типовые сценарии, где 2D-фичи попадают в “3D-проект”:

  1. Particle Effects через Sprite Sheets — на старом железе дешевле, чем VFX Graph.
  2. Map UI — поверх 3D-сцены отдельный Camera с 2D Renderer.
  3. Cutscene flashbacks в стиле комикса — переключение на 2D-камеру + sprite-сцена.
  4. Inventory grid — Tilemap для отрисовки grid-ячеек.

Для гибридных сцен:

GameScene
├── World3D (Node3D, layer = "3D")
│   ├── Player
│   └── Environment
├── World2D (Node3D, layer = "2D")
│   ├── BackgroundSprite (SpriteRenderer)
│   └── ParticlesOverlay
└── HybridCamera (Camera with both layers)

Конфигурируйте Culling Mask и Sorting Group на сцене.

Когда 2D — правильный выбор

  • Гарантированно 2D-игра — лучше использовать выделенный 2D Renderer, оптимизированный.
  • Pixel-art стилизация — 2D-пайплайн поддерживает Pixel Perfect Camera, custom shaders для pixelation.
  • Performance-критичные сцены с тысячами объектов — Box2D v3 быстрее PhysX.

Когда не стоит “забирать в 2D”

  • 3D-геометрия со sprite-фасадом — лучше использовать 3D-quad с Unlit shader, чтобы держать всё в одном pipeline.
  • Real-time lighting effects на sprite в 3D-сцене — может конфликтовать с GI / Adaptive Probe Volumes. Тестируйте.