Введение
Разработка игр — это сложный, многоэтапный процесс, где каждый день приходится решать десятки задач: от написания скриптов до настройки физики. С появлением больших языковых моделей (LLM) вроде GPT-4 и Claude 3.5 у гейм-дизайнеров и программистов появился мощный инструмент, который может генерировать код, сценарии и даже архитектуру игровых механик. Однако, как показывает практика, качество ответа напрямую зависит от того, как сформулирован промт.
В этой подборке я собрал 10 проверенных промтов для трёх популярных движков: Unity (C#), Unreal Engine (Blueprints) и Godot (GDScript). Каждый промт сопровождается реальным примером использования, кодом и разбором результата. Статья рассчитана на разработчиков любого уровня — от новичков до экспертов.
1. Базовый промт: Создание скрипта движения персонажа в Unity
Задача: Сгенерировать скрипт для движения персонажа от первого лица с поддержкой прыжка и приземления.
Промт: Напиши скрипт C# для Unity, реализующий движение персонажа от первого лица. Используй CharacterController. Добавь прыжок с проверкой на земле. Настрой чувствительность мыши для поворота камеры. Обработай случай, когда игрок падает с высоты.
Пример результата:
using UnityEngine;
public class FirstPersonController : MonoBehaviour
{
public float walkSpeed = 5f;
public float runSpeed = 10f;
public float jumpForce = 8f;
public float mouseSensitivity = 2f;
private CharacterController controller;
private Vector3 velocity;
private float xRotation = 0f;
private bool isGrounded;
void Start()
{
controller = GetComponent<CharacterController>();
Cursor.lockState = CursorLockMode.Locked;
}
void Update()
{
// Поворот камеры
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
Camera.main.transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
transform.Rotate(Vector3.up * mouseX);
// Движение
isGrounded = controller.isGrounded;
if (isGrounded && velocity.y < 0) velocity.y = -2f;
float speed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 move = transform.right * x + transform.forward * z;
controller.Move(move * speed * Time.deltaTime);
// Прыжок
if (Input.GetButtonDown("Jump") && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpForce * -2f * Physics.gravity.y);
}
velocity.y += Physics.gravity.y * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
}
Результат: Полноценный контроллер, который можно сразу вставить в сцену. Скрипт использует CharacterController — стандартный компонент Unity (документация: Unity Manual — CharacterController). Важно: промт явно указал проверку на земле и прыжок — AI корректно обработал эти условия.
2. Промт для Blueprints в Unreal Engine: Система здоровья
Задача: Создать Blueprint для персонажа с системой здоровья, урона и смерти.
Промт: Создай Blueprint для персонажа в Unreal Engine 5. Добавь переменную Health (float) с начальным значением 100. Реализуй функцию TakeDamage, которая уменьшает Health на величину урона. Если Health <= 0, вызывай событие Death. Также добавь возможность восстановления здоровья через функцию Heal.
Пример реализации (текстовое описание логики):
- Создайте Blueprint Class от
Character. - В графе событий добавьте переменную
Health(float, Default = 100). - Создайте пользовательский событие
TakeDamageс входным параметромDamageAmount. - Внутри события:
- Узел
Subtract(Health — DamageAmount). - Узел
Set Health. - Узел
Branchс условиемHealth <= 0. - При true: вызвать событие
Death(можно черезPrint StringилиDestroy Actor). - Создайте событие
Healс параметромHealAmount: - Узел
Add(Health + HealAmount). - Узел
Clamp(0–100), чтобы не превысить максимум. - Узел
Set Health.
Результат: Готовая система здоровья, которую можно расширить (например, добавить регенерацию или типы урона). Промт сработал хорошо, но для более сложной логики (например, критические удары) потребуется уточнение.
3. Промт для Godot: Скрипт стрельбы пулями
Задача: Создать скрипт на GDScript для стрельбы пулями из оружия с таймером перезарядки.
Промт: Напиши скрипт на GDScript для Godot 4. Создай узел Area2D для пули, которая движется вперёд и уничтожается при столкновении. Для оружия используй Timer для задержки между выстрелами. При нажатии Space создавай экземпляр пули.
Пример результата:
# Bullet.gd
extends Area2D
var speed: float = 500.0
func _ready():
# Подключаем сигнал столкновения
body_entered.connect(_on_body_entered)
# Таймер для автоудаления
var timer = Timer.new()
timer.wait_time = 2.0
timer.one_shot = true
timer.timeout.connect(queue_free)
add_child(timer)
timer.start()
func _process(delta):
position += Vector2.RIGHT * speed * delta
func _on_body_entered(body):
queue_free()
# Weapon.gd
extends Node2D
@export var bullet_scene: PackedScene
var can_shoot: bool = true
func _ready():
var timer = Timer.new()
timer.wait_time = 0.3
timer.one_shot = false
timer.timeout.connect(_on_timer_timeout)
add_child(timer)
timer.start()
func _input(event):
if event.is_action_pressed("shoot") and can_shoot:
var bullet = bullet_scene.instantiate()
bullet.position = position
get_parent().add_child(bullet)
can_shoot = false
await get_tree().create_timer(0.3).timeout
can_shoot = true
func _on_timer_timeout():
pass # Можно использовать для других целей
Результат: Рабочая стрельба с перезарядкой. Промт задал чёткие требования — AI выбрал Area2D для коллизий и Timer для задержки. Это следует из документации Godot: Godot Docs — Area2D.
4. Продвинутый промт: Система инвентаря в Unity
Задача: Сгенерировать архитектуру для системы инвентаря с поддержкой предметов, стекирования и UI.
Промт: Разработай архитектуру системы инвентаря для Unity. Используй ScriptableObject для предметов. Создай класс Inventory с словарём предметов и методом AddItem. Реализуй UI с сеткой ячеек. Предметы могут стакаться (макс 99). Напиши код на C#.
Пример результата (фрагмент):
// Item.cs
[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
public string itemName;
public Sprite icon;
public int maxStack = 99;
}
// Inventory.cs
public class Inventory : MonoBehaviour
{
public Dictionary<Item, int> items = new Dictionary<Item, int>();
public bool AddItem(Item item, int amount = 1)
{
if (items.ContainsKey(item))
{
int current = items[item];
if (current + amount <= item.maxStack)
{
items[item] = current + amount;
return true;
}
else
{
Debug.Log("Stack full");
return false;
}
}
else
{
items.Add(item, amount);
return true;
}
}
}
Результат: Архитектура, которую легко расширять (добавить удаление, слоты экипировки). Промт явно указал ScriptableObject — это стандартный подход в Unity (см. Unity Learn — ScriptableObject).
5. Промт для оптимизации: Процедурная генерация уровня в Godot
Задача: Создать скрипт для генерации лабиринта с помощью алгоритма поиска в глубину.
Промт: Напиши скрипт на GDScript для Godot 4, который генерирует лабиринт с использованием DFS (Depth-First Search). Используй TileMap. Размер лабиринта задаётся через экспортные переменные. Стены и пол — разные тайлы.
Пример результата (фрагмент):
extends TileMap
@export var width: int = 10
@export var height: int = 10
var grid: Array = []
func _ready():
generate_maze()
func generate_maze():
# Инициализация сетки
for x in range(width):
grid.append([])
for y in range(height):
grid[x].append(true) # true = стена
# DFS
var stack = []
var start = Vector2(1, 1)
grid[start.x][start.y] = false
stack.push_back(start)
while stack.size() > 0:
var current = stack.back()
var neighbors = get_neighbors(current)
if neighbors.size() > 0:
var next = neighbors[randi() % neighbors.size()]
grid[next.x][next.y] = false
var between = (current + next) / 2
grid[between.x][between.y] = false
stack.push_back(next)
else:
stack.pop_back()
# Отрисовка
for x in range(width):
for y in range(height):
if grid[x][y]:
set_cell(0, Vector2(x, y), 0, Vector2(0, 0)) # Стена
else:
set_cell(0, Vector2(x, y), 0, Vector2(1, 0)) # Пол
func get_neighbors(pos: Vector2) -> Array:
var result = []
var dirs = [Vector2(2, 0), Vector2(-2, 0), Vector2(0, 2), Vector2(0, -2)]
for d in dirs:
var new_pos = pos + d
if new_pos.x > 0 and new_pos.x < width and new_pos.y > 0 and new_pos.y < height:
if grid[new_pos.x][new_pos.y]:
result.append(new_pos)
return result
Результат: Генерация лабиринта за O(n). Промт указал конкретный алгоритм (DFS) — AI выбрал правильную реализацию. Это типовой подход, описанный в GDC Talk: Procedural Generation in Games.
6. Промт для Unreal Engine: AI Behaviour Tree
Задача: Создать поведение врага, который патрулирует, преследует игрока и атакует.
Промт: Создай Behaviour Tree для врага в Unreal Engine 5. Используй Blackboard с переменными TargetActor (Object), PatrolPoint (Vector). В Behaviour Tree: сначала патруль по точкам, при обнаружении игрока — преследование, если в радиусе 2 метров — атака. Напиши описание логики для каждого узла.
Пример реализации:
- Blackboard:
TargetActor(Object)PatrolPoint(Vector)-
IsAttacking(Bool) -
Behaviour Tree:
- Root: Selector
- Sequence: Attack
- Condition:
IsAttacking == true - Task:
PlayMontage(анимация атаки) - Sequence: Chase
- Task:
FindPlayer(Service: проверка расстояния) - Task:
MoveToActor(TargetActor) - Sequence: Patrol
- Task:
GetNextPatrolPoint - Task:
MoveToLocation(PatrolPoint)
Результат: Поведение, готовое к интеграции. Промт задал чёткие условия — AI предложил правильную структуру. Документация: Unreal Engine — Behaviour Tree.
7. Промт для Unity: Система диалогов
Задача: Создать систему диалогов с выбором ответов.
Промт: Разработай систему диалогов для Unity. Используй ScriptableObject для хранения узлов диалога. Каждый узел содержит текст и список вариантов ответа. Реализуй UI с кнопками. Напиши код на C#.
Пример результата (фрагмент):
[System.Serializable]
public class DialogueOption
{
public string text;
public DialogueNode nextNode;
}
[CreateAssetMenu(fileName = "New Dialogue", menuName = "Dialogue/Node")]
public class DialogueNode : ScriptableObject
{
public string speakerName;
[TextArea] public string dialogueText;
public DialogueOption[] options;
}
public class DialogueUI : MonoBehaviour
{
public TextMeshProUGUI speakerText;
public TextMeshProUGUI dialogueText;
public GameObject optionPrefab;
public Transform optionParent;
public void ShowNode(DialogueNode node)
{
speakerText.text = node.speakerName;
dialogueText.text = node.dialogueText;
foreach (var option in node.options)
{
var btn = Instantiate(optionPrefab, optionParent);
btn.GetComponentInChildren<TextMeshProUGUI>().text = option.text;
btn.GetComponent<Button>().onClick.AddListener(() => ShowNode(option.nextNode));
}
}
}
Результат: Гибкая система, которую можно расширить (добавить звуки, анимации). Промт указал ScriptableObject — это стандарт для данных в Unity.
8. Промт для Godot: Партиклы для эффекта взрыва
Задача: Создать систему частиц для взрыва.
Промт: Создай сцену взрыва в Godot 4. Используй GPUParticles2D. Настрой: время жизни 0.5 сек, скорость 300, цвет оранжевый->прозрачный, количество 50 частиц. Добавь случайное вращение.
Пример результата (скрипт для GDScript):
extends GPUParticles2D
func _ready():
# Настройки
amount = 50
lifetime = 0.5
speed_scale = 1.0
# Материал
var material = ParticleProcessMaterial.new()
material.direction = Vector3.UP
material.spread = 180.0
material.gravity = Vector3(0, -200, 0)
material.initial_velocity_min = 200.0
material.initial_velocity_max = 400.0
material.color = Color(1.0, 0.5, 0.0) # Оранжевый
# Градиент цвета (оранжевый -> прозрачный)
var gradient = Gradient.new()
gradient.offsets = [0.0, 1.0]
gradient.colors = [Color(1.0, 0.5, 0.0), Color(1.0, 0.5, 0.0, 0.0)]
material.color_ramp = gradient
# Вращение
material.angle_min = 0.0
material.angle_max = 360.0
material.angular_velocity_min = -100.0
material.angular_velocity_max = 100.0
process_material = material
emitting = true
Результат: Визуальный эффект взрыва. Промт задал все ключевые параметры — AI сгенерировал корректную конфигурацию.
9. Промт для оптимизации: LOD-система в Unity
Задача: Создать скрипт для автоматической генерации LOD-уровней.
Промт: Напиши скрипт C# для Unity, который автоматически создаёт LOD-группу для меша. Используй MeshSimplifier. Настрой три уровня: 100%, 60%, 30% полигонов.
Пример результата (фрагмент):
using UnityMeshSimplifier;
[RequireComponent(typeof(LODGroup))]
public class AutoLOD : MonoBehaviour
{
public float[] qualityPercentages = { 1f, 0.6f, 0.3f };
void Start()
{
var lodGroup = GetComponent<LODGroup>();
var originalMesh = GetComponent<MeshFilter>().sharedMesh;
var lods = new LOD[qualityPercentages.Length];
for (int i = 0; i < qualityPercentages.Length; i++)
{
var simplifiedMesh = MeshSimplifier.Simplify(originalMesh, qualityPercentages[i]);
var renderer = new GameObject("LOD" + i).AddComponent<MeshRenderer>();
var filter = renderer.gameObject.AddComponent<MeshFilter>();
filter.sharedMesh = simplifiedMesh;
renderer.transform.SetParent(transform);
lods[i] = new LOD(1f / (i + 1), new Renderer[] { renderer });
}
lodGroup.SetLODs(lods);
lodGroup.RecalculateBounds();
}
}
Результат: Экономия производительности. Промт использовал стороннюю библиотеку UnityMeshSimplifier (доступна на GitHub).
10. Экспертный промт: Архитектура для мультиплеера в Unity
Задача: Спроектировать архитектуру для мультиплеерной игры с использованием Netcode for GameObjects.
Промт: Спроектируй архитектуру мультиплеерной игры на Unity с Netcode. Используй NetworkBehaviour. Реализуй синхронизацию позиции игрока через NetworkTransform. Добавь RPC для стрельбы. Обработай лаг-компенсацию с помощью клиентского предсказания. Напиши код на C#.
Пример результата (фрагмент):
using Unity.Netcode;
public class PlayerController : NetworkBehaviour
{
public override void OnNetworkSpawn()
{
if (IsOwner)
{
Camera.main.transform.SetParent(transform);
Camera.main.transform.localPosition = new Vector3(0, 1.6f, 0);
}
}
[ClientRpc]
public void ShootClientRpc(Vector3 hitPoint)
{
// Визуализация выстрела на всех клиентах
Instantiate(bulletImpactPrefab, hitPoint, Quaternion.identity);
}
void Update()
{
if (!IsOwner) return;
// Клиентское предсказание
HandleInput();
}
[ServerRpc]
public void SubmitInputServerRpc(InputData input)
{
// Серверная валидация
ApplyMovement(input);
}
}
Результат: Архитектура для сетевой игры. Промт охватил ключевые концепции: RPC, синхронизацию, предсказание. Документация: Unity Netcode.
Заключение
Мы разобрали 10 промтов для Unity, Unreal Engine и Godot — от простого движения до мультиплеера. Ключевой вывод: качество результата напрямую зависит от детализации запроса. Указывайте движок, версию, конкретные компоненты (например, CharacterController, GPUParticles2D), и AI выдаст рабочий код.
Попробуйте использовать эти промты в своей работе. Начните с базовых — например, скрипта движения или системы здоровья. Постепенно переходите к сложным задачам, добавляя свои условия. Помните: AI — это инструмент, который ускоряет разработку, но не заменяет понимания архитектуры. Удачи в геймдеве!
Комментарии