Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Використання вікон перегляду
Вступ
Подумайте про Viewport як про екран, на який проектується гра. Щоб побачити гру, нам потрібна поверхня, на якій можна її намалювати. Ця поверхня є кореневим вікном перегляду.
SubViewports — це свого роду вікно перегляду, яке можна додати до сцени, щоб мати кілька поверхонь для малювання. Коли ми малюємо до SubViewport, ми називаємо це метою візуалізації. Ми можемо отримати доступ до вмісту мети візуалізації, отримавши доступ до відповідної texture. Використовуючи SubViewport як ціль візуалізації, ми можемо або рендерити кілька сцен одночасно, або ми можемо рендерити до ViewportTexture, яка застосовується до об’єкта в сцені, наприклад, динамічного скайбокса.
SubViewports мають різні варіанти використання, зокрема:
Візуалізація 3D-об’єктів у 2D-грі
Візуалізація 2D-елементів у 3D-грі
Відтворення динамічних текстур
Створення процедурних текстур під час виконання
Візуалізація кількох камер в одній сцені
Спільним для всіх цих варіантів використання є те, що вам надається можливість малювати об’єкти на текстурі, ніби це інший екран, а потім ви можете вибрати, що робити з отриманою текстурою.
Ще один вид вікон перегляду в Godot — Windows. Вони дозволяють проектувати свій вміст на вікно. Хоча кореневий вікно перегляду є вікном, вони менш гнучкі. Якщо ви хочете використовувати текстуру Viewport, ви будете працювати з SubViewports більшу частину часу.
Введення
Viewports також відповідають за доставку правильно налаштованих і масштабованих вхідних подій до своїх дочірніх вузлів. За замовчуванням SubViewports не отримують автоматично вхідні дані, якщо тільки вони не отримують їх від свого прямого SubViewportContainer батьківського вузла. У цьому випадку введення можна вимкнути за допомогою властивості Disable Input.
Для отримання додаткової інформації про те, як Godot обробляє вхідні дані, прочитайте Навчальний посібник з подій введення.
Listener
Godot підтримує 3D-звук (у 2D- і 3D-вузлах). Більше про це можна знайти в Посібнику з аудіопотоків. Щоб цей тип звуку було чутно, Viewport потрібно ввімкнути як слухач (для 2D або 3D). Якщо ви використовуєте SubViewport для відображення вашого World3D або World2D, не забудьте ввімкнути це!
Камери (2D і 3D)
Якщо використовується Camera3D або Camera2D, він завжди відображатиметься на найближчому батьківському Viewport (прямуючи до кореня). Наприклад, у такій ієрархії:
CameraA відображатиметься в кореневому Viewport і буде малювати MeshA. CameraB буде захоплено SubViewport разом із MeshB. Незважаючи на те, що MeshB знаходиться в ієрархії сцени, він все одно не буде намальовано до кореневого вікна перегляду. Подібним чином, MeshA не буде видно з SubViewport, оскільки SubViewports захоплюють лише вузли, розташовані під ними в ієрархії.
Може бути лише одна активна камера на Viewport, тому, якщо їх більше однієї, переконайтеся, що для потрібної камери встановлено властивість current, або зробіть її поточну камеру за телефоном:
camera.make_current()
camera.MakeCurrent();
За замовчуванням камери візуалізують усі об’єкти у своєму світі. У 3D камери можуть використовувати свою властивість cull_mask у поєднанні з властивістю VisualInstance3D layer, щоб обмежити, які об’єкти відображаються.
Масштаб і розтяжка
SubViewports мають властивість size, яка представляє розмір SubViewport у пікселях. Для SubViewports, які є нащадками SubViewportContainers, ці значення замінюються, але для всіх інших це встановлює їх роздільну здатність.
Також можна масштабувати 2D-вміст і зробити роздільну здатність SubViewport відмінною від зазначеної у розмірі, викликавши:
sub_viewport.set_size_2d_override(Vector2i(width, height)) # Custom size for 2D.
sub_viewport.set_size_2d_override_stretch(true) # Enable stretch for custom size.
subViewport.Size2DOverride = new Vector2I(width, height); // Custom size for 2D.
subViewport.Size2DOverrideStretch = true; // Enable stretch for custom size.
Щоб отримати інформацію про масштабування та розтягування за допомогою кореневого вікна перегляду, відвідайте Навчальний посібник із кількох роздільних здатностей
Світи
Для 3D Viewport міститиме World3D. По суті, це всесвіт, який поєднує фізику та рендеринг. Вузли на основі Node3D реєструватимуться за допомогою World3D найближчого вікна перегляду. За замовчуванням, щойно створені вікна перегляду не містять World3D, але використовують те саме, що й їхнє батьківське вікно перегляду. Кореневе вікно перегляду завжди містить World3D, який об’єкти відображаються за замовчуванням.
World3D можна встановити у Viewport за допомогою властивості World 3D, яка відокремить усі дочірні вузли цього Viewport і не дозволить їм взаємодіяти з батьківським Viewport World3D. Це особливо корисно в ситуаціях, коли, наприклад, ви можете показати окремого персонажа в 3D, накладеного на гру (як у StarCraft).
Як помічник у ситуаціях, коли ви хочете створити Viewports, які відображають окремі об’єкти і не хочуть створювати World3D, Viewport має можливість використовувати його Own World3D. Це корисно, коли ви хочете створити 3D-символи чи об’єкти World2D.
Для 2D кожен Viewport завжди містить свій World2D. У більшості випадків цього достатньо, але якщо є бажання надати спільний доступ до них, це можна зробити, встановивши world_2d у вікні перегляду через код.
Для прикладу того, як це працює, перегляньте демонстраційні проекти «3D у 2D та 2D у 3D відповідно.
Захоплення
Можна запитати захоплення вмісту Viewport. Для кореневого вікна перегляду це фактично знімок екрана. Це робиться за допомогою такого коду:
# Retrieve the captured Image using get_image().
var img = get_viewport().get_texture().get_image()
# Convert Image to ImageTexture.
var tex = ImageTexture.create_from_image(img)
# Set sprite texture.
sprite.texture = tex
// Retrieve the captured Image using get_image().
var img = GetViewport().GetTexture().GetImage();
// Convert Image to ImageTexture.
var tex = ImageTexture.CreateFromImage(img);
// Set sprite texture.
sprite.Texture = tex;
Але якщо ви використовуєте це в _ready() або з першого кадру ініціалізації Viewport, ви отримаєте порожню текстуру, оскільки нема чого отримати як текстуру. Ви можете впоратися з цим за допомогою (наприклад):
# Wait until the frame has finished before getting the texture.
await RenderingServer.frame_post_draw
# You can get the image after this.
// Wait until the frame has finished before getting the texture.
await ToSignal(RenderingServer.Singleton, RenderingServer.SignalName.FramePostDraw);
// You can get the image after this.
Контейнер поля перегляду
Якщо SubViewport є дочірнім елементом SubViewportContainer, він стане активним і відображатиме все, що містить. Макет виглядає так:
SubViewport повністю покриватиме область свого батьківського SubViewportContainer повністю, якщо для Stretch встановлено значення true у SubViewportContainer.
Примітка
Розмір SubViewportContainer не може бути меншим за розмір SubViewport.
Рендеринг
Через те, що Viewport є входом до іншої поверхні візуалізації, він відкриває кілька властивостей візуалізації, які можуть відрізнятися від параметрів проекту. Ви можете використовувати інший рівень MSAA для кожного вікна перегляду. Поведінка за замовчуванням – Вимкнено.
Якщо ви знаєте, що Viewport буде використовуватися лише для 2D, ви можете Вимкнути 3D. Тоді Godot обмежить спосіб малювання вікна перегляду. Вимкнення 3D відбувається трохи швидше та використовує менше пам’яті порівняно з увімкненим 3D. Варто вимкнути 3D, якщо ваше вікно перегляду не відображає нічого у 3D.
Примітка
Якщо вам потрібно відображати 3D-тіні у вікні перегляду, переконайтеся, що властивість positional_shadow_atlas_size вікна перегляду встановлена на значення вище за 0. В іншому випадку тіні не будуть відображатися. За замовчуванням еквівалентне налаштування проекту встановлено на 4096 на настільних платформах та 2048 на мобільних платформах.
Godot також надає можливість настроїти те, як все малюється всередині Viewports за допомогою Debug Draw. Debug Draw дозволяє вказати режим, який визначає, як у вікні перегляду відображатимуться речі, намальовані всередині нього. За умовчанням Debug Draw вимкнено. Деякі інші параметри: Unshaded, Overdraw і Wireframe. Щоб отримати повний список, зверніться до Viewport Documentation.
Debug Draw = Disabled (за замовчуванням): сцена малюється нормально.
Debug Draw = Unshaded: Unshaded малює сцену без використання інформації про освітлення, тому всі об’єкти виглядають однорідно забарвленими в колір альбедо.
Debug Draw = Overdraw: Overdraw малює сітки напівпрозорими за допомогою додаткової суміші, щоб ви могли бачити, як сітки перекриваються.
Debug Draw = Wireframe: Wireframe малює сцену, використовуючи лише краї трикутників у сітках.
Примітка
Режими налагодження малювання наразі не підтримуються під час використання методу відтворення сумісності. Вони відображатимуться як звичайні режими малювання.
Ціль візуалізації
Під час візуалізації у SubViewport все, що знаходиться всередині, не буде видно в редакторі сцени. Щоб відобразити вміст, вам потрібно десь намалювати ViewportTexture SubViewport. Це можна запитати за допомогою коду, використовуючи (наприклад):
# This gives us the ViewportTexture.
var tex = viewport.get_texture()
sprite.texture = tex
// This gives us the ViewportTexture.
var tex = viewport.GetTexture();
sprite.Texture = tex;
Або його можна призначити в редакторі, вибравши «New ViewportTexture»
а потім виберіть Viewport, який ви хочете використовувати.
У кожному кадрі текстура Viewport видаляється стандартним прозорим кольором (або прозорим кольором, якщо для Transparent BG встановлено значення true). Це можна змінити, встановивши Clear Mode на Never або Next Frame. Як випливає з назви, Ніколи означає, що текстура ніколи не буде очищена, тоді як наступний кадр очищає текстуру наступного кадру, а потім встановлює значення Ніколи.
За замовчуванням повторне відтворення SubViewport відбувається, коли його ViewportTexture було намальовано у кадрі. Якщо видимий, він буде відтворений, інакше – ні. Цю поведінку можна змінити, встановивши для Update Mode значення Never, Once, Always або When Parent Visible. Ніколи та Завжди ніколи або завжди повторно відображатимуться відповідно. Один раз повторно візуалізує наступний кадр, а потім зміниться на Ніколи. Це можна використовувати для ручного оновлення вікна перегляду. Ця гнучкість дозволяє користувачам відтворювати зображення один раз, а потім використовувати текстуру без витрат на відтворення кожного кадру.
Примітка
Обов’язково перевірте демонстраційні ролики Viewport. Вони доступні в папці вікна перегляду архіву демонстрацій або за адресою https://github.com/godotengine/godot-demo-projects/tree/master/viewport.