Akrus Games | Unity
2.95K subscribers
407 photos
89 videos
11 files
350 links
Самые годные лайфхаки по unity c#

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
C# Атрибуты в Unity: мета-инструкции для кода

Что это?

Специальные метки для классов, переменных или методов. Они дают подсказки движку и редактору Unity, как с ними работать.

Зачем?

- Делать переменные видимыми в Инспекторе без ключевого слова public
- Задавать диапазоны значений для ползунка
- Добавлять в контекстное меню кнопки для вызова методов
- Скрывать ненужные поля в Инспекторе

Как использовать?

Просто напиши имя атрибута в квадратных скобках [] перед элементом.

Популярные атрибуты:

[SerializeField]
Показывает private поле в Инспекторе.
[SerializeField] private int _health;


[Range(min, max)]
Создает ползунок для значения.
[Range(0f, 10f)] public float speed;


[Header("Название")]
Добавляет заголовок в Инспектор.
[Header("Player Settings")]
public int playerScore;


[Tooltip("Подсказка")]

Показывает текст при наведении курсора.
[Tooltip("Сила прыжка в ньютонах")] 
public float jumpForce;


[HideInInspector]

Прячет public поле из Инспектора.
[HideInInspector] public bool isGrounded;


Важно!

Атрибуты не меняют логику кода, а только управляют его отображением и поведением в редакторе Unity. НО есть атрибут Obsolete который не относится к юнити и не влияет на отображение в редакторе. Еще в поля можно писать только константы, не переменные!

💡 Используй, чтобы сделать процесс настройки объектов интуитивным и удобным.

#Unity #Unity3D #CSharp #Атрибуты #Gamedevelopment
🔥8🎄2
⚡️ Unity: 5 вещей, которые убивают оптимизацию

Твой проект лагает даже на сцене с кубиками? Скорее всего, причина в одной из этих 5 ошибок. Устрани их — и производительность сразу вырастет.

1️⃣ Бесконечный поток новых объектов (Instantiate/Destroy)

Это хаос в памяти! Создание и удаление объекта — тяжёлые операции для Garbage Collector (GC).

📌 Что делать: Используй пул объектов (Object Pooling). Создай заранее 10 пуль, 20 врагов или 100 эффектов. Переиспользуй их, а не создавай заново.

💡 Создай один раз, спрячь (SetActive(false)), доставай когда нужно.

2️⃣ Полноценный Update() там, где можно обойтись

Проверка условия в Update() 60 раз в секунду — дикая нагрузка, если это не требуется.

📌 Что делать: Вместо if (isReady) в Update() используй корутину с WaitForSeconds или InvokeRepeating. Для физики — FixedUpdate. Для событий — подписки (event/delegate).

💡 Замени void Update() на IEnumerator MyTimer() везде, где это возможно.

3️⃣ Слишком много объектов на сцене с коллайдерами

Каждый коллайдер — нагрузка на физику (Physics Engine). 100 активных Rigidbody и BoxCollider = гарантированные тормоза.

📌 Что делать: Отключай (enabled = false) коллайдеры у далёких или неактивных объектов. Для статичной декорации используй один Mesh Collider вместо сотни примитивных.

💡 Ставь Static Flag для неподвижных объектов — физический движок их оптимизирует.

4️⃣ Сырые текстуры и модели

Загрузил в проект 4K текстуру для кнопки? Модель с 100к полигонов для камня? Память съедена, а FPS упал.

📌 Что делать: Всегда сжимай текстуры (Format: ASTC, ETC2). Оптимизируй полигоны моделей. Используй спрайт-атласы для 2D.

💡 В окне Import Settings задавай максимальный размер текстуры (Max Size 1024 для фона — уже много).

5️⃣ Глобальные переменные в скриптах


Постоянные обращения типа FindObjectOfType<GameManager>() или GetComponent<>() в Update — это вызовы каждый кадр.

📌 Что делать: Кэшируй ссылки! Выполни поиск в Start() или Awake() и сохрани в приватную переменную. Обращайся уже к ней.

💡 Вместо GetComponent<Renderer>().material.color в цикле — сохрани Renderer _myRenderer один раз.

🔥 Проверь свой проект по этим пунктам прямо сейчас. Чаще всего проблема в первых трёх!

📌 Сохрани этот чек-лист перед каждым билдом.
🔔 Подписывайся — дальше будет про оптимизацию UI, Shader'ов и памяти на мобилках.

💬 А с какой проблемой сталкивался ты? Пиши в комментах!

👉Akrus Games | Unity
7🔥4
Tilemap в Unity: Создание 2D-уровней

Что это?
Система для быстрого построения 2D-уровней из тайлов (кирпичики-спрайты). Идеально для платформеров, топ-даун игр и пиксель-арта.

Как начать:
1. Создай Tilemap: ПКМ в Hierarchy → 2D Object → Tilemap
2. Добавь Grid (сетка-родитель для всех Tilemap), обычно создаётся автоматически
3. Открой окно Tile Palette (Window → 2D → Tile Palette)

Практика:
// Генерация случайного тайла в коде:
public Tile[] groundTiles; // Перетащи тайлы в инспектор

void GeneratePlatform()
{
Tilemap tilemap = GetComponent<Tilemap>();
Vector3Int position = new Vector3Int(Random.Range(-5, 5), 0, 0);

// Выбираем случайный тайл
Tile randomTile = groundTiles[Random.Range(0, groundTiles.Length)];
tilemap.SetTile(position, randomTile);
}



Основные инструменты:
Кисть (Paint Brush) - рисование тайлов
Заливка (Bucket) - заполнение областей
Ластик (Erase) - удаление тайлов
Rule Tiles - умные тайлы с авто-текстурированием

Создание Rule Tile:
1. ПКМ в Project → Create → 2D → Tiles → Rule Tile
2. Настрой правила соседства (например: трава с землёй снизу)
3. Перетащи в Tile Palette

Важные советы:
• Разделяй слои: Foreground, Background, Collision (добавь Composite Collider 2D)
• Используй Animated Tiles для воды/лавы
• Для оптимизации: включи Chunk Culling в Tilemap Renderer
• Экспортируй карты в .json через [SerializeField]

💡 Пример применения:
- Случайная генерация платформ
- Прорисовка подземелий
- Создание разрушаемых блоков

#Unity2D #Tilemap #GameDev #IndieDev

---

🔥 Дополнительные хаки:
1. Разрушаемые тайлы:
void DestroyTile(Vector2 worldPos)
{
Tilemap tilemap = GetComponent<Tilemap>();
Vector3Int cellPos = tilemap.WorldToCell(worldPos);
tilemap.SetTile(cellPos, null); // Удаляем тайл
SpawnExplosionEffect(worldPos);
}



2. Авто-коллайдеры:
• Добавь Tilemap Collider 2D
• Выбери Used By Composite
• Добавь Composite Collider 2D (настрой форму в Rigidbody 2D)

3. Слои для сортировки:
• Настрой Sorting Layer в Tilemap Renderer
• Используй Order in Layer для переднего/заднего плана

Пост создан в вашем стиле: минимум теории, максимум практики! 🚀
🔥5
Дуров о блокировке тг в России.
Я телеграмм не заброшу, сейчас буду наиболее активно развивать канал. Так что ждите новую имбу.

Почему у него в канале только положительные реакции🧐
🔥16👍2
Akrus Games | Unity
Video
⚡️ Подсветка объектов при наведении

Хочешь, чтобы игрок видел, на что можно кликнуть? Базовый, но важный приём.

Через Outline (красиво и профессионально)

Либо берём готовый ассет Quick Outline из Asset Store (бесплатный).

Ставим на объект скрипт, который включает/выключает компонент Outline при Raycast-попадании.

Скрипт OutCube для объекта:
using UnityEngine;

// Этот класс отвечает за управление подсветкой (Outline) объекта
public class OutCube : MonoBehaviour
{
// Ссылка на компонент Outline, который создает подсветку вокруг объекта
public Outline _outline;

private void Start()
{
// Проверяем, есть ли у нас компонент Outline (не равен ли null)
if (_outline != null)
{
// Отключаем подсветку при старте игры, чтобы объект не светился сразу
_outline.enabled = false;
}
}

// Этот метод включает или выключает подсветку объекта
// state - параметр, который получает метод: true = включить, false = выключить
public void ToggleOutline(bool state)
{
if (_outline != null)
{
_outline.enabled = state;
}
}
}


Скрипт MouseOut для наведения мыши(необязательный, только для примера)
using UnityEngine;

public class MouseOut : MonoBehaviour
{
// Хранит информацию о последнем подсвеченном объекте
private OutCube _currentCube;

void Update()
{
// Создаем луч из камеры через позицию мыши на экране
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

// Рисуем желтый луч в сцене для визуализации (видно только в режиме Scene)
Debug.DrawRay(ray.origin, ray.direction * 100f, Color.yellow);

// Physics.Raycast - пускаем луч и проверяем, во что он попал
if (Physics.Raycast(ray, out RaycastHit hit))
{
// Рисуем зеленый луч до точки попадания
Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.green);

// Пытаемся получить компонент OutCube с объекта, в который попал луч
OutCube cube = hit.collider.GetComponent<OutCube>();

// Проверяем: если на объекте есть компонент OutCube И это не тот же куб, на который мы уже смотрели
if (cube != null && cube != _currentCube)
{
// ?. - это безопасный вызов: если _currentCube не null, то вызываем метод
_currentCube?.ToggleOutline(false);

_currentCube = cube;

// Включаем подсветку у нового куба
_currentCube.ToggleOutline(true);
}
// Если луч попал в объект без компонента OutCube, но у нас был запомнен предыдущий куб
else if (cube == null && _currentCube != null)
{
// Выключаем подсветку у предыдущего куба
_currentCube.ToggleOutline(false);

// Забываем про предыдущий куб (теперь ни на что не наведены)
_currentCube = null;
}
}
// Если луч вообще ни во что не попал, но у нас был запомнен подсвеченный куб
else if (_currentCube != null)
{
// Выключаем подсветку у последнего куба
_currentCube.ToggleOutline(false);

// Забываем про него
_currentCube = null;
}
}
}


Что важно:
- Outline эффект работает поверх всего и не ломает текстуры.
- Можно настроить цвет (красный для врагов, зелёный для союзников).
- Не требует замены материала — значит, работает с любыми шейдерами.

Результат: игра сразу становится отзывчивее. Игрок понимает, с чем можно взаимодействовать, а UI не нужен.

💬 А ты как делаешь подсветку? Юзаешь ассеты или костылишь вручную?
🔔 Подпишись, дальше будет много про шейдеры, эффекты и оптимизацию в инди-разработке.

👉 Akrus Games | Unity
6👍2🔥2
АХАХАХ.

С этого дня буду писать годные посты каждый день. Так что подписывайтесь!
1👍8🔥4👎1😁1
⚡️ Двигаем камеру в 2D стратегии: перетаскивание + зум (с подробными комментариями)

Забудь про края экрана. Хочешь управлять камерой как в дорогих тактиках?
Зажимаешь правую кнопку — тащишь карту, крутишь колёсико — приближаешь/отдаляешь.

Код ниже — готовый компонент с подробными комментариями. Вешай на камеру и настраивай под себя.

using UnityEngine;

public class CameraDragZoom : MonoBehaviour
{
[Header("Перетаскивание")]
[Tooltip("Скорость движения камеры за мышкой")]
[SerializeField] private float dragSpeed = 1f;
private Vector3 dragOrigin; // точка в мире, где была мышь в момент начала перетаскивания

[Header("Зум")]
[Tooltip("Чувствительность колёсика мыши")]
[SerializeField] private float zoomSpeed = 5f;
[Tooltip("Минимальный размер камеры (сильное приближение)")]
[SerializeField] private float minSize = 3f;
[Tooltip("Максимальный размер камеры (сильное отдаление)")]
[SerializeField] private float maxSize = 10f;

private Camera cam;

private void Start()
{
// Получаем компонент камеры на этом же объекте
cam = GetComponent<Camera>();

// Если камера не ортографическая (например, 3D), можно переключить режим в инспекторе
// Для 2D стратегии камера обычно ортографическая
}

private void Update()
{
// --- Перетаскивание (правая кнопка мыши) ---
// При зажатии ПКМ запоминаем позицию мыши в мировых координатах
if (Input.GetMouseButtonDown(1))
{
// ScreenToWorldPoint переводит экранные пиксели в координаты мира
dragOrigin = cam.ScreenToWorldPoint(Input.mousePosition);
}

// Пока кнопка зажата — двигаем камеру
if (Input.GetMouseButton(1))
{
// Разница между запомненной точкой и текущим положением мыши в мире
Vector3 difference = dragOrigin - cam.ScreenToWorldPoint(Input.mousePosition);

// Перемещаем камеру на эту разницу (игнорируем Z, т.к. камера смотрит сверху)
transform.position += difference;
}

// --- Зум колёсиком мыши ---
// Input.GetAxis("Mouse ScrollWheel") даёт значение:
// > 0 если крутим вверх (приближение)
// < 0 если крутим вниз (отдаление)
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0f)
{
// Для 2D камеры меняем orthographicSize
cam.orthographicSize -= scroll * zoomSpeed;
// Ограничиваем размер, чтобы камера не улетела слишком близко или далеко
cam.orthographicSize = Mathf.Clamp(cam.orthographicSize, minSize, maxSize);
}
}
}


Что важно знать
- Ортографическая камера — используй для 2D, тайлов, стратегий. В инспекторе поставь Projection: Orthographic.
- Скорости (dragSpeed, zoomSpeed) сейчас используются по-разному: для перетаскивания скорость жёстко не регулируется (движение 1:1). Если хочешь замедлить перетаскивание — умножай difference на dragSpeed * Time.deltaTime. Но обычно 1:1 удобнее.
- Ограничения: minSize и maxSize подбирай под размер своей карты. Чтобы камера не выходила за края, можно добавить проверку границ (это уже другая тема).

📌 Сохрани пост — пригодится в любом проекте с картой.
🔔 Подпишись — дальше будет про инерцию, ограничение краёв карты и сглаживание движения.
👉 Akrus Games | Unity

💬 А ты камеру двигаешь или оставляешь статичной? Пиши в комментах.
17👍3🎄2🔥1
⚔️ 2D-стратегия: выделение юнитов рамкой за 5 минут

Делаешь RTS или тактику в 2D? Показываю, как реализовать выделение нескольких юнитов рамкой. Весь код ниже — бери и пользуйся.

Суть: зажимаешь ЛКМ, тащишь — рисуется прямоугольник. Отпускаешь — все юниты внутри становятся выбранными.

Что понадобится:
- У всех юнитов должен быть Collider2D (Box, Circle — любой).
- Юниты лежат на слое Units (так проще фильтровать).
- На сцене есть камера с тегом MainCamera.

Код менеджера выделения (вешаем на пустой объект):

using UnityEngine;

public class SelectionManager : MonoBehaviour
{
[SerializeField] private LayerMask unitLayerMask; // Слой юнитов в инспекторе
private Vector2 startMousePos;
private bool isDragging = false;
private Rect selectionRect;

void Update()
{
// Начало выделения
if (Input.GetMouseButtonDown(0))
{
startMousePos = Input.mousePosition;
isDragging = true;
}

// Завершение выделения
if (Input.GetMouseButtonUp(0) && isDragging)
{
isDragging = false;
SelectUnitsInRect();
}

// Обновление рамки (для отрисовки)
if (isDragging)
{
UpdateSelectionRect();
}
}

void UpdateSelectionRect()
{
Vector2 currentMousePos = Input.mousePosition;
selectionRect = new Rect(
Mathf.Min(startMousePos.x, currentMousePos.x),
Mathf.Min(startMousePos.y, currentMousePos.y),
Mathf.Abs(startMousePos.x - currentMousePos.x),
Mathf.Abs(startMousePos.y - currentMousePos.y)
);
}

void SelectUnitsInRect()
{
// Конвертируем экранные координаты в мировые
Vector2 min = Camera.main.ScreenToWorldPoint(selectionRect.min);
Vector2 max = Camera.main.ScreenToWorldPoint(selectionRect.max);

// Ищем все коллайдеры внутри прямоугольника
Collider2D[] hits = Physics2D.OverlapAreaAll(min, max, unitLayerMask);

// Сначала снимаем выделение со всех
DeselectAllUnits();

// Выделяем найденных
foreach (var hit in hits)
{
if (hit.TryGetComponent<Unit>(out var unit))
{
unit.SetSelected(true);
}
}
}

void DeselectAllUnits()
{
// Можно найти всех юнитов по тегу или держать список
// Для простоты — ищем все объекты с компонентом Unit
Unit[] allUnits = FindObjectsOfType<Unit>();
foreach (var unit in allUnits)
{
unit.SetSelected(false);
}
}

// Визуализация рамки в редакторе (для отладки)
void OnGUI()
{
if (isDragging)
{
// Конвертируем экранный rect в GUI-координаты
Rect guiRect = new Rect(
selectionRect.x,
Screen.height - selectionRect.y - selectionRect.height,
selectionRect.width,
selectionRect.height
);
GUI.Box(guiRect, "");
}
}
}


Компонент Unit (вешаем на каждого юнита):

using UnityEngine;

public class Unit : MonoBehaviour
{
[SerializeField] private GameObject selectionVisual; // например, спрайт кружка под юнитом

public void SetSelected(bool selected)
{
if (selectionVisual != null)
selectionVisual.SetActive(selected);
}
}


Лайфхак:
- Не забудь в инспекторе у SelectionManager выставить слой Units в поле unitLayerMask.
- Чтобы рамка рисовалась красиво, используй не GUI.Box, а натяни на Canvas обычный Image и двигай его размеры. Но для старта хватит и этого.
- FindObjectsOfType в DeselectAllUnits — не самый производительный вариант. Для продакшена лучше держать список всех юнитов в менеджере и обновлять его при спавне/смерти.

Готово. Теперь зажимай мышку и выделяй армию!

Хочешь такое же передвижение камеры с помощью курсора? Тогда читай
этот пост!

🔔 Подпишись, чтобы видеть новые гайды!
👉 Akrus Games | Unity
🔥82
Как делать UI, который не ломается

📌 Middle-уровень — это не просто «UI работает». Это UI, который масштабируется, адаптируется и не разваливается на любом экране.

1️⃣ Canvas Scaler: Scale With Screen Size

UI Scale Mode: Scale With Screen Size
Reference Resolution: 1920 x 1080 (или 1080 x 1920 для вертикали)


📌 UI масштабируется пропорционально экрану. Не забудь установить Screen Match Mode в Match Width Or Height.

2️⃣ Layout Group + ContentSizeFitter — друг, но с оглядкой

📌 Уходи от фиксированных размеров. Пусть элементы растягиваются и подстраиваются.
НО: ContentSizeFitter тяжёлый в Scroll View. На списках — лучше вручную контролировать размеры через LayoutElement.

3️⃣ Safe Area — must have на мобилках

📌 Используй Screen.safeArea и адаптируй UI под вырезы, чёлки, панели.
Особенно важно для iPhone X+, Samsung с закруглёнными краями.

Есть готовые плагины (например, SafeArea.cs) — или пиши свой, обрезая RectTransform под safeArea.

4️⃣ Anchors и Pivot — основа адаптивного UI

📌 Никогда не ставь UI в абсолютные координаты.
Используй anchorMin и anchorMax — например, чтобы кнопка «назад» всегда оставалась в левом верхнем углу, независимо от разрешения.

5️⃣ UI Manager — централизованное управление интерфейсом

📌 Используй один UIManager, который управляет:
• текущими экранами (через стэк или FSM)
• открытием/закрытием окон
• блокировкой ввода
• переходами (анимации, звук, пауза)

💡 Идеально: событийная архитектура. Панель не знает о других панелях — всё через UIManager.Show("Settings").

🎯 Почему это важно?
UI — это первое, что видит игрок. Даже простая игра выглядит “профессионально”, если у неё стабильный и адаптивный интерфейс.

💬 Что у тебя чаще всего ломается в UI?
🔔 Подписывайся — впереди посты про оптимизацию, UI-архитектуру и best practices

👉Akrus Games | Unity
11👍2🔥1🎄1
Мы объединились и создали лучшую папку каналов по геймдеву "The Gamedev"!

Это место, где собраны самые полезные, активные и вдохновляющие каналы индустрии, где каждый разработчик найдёт для себя что-то действительно ценное:

🧑‍💻 Помощь и практические советы по разработке игр

🆓 Бесплатные раздачи ассетов и промокоды

📣 Актуальные новости геймдева

📱 Советы по заработку на разных игровых площадках

📱 Авторские каналы по геймдизайну

📸 Личные блоги разработчиков


Подключайтесь к папке The GameDev и станьте частью сильного комьюнити!

👉https://t.me/addlist/Ca1yrpya6iwxYzky
6🔥3
⚡️ Патруль врага в 2D платформере

Когда враг ходит туда‑сюда между двумя точками — базовая механика любого платформера.

Сохраняй, пригодится в каждом втором проекте! 👇

Компоненты: PointA, PointB(границы патрулирования) + Rigidbody2D (кинематик или динамик – по желанию).

using UnityEngine;

public class Patrol : MonoBehaviour
{
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private float speed = 3f;

private Rigidbody2D rb;
private Transform targetPoint;

void Start()
{
rb = GetComponent<Rigidbody2D>();
targetPoint = pointA;
}

void FixedUpdate()
{
// направление к цели
Vector2 direction = (targetPoint.position - transform.position).normalized;

// двигаем через velocity (сохраняем гравитацию по Y)
rb.velocity = new Vector2(direction.x * speed, rb.velocity.y);

// если почти дошли по X – меняем цель
if (Mathf.Abs(targetPoint.position.x - transform.position.x) < 0.1f)
{
targetPoint = targetPoint == pointA ? pointB : pointA;
// разворачиваем спрайт (опционально)
Flip();
}
}

private void Flip()
{
Vector3 scale = transform.localScale;
scale.x *= -1;
transform.localScale = scale;
}
}



Плюсы: враг не пройдёт сквозь стены, реагирует на физику.
Минусы: нужно следить за застреванием (можно добавить Raycast для проверки края).

📌 Сохрани пост, чтобы не потерять коды.
🔔 Подпишись – дальше будет ещё больше готовых решений для 2D и не только.

👉 Akrus Games | Unity
7🔥3👎1😁1
⚡️ Unity: шпаргалка по Input

Сохрани, чтобы управление в твоей игре всегда работало чётко! Два основных подхода — старый и новый.

1️⃣ Классический Input Manager (Input.GetKey)

Старый добрый способ, который все знают. Идеален для быстрого прототипа.

// Движение
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");

// Прыжок
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}

// ЛКМ
if (Input.GetMouseButtonDown(0))
{
Shoot();
}

Быстро и понятно
Жёстко зашито в коде, сложно переключать схемы управления

2️⃣ Новая система Input System (Unity Package)

Мощный и гибкий инструмент. Нужно поставить через Package Manager.

📌 Сначала настрой Input Actions:
• Создай Action Map (например, "Player")
• Добавь Actions ("Move", "Jump", "Fire")
• Назначь кнопки (WASD, Space, Mouse)

using UnityEngine.InputSystem;

// Чтение вектора движения
private void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>();
// перемещаем объект
}

// Обработка одиночного нажатия
private void OnJump(InputValue value)
{
if (value.isPressed) Jump();
}

Переключаемые схемы управления (геймпад, клавиатура)
Автоматическая ремаппинг кнопок
Нужно время на настройку

🔥 Важно:
• Для нового Input System не забудь PlayerInput компонент на объект
• В Build Settings → Player → Active Input Handling выбери "Both"

💬 Какую систему используешь ты? Классику или новую?
🔔 Подпишись — впереди ещё много шпаргалок по Unity и C#!

👉Akrus Games | Unity
🔥116
ИИ
Если бы не было чатагпт, не было таких цен на оперативную память, скорость работы программирования не возросла, не было бы этого канала.
Большинство из вас использует ИИ. Я в том числе.
Однако у ИИ есть проблема — он любит фантазировать, очень много фантазировать. Чтобы этого избежать, нужна правильная структура запроса.
Вот вам полезный промт, который убирает лишнюю "фантазию" ИИ:
Прежде чем дать мне ответ, оцени его
неопределённость. Если она больше, чем 0.1 — задавай
мне уточняющие вопросы до тех пор, пока
неопределённость будет 0.1 или меньше


Чтобы составить свой промт, надо:
1. Объяснить что ты делаешь
2. Что ты уже сделал
3. Объяснить, что должен сделать ИИ
4. Добавить примеры по возможности.

Используя эти 4 пункта и промт, можно достать максимум из ИИ
8🔥1