Решение
Зачем нужна система событий?
Система событий (Event System) — это паттерн для слабой связанности между компонентами игры. Вместо того чтобы один объект напрямую вызывал методы другого (что создаёт жёсткие зависимости), они используют события как посредников. Например, вместо прямого вызова UIManager.UpdateScore() из PlayerScript, Player опубликует событие ScoreChangedEvent, а UI подпишется на него. Это делает код более модульным, тестируемым и расширяемым.
Реализация EventManager
using UnityEngine;
using System;
using System.Collections.Generic;
Решение
Что такое Singleton в Unity?
Singleton — паттерн проектирования, который гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к нему. В игровых проектах Singleton используется для менеджеров (GameManager, AudioManager, UIManager и т.д.), которые должны быть уникальными и доступны из любой части кода. Правильная реализация должна быть потокобезопасной и обрабатывать специфику Unity.
Реализация Singleton<T>
using UnityEngine;
using System;
Решение: Следование камеры за персонажем
Архитектура
Хорошая система слежения камеры критична для комфортного геймплея. Рассмотрю оба варианта: с Cinemachine (встроенный инструмент) и ручную реализацию с Lerp.
Вариант 1: Собственная реализация (рекомендуется)
using UnityEngine;
Решение
Архитектура системы сохранения
Хорошая система сохранения должна быть надёжной, простой в использовании и защищённой от ошибок. Я реализую трёхуровневую архитектуру: SaveData (структура), SaveManager (логика), и интеграцию с игровыми системами.
1. Структура данных SaveData
using UnityEngine;
using System;
using System.Collections.Generic;
/// <summary>Данные о позиции и ориентации</summary>
[System.Serializable]
public struct Vector3Serializable
{
public float x, y, z;
public Vector3Serializable(Vector3 v)
{
x = v.x;
y = v.y;
z = v.z;
}
public Vector3 ToVector3() => new Vector3(x, y, z);
}
Решение: Система Drag and Drop для UI элементов
Эта задача требует создания гибкой системы перетаскивания с валидацией, визуальной обратной связью и событиями. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
DraggableItem - Компонент перетаскивания
public interface IDraggable
{
void OnBeginDrag(PointerEventData eventData);
void OnDrag(PointerEventData eventData);
void OnEndDrag(PointerEventData eventData);
ItemData GetItemData();
bool CanBeDragged();
}
Система прокачки и уровней персонажа
Реализую полнофункциональную систему развития персонажа с опытом, уровнями, деревом навыков, прокачкой статов и сохранением прогресса. Используется ScriptableObject конфиги и JSON сериализация.
Модель персонажа и опыта
[System.Serializable]
public class CharacterStats
{
public int strength = 10; // Сила - увеличивает урон и здоровье
public int agility = 10; // Ловкость - увеличивает защиту и скорость
public int intelligence = 10; // Интеллект - увеличивает ману и урон магии
public int maxHealth;
public int currentHealth;
public int maxMana;
public int currentMana;
public float armor; // Защита
public float physicalDamage; // Урон
public void RecalculateStats()
{
maxHealth = 100 + strength * 5;
maxMana = 50 + intelligence * 3;
armor = agility * 0.5f;
physicalDamage = 10f + strength * 1.5f;
}
}
Решение
Интерполяция позиции объекта
Основная задача: плавно передвигать объект к цели с постоянной скоростью. Есть несколько подходов: Vector3.MoveTowards (встроенный метод), Vector3.Lerp (интерполяция) или ручной расчёт. Рассмотрю оба варианта.
Вариант 1: Vector3.MoveTowards (рекомендуется)
using UnityEngine;
Решение
Архитектура системы здоровья
Хорошая система здоровья должна быть модульной, расширяемой и событийной. Я реализую отдельные компоненты: Health (логика), HealthBar (UI), и систему брони для защиты. События позволяют другим системам реагировать на урон и смерть.
1. Компонент Health с защитой и неуязвимостью
using UnityEngine;
using System;
Решение
Что такое Object Pool?
Объектный пул — это паттерн проектирования, который переиспользует объекты вместо их постоянного создания и уничтожения. Это критически важно в Unity для оптимизации производительности, так как операции Instantiate() и Destroy() — дорогостоящие и могут вызвать сборку мусора (GC spikes). Пул особенно полезен для пуль, врагов, эффектов и других часто создаваемых объектов.
Реализация ObjectPool<T>
using System.Collections.Generic;
using UnityEngine;
Решение: Система патрулирования врага AI
Эта задача требует реализации интеллектуальной системы передвижения врага между точками с поддержкой различных режимов движения, анимаций и визуализации в редакторе. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
PatrolPath - Определение маршрута
[System.Serializable]
public class PatrolWaypoint
{
public Vector3 Position { get; set; }
public float StopDuration { get; set; } = 1f;
public float Speed { get; set; } = 5f;
public float WaitRadius { get; set; } = 0.5f;
}
Решение
Архитектура AudioManager
Хороший аудио менеджер должен быть простым, гибким и эффективным. Я реализую систему с поддержкой пула AudioSource для звуковых эффектов, раздельным управлением музыкой и SFX, а также плавными кроссфейдами между треками.
Основной AudioManager
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
Решение
Подход к движению персонажа
Плавное движение от третьего лица требует координации трёх компонентов: ввода, движения и поворота. Важно использовать Time.deltaTime для независимости от FPS, Quaternion.Slerp для плавного поворота и правильное разделение логики физики (FixedUpdate) и контроля (Update). Я предоставлю решение с Rigidbody, которое более гибко для игр с физикой.
Реализация с Rigidbody
using UnityEngine;
Решение
Что такое FSM (Finite State Machine)?
Конечный автомат — фундаментальный паттерн для управления поведением ИИ в играх. FSM позволяет разбить сложное поведение на дискретные состояния и чётко определённые переходы между ними. Это делает код предсказуемым, легко тестируемым и расширяемым. Враг может быть в одном состоянии одновременно (Idle, Patrol, Chase или Attack), и логика переходов определяется условиями окружения.
Базовая реализация FSM
using UnityEngine;
using System;
Trading System for RPG
Merchant System
Complete trading system with merchant inventory, buy/sell mechanics, dynamic pricing, and reputation system.
Core Components
MerchantInventory - Manages merchant stock with separate buy and sell prices. Supports limited money pool and automatic restocking.
MerchantManager - Handles buy/sell transactions with price calculations, reputation tracking, and discount application.
TradeItem - Data structure with item reference, quantity, buy price, and sell price.
ShopUI - User interface for browsing items, selecting quantities, and confirming transactions.
Features
Bonuses Implemented
Wave System
Implementation
Complete wave management system with configurable enemy waves, difficulty scaling, spawn points, and UI display.
Architecture
Features
Система крафта предметов в Unity
Создам модульную архитектуру на основе ScriptableObject и Manager паттернов. Система должна быть гибкой, расширяемой и удобной в использовании.
Структура рецепта (ScriptableObject)
[System.Serializable]
public struct RecipeIngredient
{
public Item item;
public int quantity;
}
public class Recipe : ScriptableObject
{
[SerializeField] private string recipeName;
[SerializeField] private List<RecipeIngredient> ingredients;
[SerializeField] private Item result;
[SerializeField] private int resultQuantity = 1;
[SerializeField] private float craftingTime = 5f;
[SerializeField] private int requiredSkillLevel = 1;
[SerializeField] private bool isUnlocked;
Решение: Система достижений для игры
Эта задача требует создания гибкой системы достижений с различными типами отслеживания, сохранением прогресса и UI для отображения. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
AchievementDefinition - ScriptableObject
public enum AchievementType
{
Counter, // Счетчик (убить 100 врагов)
OneTime, // Разовое событие (пройти уровень)
Collection // Коллекция (собрать все предметы)
}
[System.Serializable]
public class AchievementProgress
{
public string achievementId;
public bool unlocked = false;
public int progress = 0;
public System.DateTime unlockedDate;
public float completionPercent = 0f;
}
Решение: Система урона с типами элементов
Эта задача требует создания гибкой системы урона с поддержкой различных элементов, сопротивлений, статус-эффектов и комбинаций. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
DamageType и конфигурация
public enum ElementType
{
Physical,
Fire,
Ice,
Lightning,
Water,
Wind,
Earth,
Light,
Dark
}
public enum StatusEffect
{
None,
Burning, // Огонь
Frozen, // Лед
Shocked, // Молния
Poisoned, // Яд
Stunned, // Оглушение
Bleeding, // Кровотечение
Weakened // Ослабление
}
Решение: Система способностей для action игры
Эта задача требует создания гибкой системы способностей с различными типами, управлением ресурсами и UI-отображением кулдаунов. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
Базовый класс Ability
Решение
Анализ типичных проблем с производительностью
В Unity есть несколько паттернов, которые серьёзно замораживают игру. Самые частые ошибки:
1. GetComponent в Update — этот метод выполняет поиск по компонентам каждый кадр (O(n) сложность).
2. FindGameObjectsWithTag в Update — поиск по всем объектам каждый кадр очень дорог.
3. Использование строк в Animator — хеширование строк происходит каждый раз.
4. Создание Vector3 в Update — выделение памяти каждый кадр вызывает GC spikes.
5. LINQ в Update — Where, Select и другие операции создают временные массивы.
Неоптимизированный код
Решение: Система мини-карты для игры
Эта задача требует создания интерактивной мини-карты с отслеживанием игрока, врагов и целей, с поддержкой различных режимов ориентации. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
MinimapCamera - Камера мини-карты
Решение
Архитектура системы квестов
Хорошая система квестов должна быть гибкой, модульной и событийной. Я реализую: QuestData (описание), Quest (runtime), QuestManager (контроль), и QuestUI (отображение).
1. ScriptableObject для квестов
using UnityEngine;
using System.Collections.Generic;
/// <summary>Типы квестов</summary>
public enum QuestType
{
CollectItems, // Собрать предметы
KillEnemies, // Убить врагов
ReachLocation, // Дойти до точки
TalkToNPC // Поговорить с NPC
}
/// <summary>Статусы квеста</summary>
public enum QuestStatus
{
Locked, // Недоступен
Active, // В прогрессе
Completed, // Завершён
Failed // Провален
}
/// <summary>Награда за квест</summary>
[System.Serializable]
public class QuestReward
{
public int experiencePoints = 100;
public int gold = 50;
public List<string> itemRewards = new List<string>();
}
Решение: Игра с гравитацией - Flappy Bird улучшенный
Это задача требует создания динамичной игры с физикой гравитации, процедурной генерацией препятствий и интерактивным управлением. Опису полную архитектуру решения.
Архитектура системы
Основные компоненты:
BallController - Физика и управление
Решение
Архитектура Endless Runner
Endless Runner требует: управления персонажем, процедурной генерации уровня, системы препятствий, монет, и скорости. Я реализую модульную архитектуру с использованием пулинга для оптимизации.
1. Менеджер игры
using UnityEngine;
using System;
using System.Collections;
Решение Space Invaders
Архитектура игры
Space Invaders требует координации нескольких систем: управления группой врагов, стрельбы, столкновений, UI и score. Я использую паттерны, которые были в предыдущих задачах: Object Pool для пуль, Event System для событий, и модульную архитектуру.
1. Менеджер игры и состояния
using UnityEngine;
using System;
Архитектура решения для Quiz-игры на Unity
Я разработал бы эту игру с использованием MVC-подхода (Model-View-Controller), что обеспечит чистую архитектуру и легкую поддержку. Проект будет состоять из нескольких ключевых компонентов.
1. Модель данных (GameData)
using System.Collections.Generic;
[System.Serializable]
public class QuizData
{
public List<QuizLevel> levels = new List<QuizLevel>();
public int totalScore = 0;
public int currentLevelIndex = 0;
}
[System.Serializable]
public class QuizLevel
{
public string word;
public string category;
public Difficulty difficulty;
public int baseScore;
public List<char> availableLetters;
}
public enum Difficulty
{
Easy, // Короткие слова, больше попыток
Medium, // Средней длины
Hard // Длинные слова, меньше попыток
}
2. Управление игровой логикой (GameController)
Решение: Система туториала для игры
Эта задача требует создания гибкой системы туториала с пошаговым обучением, подсветкой элементов и отслеживанием прогресса. Расскажу о полной архитектуре.
Архитектура системы
Основные компоненты:
TutorialStep - Описание шага
public enum TutorialStepType
{
ShowUI, // Показать подсказку с текстом
HighlightUI, // Подсветить элемент UI
BlockInput, // Заблокировать ввод до действия
ShowArrow, // Показать стрелку
WaitForInput, // Ждать конкретного ввода
WaitForEvent // Ждать события
}
Система волн врагов для Tower Defense/Survival
Полнофункциональная система управления волнами с конфигурацией, масштабированием сложности, мультиплексированием спавна врагов и поддержкой бесконечного режима.
Структура конфигурации волны
[System.Serializable]
public struct EnemySpawnData
{
public EnemyType enemyType;
public int quantity;
public float spawnInterval; // Интервал между спавном одного типа врагов
}
public class WaveConfig : ScriptableObject
{
[SerializeField] private int waveNumber;
[SerializeField] private List<EnemySpawnData> enemies;
[SerializeField] private float baseDifficulty = 1f;
[SerializeField] private bool isBossWave;
[SerializeField] private EnemyType bossType;
public int WaveNumber => waveNumber;
public List<EnemySpawnData> Enemies => enemies;
public float BaseDifficulty => baseDifficulty;
public bool IsBossWave => isBossWave;
public EnemyType BossType => bossType;
}