Перейти к основному содержимому

Unity C# — скрипты для новичков

Подборка готовых скриптов Unity на C# с построчным разбором — «что написано» и «зачем так». Материал рассчитан на тех, кто ищет в Google «unity скрипт движение wasd», «monobehaviour пример», «unity прыжок rigidbody», «OnTriggerEnter собрать предмет», «unity instantiate prefab» или готовит лабораторную, курсовую и первый мини-проект в редакторе.


Для кого эта статья

АудиторияЗачем открыть
ШкольникиИнформатика, кружок, первый Unity-проект
СтудентыЛабораторная «игровой движок», зачёт по C#
СамоучкиСкопировать код → прикрепить к объекту → разобрать по таблице
После PythonУже делали Turtle или Pygame — те же идеи (цикл, ввод, счёт), другой синтаксис

Как работать с примером:

  1. Создайте скрипт в Unity (CreateC# Script).
  2. Скопируйте код — имя файла = имя класса (MoveWASD.csclass MoveWASD).
  3. Перетащите скрипт на объект в Hierarchy.
  4. Заполните поля в Inspector (ссылки на объекты, префабы, слои).
  5. Нажмите Play ▶ — смотрите результат и Console при ошибках.

Скрипты запускаются только в Unity Editor или в собранной игре. В браузере, как симулятор Turtle на этой же странице Lab, они не выполняются.

Сначала теория

Установка редактора, окна, GameObject — Разработка на Unity. Синтаксис C# — первая программа, ООП в C# (блок Unity). Lifecycle и API — Справочник по Unity. 2D на Python без движка — Pygame — мини-игры.


Краткий указатель — что ищут в Google

РазделТипичный запрос
Каркас MonoBehaviourunity monobehaviour пример, unity script template, awake start update
Вращение кубаunity rotate object script, transform rotate c#
Движение WASDunity movement wasd, input getaxis horizontal, transform translate
Прыжокunity jump rigidbody, addforce space, fixedupdate physics
Монеткаunity ontriggerenter, collect coin script, comparetag player
Спавнunity instantiate prefab, spawn object on key press
Камераunity camera follow player, lateupdate camera script
UI и счётunity ui button script, update text score
Смена цветаunity change material color, getcomponent renderer
Патруль и врагunity enemy follow player, move towards script
Перезагрузка сценыunity reload scene, scenemanager loadscene
Частые ошибкиnullreferenceexception unity, ontriggerenter not working

Из чего состоит любой Unity-скрипт

В консольном C# программа начинается с static void Main(). В Unity точки входа нет — движок сам вызывает методы вашего класса каждый кадр или один раз при старте.

ЧастьРоль
Файл .csИсходный код; компилируется Unity при сохранении
MonoBehaviourБазовый класс — скрипт становится компонентом на GameObject
[SerializeField]Поле видно в Inspector; значение можно менять без правки кода
transformПозиция, поворот, масштаб этого объекта на сцене
UpdateЛогика каждый кадр — ввод, UI, движение через transform
FixedUpdateШаг физики (~50 раз в секунду) — силы, Rigidbody
Time.deltaTimeСколько секунд прошло с прошлого кадра — без него скорость зависит от FPS

Чем Unity отличается от консольного C# и Pygame

КонсольPygameUnity
СтартMain() один разwhile running вручнуюAwake / Start / Update вызывает движок
МирТолько переменныеОкно + поверхностьСцена с объектами в Inspector
ВводConsole.ReadLineevent.get()Input.GetKey, GetAxis
ВыводWriteLinedraw + flipДвижок рисует 3D/2D сам

Обязательный каркас MonoBehaviour

Любой учебный скрипт повторяет одну структуру. Имя файла и имя класса должны совпадать — иначе Unity покажет ошибку компиляции.

using UnityEngine;

public class MyFirstScript : MonoBehaviour
{
[SerializeField] private float speed = 5f;

void Awake()
{
Debug.Log("Awake: объект создан");
}

void Start()
{
Debug.Log("Start: сцена пошла");
}

void Update()
{
// Каждый кадр — ввод, таймеры, transform.Translate
// Rigidbody — в FixedUpdate
}
}

Разбор сигнатуры класса — по словам

ЧастьСмысл
using UnityEngine;Подключает API движка: MonoBehaviour, Vector3, Input, Debug
public class MyFirstScriptИмя класса = имя файла MyFirstScript.cs
: MonoBehaviourНаследование — без этого Unity не прикрепит скрипт к объекту
[SerializeField] private float speedПоле private, но видно в Inspector; 5f — литерал float
void Awake()Вызывается один раз при создании объекта; кешируйте GetComponent
void Start()Один раз перед первым Update; все Awake уже отработали
void Update()Каждый кадр; умножайте скорость на Time.deltaTime
Debug.Log(...)Белое сообщение в Console; ошибки — Debug.LogError

Порядок вызова lifecycle (важно для экзамена)

МоментМетодПример использования
Объект появилсяAwakerb = GetComponent<Rigidbody>()
Перед первым кадромStartscore = 0, загрузка из PlayerPrefs
Каждый кадрUpdateInput.GetKeyDown, таймеры
Шаг физикиFixedUpdateAddForce, изменение velocity
После всех UpdateLateUpdateКамера следует за игроком

Что попробовать: прикрепите скрипт к Cube, нажмите Play — в Console появятся две строки Awake и Start (порядок всегда такой).

Input Manager

В примерах — классический Input.GetAxis("Horizontal") и Input.GetKeyDown. Он работает в большинстве учебных проектов (WASD и стрелки уже настроены). В новых шаблонах Unity может быть пакет Input System — тогда в Project Settings → Player → Active Input Handling выберите один подход. Подробнее — глава 3.


Стартовые скрипты

Примеры ниже — для 3D-шаблона Unity (Cube, Capsule, Plane). Для 2D используйте Rigidbody2D, Collider2D, OnTriggerEnter2D — логика та же, другие типы.


Вращение объекта

Типичный запрос: unity rotate cube script, transform rotate update.

Задача: куб крутится вокруг вертикальной оси без участия игрока — первый «живой» объект на сцене.

Настройка сцены:

  1. GameObject3D ObjectCube (или используйте куб по умолчанию).
  2. Создайте скрипт RotateCube.cs, вставьте код ниже.
  3. Перетащите скрипт на Cube → Play.
using UnityEngine;

public class RotateCube : MonoBehaviour
{
[SerializeField] private float degreesPerSecond = 90f;

void Update()
{
transform.Rotate(Vector3.up, degreesPerSecond * Time.deltaTime);
}
}

Разбор построчно:

СтрокаЧто происходит
degreesPerSecond = 90fПолный оборот (360°) займёт 4 секунды при 90°/с
void Update()Unity вызывает метод ~60 раз в секунду (зависит от FPS)
transformСсылка на Transform этого Cube — позиция, поворот, масштаб
Vector3.upЕдиничный вектор оси Y (0, 1, 0) — «вертикаль»
Rotate(ось, угол)Поворачивает объект на угол градусов вокруг оси
* Time.deltaTimeДелает скорость независимой от FPS — на 30 FPS и 144 FPS оборот одинаковый

Разбор по смыслу:

  • Без Time.deltaTime на слабом ПК куб крутится медленнее, на мощном — быстрее.
  • transform.Rotate крутит локально (относительно текущего поворота объекта).
  • Поле degreesPerSecond можно менять в Inspector без перекомпиляции — удобно на демонстрации урока.

Что попробовать:

  • Vector3.right — вращение вокруг оси X (куб «крутится на бок»).
  • degreesPerSecond = 180f — в два раза быстрее.
  • Добавьте transform.Rotate(Vector3.up, 45f * Time.deltaTime); и Vector3.forward — двойное вращение.

Движение по WASD

Типичный запрос: unity player movement script c#, wasd movement unity 3d.

Задача: капсула ездит по плоскости стрелками или WASD. Физики нет — объект может проходить сквозь стены (для прототипа это нормально).

Настройка сцены:

  1. Plane — пол (уже есть в 3D-шаблоне).
  2. Capsule — переименуйте в Player, поставьте чуть выше Plane.
  3. Скрипт MoveWASD.cs на Player → Play, двигайте WASD.
using UnityEngine;

public class MoveWASD : MonoBehaviour
{
[SerializeField] private float moveSpeed = 6f;

void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");

Vector3 move = new Vector3(h, 0f, v);
if (move.sqrMagnitude > 1f)
move.Normalize();

transform.Translate(move * moveSpeed * Time.deltaTime, Space.World);
}
}

Разбор построчно:

СтрокаЧто происходит
GetAxis("Horizontal")A/D или ←/→ → значение от −1 до 1 (плавно)
GetAxis("Vertical")W/S или ↑/↓ → то же по оси «вперёд-назад»
new Vector3(h, 0f, v)Направление на плоскости XZ; Y = 0 — не летим
sqrMagnitude > 1fПри одновременном W+D длина вектора ≈ 1.41 — быстрее, чем по одной оси
Normalize()Длина вектора = 1 — диагональ не быстрее прямой
Translate(..., Space.World)Сдвиг в мировых осях; Space.Self — «вперёд» относительно поворота модели
moveSpeed * Time.deltaTimeСкорость в метрах в секунду, а не «метрах за кадр»

Разбор по смыслу:

  • GetAxis даёт плавный ввод (можно подключить геймпад).
  • GetKey(KeyCode.W) — только «включено/выключено», без промежуточных значений.
  • Этот скрипт обходит физику — для финальной игры с коллизиями добавьте Rigidbody (см. прыжок).

Что попробовать: moveSpeed = 12f — в два раза быстрее; поверните Player на 45° и сравните Space.World и Space.Self.


Прыжок и ходьба с Rigidbody

Типичный запрос: unity jump script rigidbody, how to jump in unity c#.

Задача: персонаж ходит по полу с физикой, прыгает по Space один раз, пока стоит на земле.

Настройка сцены:

  1. CapsulePlayer.
  2. Add ComponentRigidbody (Mass = 1, Use Gravity ✓).
  3. RigidbodyConstraints → Freeze Rotation X и Z (капсула не заваливается).
  4. Plane → в Inspector сверху выберите Layer Ground (создайте в Tags and Layers, если нет).
  5. На Player — скрипт PlayerJump.cs; в поле Ground Mask отметьте только слой Ground.
using UnityEngine;

public class PlayerJump : MonoBehaviour
{
[SerializeField] private float moveSpeed = 6f;
[SerializeField] private float jumpForce = 6f;
[SerializeField] private LayerMask groundMask;
[SerializeField] private float groundCheckDistance = 0.2f;

private Rigidbody rb;

void Awake()
{
rb = GetComponent<Rigidbody>();
}

void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}

void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 input = new Vector3(h, 0f, v);
if (input.sqrMagnitude > 1f) input.Normalize();

Vector3 velocity = input * moveSpeed;
#if UNITY_6000_0_OR_NEWER
rb.linearVelocity = new Vector3(velocity.x, rb.linearVelocity.y, velocity.z);
#else
rb.velocity = new Vector3(velocity.x, rb.velocity.y, velocity.z);
#endif
}

bool IsGrounded()
{
return Physics.Raycast(
transform.position,
Vector3.down,
groundCheckDistance + 0.05f,
groundMask);
}
}

Разбор — почему два метода:

МетодЧто делаемПочему не в другом
UpdateGetKeyDown(Space) + прыжокВвод разовый — ловим нажатие один раз
FixedUpdateЗадаём горизонтальную скоростьФизика Unity считается фиксированным шагом (~0.02 с)
AwakeGetComponent<Rigidbody>()Ссылку берём один раз, не каждый кадр

Разбор физики:

СтрокаСмысл
AddForce(..., ForceMode.Impulse)Мгновенный «толчок» вверх — классический прыжок
rb.linearVelocity / rb.velocityСохраняем Y (падение/прыжок), меняем только X и Z
#if UNITY_6000_0_OR_NEWERВ Unity 6 свойство переименовали в linearVelocity
Physics.Raycast внизНевидимый луч: если до пола ≤ distance — «на земле»
groundMaskЛуч игнорирует монетки, врагов, UI — только слой Ground

Частая ошибка: прыжок бесконечный в воздухе — нет IsGrounded() или groundMask не включает слой пола.

Что попробовать: jumpForce = 10f — выше прыжок; в Scene View включите Gizmos и смотрите, упирается ли луч в Plane.


Монетка и счёт (OnTriggerEnter)

Типичный запрос: unity collect coin script, ontriggerenter not working unity.

Задача: игрок касается сферы — она исчезает, счёт +1, в Console печатается результат.

Настройка сцены:

  1. Sphere → имя Coin; Add Component → скрипт CoinPickup.cs.
  2. На Sphere Collider включите Is Trigger ✓.
  3. Edit → Project Settings → Tags and Layers → тег Player и Coin.
  4. Player (Capsule + Rigidbody) → Tag Player.
  5. Пустой объект GameSystems → скрипт ScoreManager.cs (один на сцену).

CoinPickup.cs:

using UnityEngine;

public class CoinPickup : MonoBehaviour
{
[SerializeField] private int value = 1;

void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player")) return;

ScoreManager.Instance?.AddScore(value);
Destroy(gameObject);
}
}

ScoreManager.cs:

using UnityEngine;

public class ScoreManager : MonoBehaviour
{
public static ScoreManager Instance { get; private set; }

public int Score { get; private set; }

void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
}

public void AddScore(int amount)
{
Score += amount;
Debug.Log($"Счёт: {Score}");
}
}

Разбор CoinPickup построчно:

СтрокаСмысл
OnTriggerEnter(Collider other)Unity вызывает, когда триггер и другой collider пересеклись
otherCollider чужого объекта (капсула игрока)
CompareTag("Player")Быстрая проверка тега; не путать с tag == (лишние аллокации)
returnЕсли задел не игрок — выходим, монетка не исчезает
Instance?.AddScore?. — если менеджера нет, не упадём с NullReference
Destroy(gameObject)Удаляет этот GameObject (монетку) из сцены

Разбор ScoreManager — учебный singleton:

СтрокаСмысл
static InstanceОдна «глобальная» ссылка — любой скрипт может вызвать ScoreManager.Instance
if (Instance != null && Instance != this)Второй менеджер на сцене — уничтожаем дубликат
Score &#123; get; private set; &#125;Читать счёт можно откуда угодно, писать — только через AddScore

Чек-лист, если триггер молчит:

Проверка
На монетке Is Trigger
Хотя бы у одного из объектов есть RigidbodyОбычно на Player
Тег Player назначен капсуле, не камере
ScoreManager есть на сцене

Что попробуйте: поставьте 5 монеток — счёт должен дойти до 5; измените value = 10 — +10 за штуку.


Спавн префаба по клавише

Типичный запрос: unity instantiate prefab example, spawn bullet unity.

Задача: по нажатию E в точке FirePoint появляется клон префаба (снаряд, яблоко, враг).

Настройка:

  1. Sphere → настройте → перетащите в папку Prefabs/ (синий куб в Project = префаб).
  2. На Player создайте пустой дочерний объект FirePoint (чуть впереди капсулы).
  3. Скрипт SpawnerOnKey.cs на Player; в Inspector: Prefab ← префаб, Spawn Point ← FirePoint.
using UnityEngine;

public class SpawnerOnKey : MonoBehaviour
{
[SerializeField] private GameObject prefab;
[SerializeField] private Transform spawnPoint;
[SerializeField] private KeyCode key = KeyCode.E;

void Update()
{
if (Input.GetKeyDown(key) && prefab != null && spawnPoint != null)
{
Instantiate(prefab, spawnPoint.position, spawnPoint.rotation);
}
}
}

Разбор построчно:

СтрокаСмысл
GameObject prefabСсылка на ассет в Project, не на объект в Hierarchy
Transform spawnPointОткуда брать позицию и поворот (дочерний объект на модели)
KeyCode key = KeyCode.EКлавиша по умолчанию — меняется в Inspector
GetKeyDownОдин спавн за нажатие; GetKey — каждый кадр, пока держите
prefab != nullЗащита от NullReferenceException, если забыли перетащить префаб
Instantiate(...)Создаёт копию в сцене; оригинал-префаб в Project не исчезает
spawnPoint.rotationКлон «смотрит» туда же, куда FirePoint

Что попробуйте: добавьте на префаб DestroyAfterDelay (ниже) — снаряды исчезают через 3 с и не засоряют сцену.


Камера следует за игроком

Типичный запрос: unity third person camera script, camera follow player c#.

Задача: Main Camera плавно едет за капсулой и смотрит на неё — вид от третьего лица.

Настройка: скрипт на Main Camera; поле Target ← перетащите Player.

using UnityEngine;

public class SimpleCameraFollow : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private Vector3 offset = new Vector3(0f, 2f, -5f);
[SerializeField] private float smooth = 8f;

void LateUpdate()
{
if (target == null) return;

Vector3 desired = target.position + offset;
transform.position = Vector3.Lerp(
transform.position,
desired,
smooth * Time.deltaTime);
transform.LookAt(target);
}
}

Разбор построчно:

СтрокаСмысл
LateUpdateПосле всех Update — игрок уже сдвинулся, камера не «отстаёт на кадр»
offset = (0, 2, -5)Камера выше на 2 м и сзади на 5 м от центра игрока
target.position + offsetЖелаемая точка в мировых координатах
Vector3.Lerp(a, b, t)Плавное приближение от a к b; t = 0..1 за кадр
smooth * Time.deltaTimeЧем больше smooth, тем быстрее камера догоняет
LookAt(target)Поворот камеры лицом к игроку

Что попробуйте: offset = (3, 4, -6) — камера сбоку-сверху; smooth = 2f — более «ленивое» следование.


UI — текст счёта и кнопка

Типичный запрос: unity ui text update script, button onclick c#.

Задача: на экране надпись «Монеты: N» обновляется при сборе; кнопка Restart пишет в Console (или перезагружает сцену).

Настройка:

  1. GameObjectUICanvas (режим Screen Space Overlay).
  2. ПКМ на Canvas → UIText (или TextMeshPro).
  3. ПКМ на Canvas → UIButton — подпись «Restart».
  4. На Canvas — GameUI.cs; перетащите Score Label и Restart Button.
using UnityEngine;
using UnityEngine.UI;

public class GameUI : MonoBehaviour
{
[SerializeField] private Text scoreLabel;
[SerializeField] private Button restartButton;

void OnEnable()
{
if (restartButton != null)
restartButton.onClick.AddListener(OnRestartClicked);
}

void OnDisable()
{
if (restartButton != null)
restartButton.onClick.RemoveListener(OnRestartClicked);
}

void Update()
{
if (scoreLabel != null && ScoreManager.Instance != null)
scoreLabel.text = $"Монеты: {ScoreManager.Instance.Score}";
}

void OnRestartClicked()
{
Debug.Log("Restart — подключите LevelRestart.ReloadCurrentScene");
}
}

Разбор построчно:

СтрокаСмысл
using UnityEngine.UIПространство имён для Text, Button, Slider
OnEnable / OnDisableПодписка при включении объекта; отписка при выключении
onClick.AddListenerПри клике вызовется OnRestartClicked без public-метода в Inspector
RemoveListenerИначе при перезагрузке сцены останутся «висячие» обработчики
$"Монеты: &#123;Score&#125;"Интерполяция строк C# — подставляет число в текст
Update для текстаДля учебного UI достаточно; в больших проектах — событие OnScoreChanged

Связка с монетками: работает вместе с ScoreManager — соберите монетку, цифра на экране вырастет.


Примеры посложнее

Смена цвета по клавише C

Запрос: unity change object color script.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
[SerializeField] private Color[] palette =
{
Color.red, Color.green, Color.blue, Color.yellow
};

private Renderer rend;
private int index;

void Awake()
{
rend = GetComponent<Renderer>();
}

void Update()
{
if (!Input.GetKeyDown(KeyCode.C)) return;

index = (index + 1) % palette.Length;
rend.material.color = palette[index];
}
}

Разбор:

СтрокаСмысл
GetComponent<Renderer>()Компонент, который рисует меш (Mesh Renderer)
Кеш в AwakeGetComponent в Update каждый кадр — лишняя работа
(index + 1) % palette.LengthЦиклический перебор: после жёлтого снова красный
material.colorМеняет экземпляр материала на этом объекте

Исчезновение через время

using UnityEngine;

public class DestroyAfterDelay : MonoBehaviour
{
[SerializeField] private float lifetimeSeconds = 3f;

void Start()
{
Destroy(gameObject, lifetimeSeconds);
}
}
СтрокаСмысл
Destroy(gameObject, delay)Unity сам удалит объект через N секунд — без Update и таймеров
StartТаймер запускается один раз при появлении объекта

Прикрепите к снаряду из спавнера — след от выстрелов не копится бесконечно.


Патруль и преследование игрока

Патруль — враг ездит между двумя точками:

using UnityEngine;

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

private Transform currentTarget;

void Start() => currentTarget = pointB;

void Update()
{
if (pointA == null || pointB == null) return;

transform.position = Vector3.MoveTowards(
transform.position,
currentTarget.position,
speed * Time.deltaTime);

if (Vector3.Distance(transform.position, currentTarget.position) < 0.05f)
currentTarget = currentTarget == pointA ? pointB : pointA;
}
}

Преследование — враг бежит к игроку, но останавливается в stopDistance:

using UnityEngine;

public class ChasePlayer : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float stopDistance = 1.5f;

void Update()
{
if (player == null) return;

Vector3 toPlayer = player.position - transform.position;
toPlayer.y = 0f;

if (toPlayer.magnitude <= stopDistance) return;

transform.position += toPlayer.normalized * speed * Time.deltaTime;
transform.rotation = Quaternion.LookRotation(toPlayer);
}
}

Разбор патруля:

  • MoveTowards — не «перепрыгивает» цель, если FPS просел (в отличие от position = target).
  • 0.05f — порог «дошли»; иначе объект дёргается на месте.
  • Тернарный оператор A ? B : C — переключение цели A ↔ B.

Разбор преследования:

  • toPlayer.y = 0 — враг не «летит» к голове игрока, только по полу.
  • normalized — единичный вектор направления; длина шага задаётся speed * deltaTime.
  • LookRotation — модель поворачивается лицом к игроку.

Перезагрузка сцены

Запрос: unity restart level script.

Сцена должна быть в File → Build Settings → Scenes In Build.

using UnityEngine;
using UnityEngine.SceneManagement;

public class LevelRestart : MonoBehaviour
{
public void ReloadCurrentScene()
{
Scene scene = SceneManager.GetActiveScene();
SceneManager.LoadScene(scene.buildIndex);
}
}
СтрокаСмысл
SceneManagementПространство имён для загрузки сцен
GetActiveScene()Текущая открытая сцена
buildIndexНомер сцены в списке Build Settings
public voidМетод можно привязать к Button → On Click () в Inspector

В GameUI.OnRestartClicked добавьте вызов FindObjectOfType<LevelRestart>()?.ReloadCurrentScene() или ссылку на компонент через [SerializeField].


Частые ошибки новичка

СимптомПричинаРешение
NullReferenceExceptionПустое поле в InspectorПеретащите объект / префаб в [SerializeField]
Скрипт серый, не добавляетсяОшибка компиляцииОткройте Console, исправьте красные строки
«Script class cannot be found»Имя файла ≠ имя классаPlayerMove.csclass PlayerMove
Ничего не происходитНе нажали PlayКод работает только в Play Mode
OnTriggerEnter не вызываетсяНет Rigidbody или не TriggerIs Trigger на монетке; Rigidbody на Player
Персонаж проваливаетсяНет ColliderCollider на поле и на персонаже
Прыжок бесконечныйНет проверки землиRaycast + правильный LayerMask
Движение «рывками» / зависит от FPSНет Time.deltaTimeУмножайте скорость на deltaTime в Update
Движение сквозь стеныТолько transform.TranslateДобавьте Rigidbody + Collider или Character Controller
Tag ... is not definedТег не созданTags and Layers → добавьте Player, Coin
Console — ваш друг

Красная строка содержит файл:строка — двойной клик открывает IDE. Debug.Log — белый текст для отладки; LogWarning — жёлтый; LogError — красный. На зачёте преподаватель часто просит показать Console при Play.


Мини-проект из этой статьи — соберите за один вечер

Свяжите примеры в одну сцену:

  1. PlayerMoveWASD или PlayerJump.
  2. 5× CoinCoinPickup + ScoreManager на GameSystems.
  3. Main CameraSimpleCameraFollow.
  4. CanvasGameUI показывает счёт.
  5. Cube-врагChasePlayer с ссылкой на Player.

Так вы получите бегать → собирать → видеть счёт → убегать от врага — достаточно для доклада или слайдов курсовой.


Куда дальше

  1. Разработка на Unity — white-box, стрельба, NavMesh, UI подробнее.
  2. Unity + C# — учебный маршрут — порядок глав.
  3. Справочник по Unity — lifecycle, слои, API.
  4. 200 вопросов по Unity — самопроверка.
  5. Pygame — мини-игры — тот же игровой цикл на Python.
  6. Roblox / Luau — скрипты — те же механики в Roblox Studio.

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").