Введение
Промты для AI — это не просто шаблонные запросы, а мощный инструмент, сокращающий время на написание кода, поиск багов и реализацию сложных механик. Особенно это актуально в GameDev, где каждая минута на счету. В этой подборке мы собрали 12 промтов для Unity (C#), Unreal Engine (Blueprints) и Godot (GDScript), сгруппированных по уровню сложности. Каждый промт снабжён задачей, самим запросом и примером результата. Все примеры основаны на официальной документации: Unity Scripting API, Unreal Engine Blueprints, Godot GDScript.
Базовые промты
Промт 1: Простое движение персонажа в Unity (C#)
Задача: Создать скрипт для передвижения персонажа с помощью WASD с учётом скорости и дельты времени.
Промт: «Напиши скрипт на C# для Unity, который реализует движение персонажа (Transform) по осям X и Z с помощью WASD. Используй Input.GetAxis, скорость speed (public float) и Time.deltaTime. Добавь ограничение поворота — персонаж всегда смотрит в направлении движения. Используй Quaternion.LookRotation.»
Пример результата:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
if (dir.magnitude > 0.1f)
{
transform.Translate(dir * speed * Time.deltaTime, Space.World);
transform.rotation = Quaternion.LookRotation(dir);
}
}
}
Источник: Unity Documentation - Input.GetAxis
Промт 2: Простая стрельба в Unreal Engine (Blueprints)
Задача: Создать логику стрельбы от первого лица с помощью LineTrace и спавном пули в виде шара.
Промт: «Создай Blueprint для стрельбы из оружия от лица игрока в Unreal Engine. При нажатии на левую кнопку мыши необходимо выполнить LineTrace из камеры на расстояние 1000 см. Если луч попадает в объект с тегом "Enemy", нанести урон 20 (через Apply Damage). В противном случае заспавнить на конце луча статический меш — шар (Sphere Static Mesh) с физикой, который исчезает через 2 секунды. Используй GetPlayerCameraManager, LineTraceByChannel, SpawnActor.»
Пример результата:
- На событие Left Mouse Button → LineTraceByChannel (Start = Camera Location, End = Camera Location + (Forward Vector * 1000)).
- Branch на Return Value → если hit, то Apply Damage (Target = Hit Actor, Damage = 20).
- Иначе SpawnActor (Class = BP_Projectile) в локации Hit Location с коллизией.
- DestroyActor (Target = Projectile, Delay = 2).
Источник: Unreal Blueprints - LineTrace
Промт 3: Прыжок персонажа в Godot (GDScript)
Задача: Реализовать прыжок от первого лица в 3D с проверкой, стоит ли персонаж на земле.
Промт: «Напиши скрипт на GDScript для узла CharacterBody3D в Godot. Добавь переменную jump_velocity (9.8) и gravity (ProjectSettings). В методе _physics_process обработай прыжок при нажатии Space и проверку is_on_floor. Используй Input.is_action_just_pressed и move_and_slide.»
Пример результата:
extends CharacterBody3D
@export var speed = 5.0
@export var jump_velocity = 9.8
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
func _physics_process(delta):
if not is_on_floor():
velocity.y -= gravity * delta
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = jump_velocity
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_back")
velocity.x = input_dir.x * speed
velocity.z = input_dir.y * speed
move_and_slide()
Источник: Godot Docs - CharacterBody3D
Промт 4: Взаимодействие с объектами (собирание предметов) в Unity
Задача: Создать скрипт для поднятия объектов через Raycast и UI-подсказку.
Промт: «Напиши скрипт на C# для Unity: при наведении прицела (Camera.ScreenPointToRay) на объект с тегом "Pickup" и нажатии E объект уничтожается, а в UI Text изменяется счётчик. Используй Physics.Raycast, OnTriggerEnter (для триггера подбора).»
Пример результата:
public class PickUp : MonoBehaviour
{
public Text uiText;
private int count = 0;
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0));
if (Physics.Raycast(ray, out RaycastHit hit, 3f))
{
if (hit.collider.CompareTag("Pickup") && Input.GetKeyDown(KeyCode.E))
{
Destroy(hit.collider.gameObject);
count++;
uiText.text = "Счёт: " + count;
}
}
}
}
Источник: Unity Docs - Physics.Raycast
Продвинутые промты
Промт 5: Система инвентаря с UI в Unity
Задача: Реализовать инвентарь, который отображает иконки предметов в Grid Layout Group.
Промт: «Создай систему инвентаря на C# для Unity. Используй ScriptableObject для определения предметов (ID, name, icon). Инвентарь — это список ItemSO. При подборе предмета вызывай AddItem, который добавляет предмет и обновляет UI (создаёт Image в контейнере с GridLayoutGroup). Предметы можно перетаскивать через IBeginDragHandler.»
Пример результата:
[CreateAssetMenu(fileName = "Item", menuName = "Inventory/Item")]
public class ItemSO : ScriptableObject
{
public int id;
public string itemName;
public Sprite icon;
}
public class Inventory : MonoBehaviour
{
public List<ItemSO> items = new List<ItemSO>();
public GameObject slotPrefab;
public Transform gridParent;
public void AddItem(ItemSO item)
{
items.Add(item);
GameObject slot = Instantiate(slotPrefab, gridParent);
slot.GetComponent<Image>().sprite = item.icon;
}
}
Источник: Unity ScriptableObject
Промт 6: AI-противник с патрулированием в Unreal Engine (Behavior Tree)
Задача: Создать врага, который патрулирует точки и атакует игрока при обнаружении.
Промт: «Создай Behavior Tree для Unreal Engine врага: Blackboard с ключами PatrolPoint (Vector), TargetPlayer (Object). Sequence: Patrol → MoveTo (PatrolPoint) → Wait → Select. Второй бранч с Parallel: если PerceivesPlayer (PlayerController), то FocusOnPlayer и Attack (LineTrace). Используй EQS для выбора точки патруля.»
Пример результата:
- Blackboard: PatrolLocation (Vector), PlayerRef (Object).
- BT Root: Selector.
- Sequence 1 (Patrol): FindNextPatrolPoint (Service) — задаёт случайную навигационную точку → MoveTo (PatrolLocation) → Wait (2 sec).
- Sequence 2 (Combat): BBObject получить PlayerRef → MoveTo (PlayerRef) → Attack (CustomTask: PlayMontage и LineTrace).
- Perception: AIPerceptionComponent (Sight) задаёт PlayerRef.
Источник: Unreal Behavior Tree
Промт 7: Система диалогов с ветвлением в Godot
Задача: Реализовать диалоги с выбором ответов, читаемые из JSON.
Промт: «Напиши скрипт на GDScript для диалоговой системы Godot. JSON содержит ноды с text и options (массив объектов с text и next_id). При запуске загрузи JSON через FileAccess и парсь через JSON.parse(). Отображай текст в RichTextLabel, а варианты ответа — кнопками. При нажатии на кнопку переходи на next_id.»
Пример результата:
# Пример JSON по пути res://dialogue.json
# {"start": {"text": "Привет!", "options": [{"text": "Кто ты?", "next_id": "q1"}]},
# "q1": {"text": "Я страж", "options": []}}
extends Control
var data: Dictionary
var current_id = "start"
func _ready():
var file = FileAccess.open("res://dialogue.json", FileAccess.READ)
data = JSON.parse_string(file.get_as_text())
show_dialogue(current_id)
func show_dialogue(id):
$RichTextLabel.text = data[id].text
for btn in $OptionContainer.get_children():
btn.queue_free()
for opt in data[id].options:
var button = Button.new()
button.text = opt.text
button.pressed.connect(_on_option.bind(opt.next_id))
$OptionContainer.add_child(button)
Источник: Godot JSON
Промт 8: Процедурная генерация подземелья в Unity (комнаты-коридоры)
Задача: Сгенерировать уровни из заранее заготовленных префабов комнат.
Промт: «Создай систему процедурной генерации на C# для Unity: заданный сид, количество комнат (например, 10). Список префабов комнат (Bounds). Алгоритм: случайно размещай комнаты без пересечений с помощью Physics.OverlapBox, затем соединяй их коридорами (Instantiate префаб коридора между ближайшими дверями). Используй случайный сид Random.InitState(seed).»
Пример результата:
public class DungeonGenerator : MonoBehaviour
{
public List<GameObject> roomPrefabs;
public GameObject corridorPrefab;
public int seed = 42;
public int roomCount = 10;
private List<Bounds> placedRooms = new List<Bounds>();
void Start()
{
Random.InitState(seed);
for (int i = 0; i < roomCount; i++)
{
Vector3 pos = new Vector3(Random.Range(-20,20),0, Random.Range(-20,20));
GameObject room = Instantiate(roomPrefabs[Random.Range(0, roomPrefabs.Count)], pos, Quaternion.identity);
Bounds b = new Bounds(pos, Vector3.one * 10);
// проверка на пересечение пропущена для краткости
placedRooms.Add(b);
}
// соединение коридорами
}
}
Источник: Unity Physics.OverlapBox
Экспертные промты
Промт 9: Пул объектов для пуль в Unity (оптимизация)
Задача: Реализовать объектный пул для пуль, избегая Instantiate/Destroy.
Промт: «Напиши класс ObjectPool для Unity (C# Generic pool). При старте создай Queue
Пример результата:
public class ObjectPool : MonoBehaviour
{
public GameObject prefab;
public int initialSize = 20;
private Queue<GameObject> pool = new Queue<GameObject>();
void Awake()
{
for (int i = 0; i < initialSize; i++)
{
GameObject obj = Instantiate(prefab);
obj.SetActive(false);
pool.Enqueue(obj);
}
}
public GameObject Get()
{
if (pool.Count == 0)
{
GameObject obj = Instantiate(prefab);
return obj;
}
GameObject pooled = pool.Dequeue();
pooled.SetActive(true);
return pooled;
}
public void Return(GameObject obj)
{
obj.SetActive(false);
pool.Enqueue(obj);
}
}
// Использование: BulletController через 5 сек вызывает ObjectPool.Return(gameObject)
Источник: Unity Patterns - Object Pooling
Промт 10: Save/Load с бинарной сериализацией в Godot
Задача: Сохранять состояние игры (позиция, инвентарь) в бинарный файл.
Промт: «Напиши скрипт SaveManager на GDScript для Godot. Используй FileAccess в режиме WRITE_READ для savegame.sav. Сохраняй Dictionary с позицией (Vector3) и списком предметов. При загрузке проверяй FileAccess.file_exists, читай, парсь через var data = bytes_to_var(file.get_buffer(file.get_length())). Используй @rpc для мультиплеера.»
Пример результата:
func save_game():
var data = {
"position": $Player.position,
"inventory": Global.inventory
}
var file = FileAccess.open("user://savegame.sav", FileAccess.WRITE)
file.store_var(data)
file.close()
func load_game():
if not FileAccess.file_exists("user://savegame.sav"):
return
var file = FileAccess.open("user://savegame.sav", FileAccess.READ)
var data = file.get_var()
$Player.position = data["position"]
Global.inventory = data["inventory"]
file.close()
Источник: Godot FileAccess
Промт 11: Кастомная физика CharacterMovementComponent в Unreal Engine (замена, бег по стенам)
Задача: Реализовать движение по стенам (wall running) без стандартного CMC.
Промт: «Создай собственный UCharacterMovementComponent для Unreal Engine, наследующий от UCharacterMovementComponent. Переопредели PhysWalking и CheckWallRunning. Когда игрок в воздухе и нажимает Q, проверяй наличие стены слева/справа (SweepSingleByChannel). Если есть, меняй GravityScale на 0 и двигай вдоль стены, используя Custom Movement Mode. Добавь для этого кастомный метод OnStartWallRun.»
Пример результата:
void UMyMovementComponent::PhysWalking(float deltaTime, int32 Iterations)
{
Super::PhysWalking(deltaTime, Iterations);
if (bWantsToWallRun && FindWallNormal().Z < 0.1f)
{
SetMovementMode(MOVE_Custom, CUSTOM_WALLRUN);
Velocity = FVector::CrossProduct(FindWallNormal(), FVector::UpVector) * RunSpeed;
GravityScale = 0;
}
}
Источник: Unreal C++ Character Movement
Промт 12: Многопоточный парсер карт высот для ландшафта в Unity (Jobs System)
Задача: Сгенерировать HeightMap с помощью IJobParallelFor для Texture2D без блокировки главного потока.
Промт: «Используй Unity's Job System для генерации шума Перлина и создания HeightMap. Создай структуру HeightMapJob : IJobParallelFor с входным параметром float[] noiseMap. В Execute вычисляй значение noise.snoise(x,y) и записывай в output array. После завершения Schedule и Complete примени результат к TerrainData.SetHeights. Учти, что NativeArray требует Dispose.»
Пример результата:
public struct HeightMapJob : IJobParallelFor
{
public NativeArray<float> heights;
public int width;
public float scale;
public void Execute(int i)
{
int x = i % width;
int y = i / width;
heights[i] = Mathf.PerlinNoise(x * scale, y * scale);
}
}
// Использование:
var job = new HeightMapJob { heights = new NativeArray<float>(width*height, Allocator.TempJob), width=width, scale=0.02f };
JobHandle handle = job.Schedule(width*height, 64);
handle.Complete();
// Применить к TerrainData
Источник: Unity Jobs System
Заключение
Мы рассмотрели 12 промтов, покрывающих три основных движка — Unity, Unreal Engine и Godot — от базового движения до многопоточных вычислений. Каждый промт можно скопировать, адаптировать под свой проект и использовать в работе с AI-ассистентом. Чтобы получить максимальную пользу, уточняйте контекст (версию движка, имена классов) и всегда проверяйте сгенерированный код на соответствие документации. Попробуйте эти промты в вашем следующем проекте: запустите AI, вставьте промт и получите готовый функционал за секунды. А если хотите научиться составлять такие запросы самостоятельно — изучайте документацию и практикуйтесь на реальных задачах.
Комментарии