15 промтов для GameDev: Unity, Unreal Engine и Godot — от прототипа до оптимизации

Разработка игр — это постоянный диалог с кодом, ассистами и документацией. С появлением генеративных AI-моделей, таких как GPT-4o и Claude 3.5 Sonnet, этот диалог стал продуктивнее. Правильно составленный промт позволяет за минуты получить работающий скрипт на C# для Unity, ноду Blueprint для Unreal Engine или готовую сцену в Godot. В этой подборке — 15 проверенных промтов, которые я использую в реальных проектах. Каждый промт сопровождается примером вывода и практическим советом.

Как работают промты в GameDev

Промт — это инструкция для AI-модели. В контексте разработки игр он должен содержать: контекст (движок, версия, задача), требования (формат, стиль, ограничения) и ожидаемый результат. Например, для Unity: «Напиши скрипт на C# для версии 2022.3 LTS, который реализует движение персонажа от третьего лица с использованием CharacterController и New Input System. Верни полный код класса и инструкцию по подключению». Без указания версии вы рискуете получить код, использующий устаревшие API.

15 промтов для GameDev

1. Генерация скрипта движения персонажа в Unity

Промт: «Напиши скрипт PlayerMovement.cs для Unity 2022.3 LTS с использованием CharacterController. Реализуй: WASD-движение, прыжок (Space), бег (Shift), гравитацию. Используй New Input System (InputActionAsset). Добавь комментарии на русском языке. Верни полный код класса.»

Пример вывода:

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(CharacterController))]
public class PlayerMovement : MonoBehaviour
{
    [SerializeField] private float walkSpeed = 5f;
    [SerializeField] private float runSpeed = 10f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;
    private bool isGrounded;
    private PlayerInputActions inputActions;

    private void Awake()
    {
        controller = GetComponent<CharacterController>();
        inputActions = new PlayerInputActions();
        inputActions.Player.Enable();
    }

    private void Update()
    {
        isGrounded = controller.isGrounded;
        if (isGrounded && velocity.y < 0) velocity.y = -2f;

        Vector2 moveInput = inputActions.Player.Move.ReadValue<Vector2>();
        Vector3 move = transform.right * moveInput.x + transform.forward * moveInput.y;
        float speed = inputActions.Player.Run.IsPressed() ? runSpeed : walkSpeed;
        controller.Move(move * speed * Time.deltaTime);

        if (inputActions.Player.Jump.WasPressedThisFrame() && isGrounded)
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);

        velocity.y += gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }
}

Совет: После генерации проверьте, что InputActionAsset создан и привязан. В Unity 6 появился Input System 2.0 — для него промт нужно уточнять.

2. Создание ноды Blueprint для открытия двери в Unreal Engine

Промт: «Создай Blueprint для Unreal Engine 5.4, который реализует открытие двери при нажатии клавиши E. Дверь должна плавно вращаться вокруг оси Y на 90 градусов. Используй Timeline и Collision Box. Опиши логику в виде Event Graph с комментариями. Верни пошаговую инструкцию.»

Пример вывода (текстовое описание):
1. Создайте Blueprint Class от Actor.
2. Добавьте Static Mesh (дверь) и Box Collision.
3. В Event Graph добавьте Event ActorBeginOverlap и Event ActorEndOverlap для переключения состояния.
4. Используйте Timeline (Float Track, 0–1, 0.5 сек) и Lerp (Rotator) для плавного поворота.
5. При нажатии клавиши E (InputAction) вызывайте Play на Timeline.

Совет: Для сложных анимаций используйте Animation Blueprint, а не Timeline. Промт для Unreal лучше уточнять версией — UE 5.5 изменил работу с Enhanced Input.

3. Скрипт для управления камерой в Godot 4

Промт: «Напиши скрипт на GDScript для Godot 4.3, который реализует камеру от третьего лица с вращением мыши и зумом колесиком. Используй SpringArm3D и Camera3D. Верни полный код с комментариями.»

Пример вывода:

extends Node3D

@export var mouse_sensitivity := 0.002
@export var zoom_speed := 2.0
@export var min_zoom := 2.0
@export var max_zoom := 10.0

@onready var spring_arm := $SpringArm3D as SpringArm3D

func _ready() -> void:
    Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _input(event: InputEvent) -> void:
    if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_CAPTURED:
        rotation.y -= event.relative.x * mouse_sensitivity
        spring_arm.rotation.x -= event.relative.y * mouse_sensitivity
        spring_arm.rotation.x = clamp(spring_arm.rotation.x, deg_to_rad(-80), deg_to_rad(80))
    if event is InputEventMouseButton:
        if event.button_index == MOUSE_BUTTON_WHEEL_UP:
            spring_arm.spring_length = clamp(spring_arm.spring_length - zoom_speed, min_zoom, max_zoom)
        elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
            spring_arm.spring_length = clamp(spring_arm.spring_length + zoom_speed, min_zoom, max_zoom)

func _unhandled_input(event: InputEvent) -> void:
    if event.is_action_pressed("ui_cancel"):
        Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)

Совет: В Godot 4.4 изменилась система ввода — используйте InputMap для кроссплатформенности.

4. Оптимизация draw calls в Unity

Промт: «Предложи стратегию оптимизации draw calls для мобильной игры на Unity 2022.3 LTS под Android. Используй SRP Batcher, GPU Instancing и LOD Groups. Напиши конкретные шаги и код для настройки URP. Ограничь количество материалов до 10 на сцену.»

Пример вывода:
- Включите SRP Batcher в Project Settings > Graphics > URP Asset.
- Для повторяющихся объектов (деревья, камни) используйте GPU Instancing в Material.
- Создайте LOD Group с 3 уровнями детализации.
- Используйте Texture Atlas для объединения текстур.
- Код для сбора статистики:

using UnityEngine.Rendering;
public class DrawCallCounter : MonoBehaviour
{
    void Update()
    {
        Debug.Log($"Draw Calls: {UnityEditor.UnityStats.batches}");
    }
}

Совет: На iOS используйте Metal Performance Shaders — они снижают нагрузку на GPU.

5. Процедурная генерация уровня в Godot

Промт: «Напиши скрипт на GDScript для Godot 4.3, который генерирует лабиринт с помощью алгоритма DFS. Используй TileMap и предустановленные tiles. Верни полный код и инструкцию по настройке TileSet.»

Пример вывода (фрагмент):

extends TileMap

@export var width := 20
@export var height := 20
@export var wall_tile := Vector2i(0, 0)
@export var floor_tile := Vector2i(1, 0)

func _ready() -> void:
    generate_maze()

func generate_maze() -> void:
    # Алгоритм DFS
    var stack := []
    var visited := {}
    stack.append(Vector2i(1, 1))
    while stack.size() > 0:
        var current = stack.pop_back()
        visited[current] = true
        set_cell(0, current, 0, floor_tile)
        var neighbors = get_unvisited_neighbors(current, visited)
        if neighbors.size() > 0:
            stack.append(current)
            var next = neighbors[randi() % neighbors.size()]
            var wall = (current + next) / 2
            set_cell(0, wall, 0, floor_tile)
            stack.append(next)

Совет: Для больших карт используйте Wave Function Collapse — он быстрее и даёт более органичные результаты.

6. Система инвентаря в Unreal Engine на C++

Промт: «Напиши класс UInventoryComponent на C++ для Unreal Engine 5.4 с поддержкой добавления/удаления предметов, стеков и веса. Используй TArray и FGameplayTag для категорий. Верни полный код .h и .cpp файлов.»

Пример вывода (фрагмент .h):

#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "InventoryComponent.generated.h"

USTRUCT(BlueprintType)
struct FItemStack
{
    GENERATED_BODY()
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    FName ItemID;
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    int32 Count;
};

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class MYGAME_API UInventoryComponent : public UActorComponent
{
    GENERATED_BODY()
public:
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Inventory")
    TArray<FItemStack> Items;
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Inventory")
    float MaxWeight;
    bool AddItem(FName ItemID, int32 Count);
    bool RemoveItem(FName ItemID, int32 Count);
    float GetCurrentWeight();
};

Совет: Для сериализации используйте FSaveGame — это стандартный способ в UE.

7. Анимация персонажа в Unity с Blend Tree

Промт: «Создай Animator Controller для Unity 2022.3 LTS с Blend Tree для смешивания анимаций ходьбы и бега. Используй параметры Speed и Direction. Верни инструкцию по настройке и код для управления анимациями через Animator.»

Пример вывода:
1. Создайте Animator Controller.
2. Добавьте Blend Tree (1D) с параметром Speed (0–1).
3. Добавьте 3 анимации: Idle (Speed 0), Walk (Speed 0.5), Run (Speed 1).
4. В скрипте PlayerMovement обновляйте Animator.SetFloat("Speed", velocity.magnitude / runSpeed).

Совет: Для 2D-игр используйте Blend Tree 2D с Direction.

8. Физика разрушаемых объектов в Godot

Промт: «Напиши скрипт на GDScript для Godot 4.3, который реализует разрушение объекта при столкновении с достаточной силой. Используй RigidBody3D и сигнал body_entered. Верни полный код.»

Пример вывода:

extends RigidBody3D

@export var break_force := 10.0
@export var debris_scene: PackedScene

func _ready() -> void:
    body_entered.connect(_on_body_entered)

func _on_body_entered(body: Node) -> void:
    if body is RigidBody3D:
        var collision_force = linear_velocity.length() * mass
        if collision_force > break_force:
            spawn_debris()
            queue_free()

func spawn_debris() -> void:
    var debris = debris_scene.instantiate()
    get_parent().add_child(debris)
    debris.global_transform = global_transform

Совет: Используйте Spatial Partition (Octree) для оптимизации физики.

9. Система диалогов в Unreal Engine

Промт: «Разработай систему диалогов для Unreal Engine 5.4 с использованием DataTable и Widget Blueprint. Диалоги должны поддерживать ветвление, проверки (по предмету, квесту) и анимации речи. Верни инструкцию по созданию DataTable и пример Event Graph.»

Пример вывода:
- DataTable с колонками: Speaker, Text, NextID, Condition.
- Widget Blueprint: TextBlock для реплики, Image для портрета, кнопки выбора.
- Event Graph: при начале диалога загружайте строку из DataTable, проверяйте условие, отображайте варианты.

Совет: Для озвучки используйте MetaSounds — они нативно поддерживаются в UE 5.4.

10. Оптимизация освещения в Unity для VR

Промт: «Напиши гайд по оптимизации освещения для VR-игры на Unity 2022.3 LTS под Oculus Quest 2. Используй Lightmap Baking, Baked Indirect и Probe Volumes. Ограничь количество реальных источников света до 1. Верни конкретные настройки и скрипт для переключения.»

Пример вывода:
- Включите Baked Indirect в Lighting Settings.
- Используйте Light Probe Group для статического освещения.
- Для динамических объектов — Light Probes.
- Скрипт для деактивации лишних источников:

public class VRLightOptimizer : MonoBehaviour
{
    public Light[] realtimeLights;
    void Start()
    {
        for (int i = 1; i < realtimeLights.Length; i++)
            realtimeLights[i].enabled = false;
    }
}

Совет: На Quest 3 используйте Adaptive Performance от Snapdragon.

11. Процедурная анимация хвоста в Godot

Промт: «Реализуй процедурную анимацию хвоста для 3D-персонажа в Godot 4.3 с помощью Inverse Kinematics (SkeletonIK3D). Верни скрипт и инструкцию по настройке Skeleton.»

Пример вывода:
- Добавьте SkeletonIK3D к дочернему узлу Skeleton.
- Настройте Bone Chain: от основания хвоста до кончика.
- Скрипт обновляет target position на основе скорости персонажа.

Совет: Используйте SpringBone для более органичных движений.

12. AI врага с FSM в Unity

Промт: «Разработай FSM (конечный автомат) для врага в Unity 2022.3 LTS. Состояния: Idle, Patrol, Chase, Attack. Используй NavMeshAgent и NavMeshSurface. Верни полный код классов состояний и инструкцию по настройке NavMesh.»

Пример вывода:
- Базовый класс State с методами Enter, Update, Exit.
- Класс EnemyController управляет переходом между состояниями.
- PatrolState: двигаться по точкам, ChaseState: преследовать игрока.

Совет: Для сложного AI используйте GOAP (Goal-Oriented Action Planning).

13. Партиклы магии в Unreal Engine

Промт: «Создай Niagara-систему для заклинания огненного шара в Unreal Engine 5.4. Используй Sprite Renderer, Drag Force и Collision. Верни пошаговую инструкцию по созданию эмиттера и настройке параметров.»

Пример вывода:
1. Создайте Niagara System.
2. Добавьте Emitter Sprite с текстурой огня.
3. Настройте Particle Spawn Rate: 100 частиц в секунду.
4. Добавьте Drag Force: -10 для замедления.
5. Включите Collision с World Dynamic.

Совет: Используйте GPU Compute для тысяч частиц на PC.

14. Синхронизация мультиплеера в Godot

Промт: «Реализуй синхронизацию положения игроков в мультиплеере Godot 4.3 с использованием ENet. Используй MultiplayerSpawner и MultiplayerSynchronizer. Верни скрипт для авторитетного сервера и инструкцию по настройке сети.»

Пример вывода:

extends Node3D

@export var player_scene: PackedScene

func _ready() -> void:
    if OS.get_environment("GODOT_MULTIPLAYER") == "server":
        var peer = ENetMultiplayerPeer.new()
        peer.create_server(25565, 4)
        multiplayer.multiplayer_peer = peer
        multiplayer.peer_connected.connect(_on_player_connected)

func _on_player_connected(id: int) -> void:
    var player = player_scene.instantiate()
    add_child(player)
    player.set_multiplayer_authority(id)

Совет: Для децентрализованных игр используйте WebRTC.

15. Оптимизация загрузки уровней в Unity

Промт: «Разработай систему асинхронной загрузки уровней для Unity 2022.3 LTS с использованием Addressables и SceneManager.LoadSceneAsync. Добавь прогресс-бар и фоновую загрузку. Верни полный код и инструкцию по настройке Addressables.»

Пример вывода:

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;

public class LevelLoader : MonoBehaviour
{
    public Slider progressBar;
    public void LoadLevel(string levelKey)
    {
        var handle = Addressables.LoadSceneAsync(levelKey, UnityEngine.SceneManagement.LoadSceneMode.Single);
        handle.Completed += (op) => progressBar.value = 1f;
        StartCoroutine(UpdateProgress(handle));
    }
    System.Collections.IEnumerator UpdateProgress(AsyncOperationHandle handle)
    {
        while (!handle.IsDone)
        {
            progressBar.value = handle.PercentComplete;
            yield return null;
        }
    }
}

Совет: Используйте Asset Bundles для кастомных платформ.

Заключение

Эти 15 промтов — лишь начало. Каждый из них можно адаптировать под конкретный движок, версию и задачу. Главное — помнить: хороший промт = контекст + требования + пример. Экспериментируйте, комбинируйте промты и не бойтесь уточнять у AI модель. В комментариях делитесь своими промтами — лучшие мы добавим в следующую подборку.

← Все статьи

Комментарии

Читайте также