Примеры кода

Система Addressables

Загрузка и управление ресурсами через Addressables для оптимизации памяти.

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections.Generic;

public class AddressableManager : MonoBehaviour
{
    [Header("Addressable References")]
    public AssetReference playerPrefab;
    public AssetReference audioClip;
    
    private Dictionary<string, AsyncOperationHandle> loadedAssets = new Dictionary<string, AsyncOperationHandle>();
    
    void Start()
    {
        LoadAddressableAssets();
    }
    
    async void LoadAddressableAssets()
    {
        Debug.Log("Начинаем загрузку Addressable ресурсов");
        
        // Загрузка префаба игрока
        var playerHandle = playerPrefab.LoadAssetAsync<GameObject>();
        await playerHandle.Task;
        
        if (playerHandle.Status == AsyncOperationStatus.Succeeded)
        {
            loadedAssets["player"] = playerHandle;
            var player = Instantiate(playerHandle.Result);
            Debug.Log("Игрок создан из Addressable ресурса");
        }
        
        // Загрузка аудио
        var audioHandle = audioClip.LoadAssetAsync<AudioClip>();
        await audioHandle.Task;
        
        if (audioHandle.Status == AsyncOperationStatus.Succeeded)
        {
            loadedAssets["audio"] = audioHandle;
            PlayAudio(audioHandle.Result);
        }
    }
    
    void PlayAudio(AudioClip clip)
    {
        var audioSource = GetComponent<AudioSource>();
        if (audioSource == null)
            audioSource = gameObject.AddComponent<AudioSource>();
            
        audioSource.clip = clip;
        audioSource.Play();
        Debug.Log("Аудио воспроизводится");
    }
    
    public void UnloadAsset(string key)
    {
        if (loadedAssets.ContainsKey(key))
        {
            Addressables.Release(loadedAssets[key]);
            loadedAssets.Remove(key);
            Debug.Log($"Ресурс {key} выгружен");
        }
    }
    
    void OnDestroy()
    {
        foreach (var asset in loadedAssets.Values)
        {
            Addressables.Release(asset);
        }
        Debug.Log("Все Addressable ресурсы освобождены");
    }
}

Кроссплатформенная разработка

Адаптация игры для разных платформ: Android, WebGL, PC.

using UnityEngine;

public class PlatformManager : MonoBehaviour
{
    public bool enableTouchControls = false;
    public float mobileUIScale = 1.2f;
    public float desktopUIScale = 1.0f;
    
    void Start()
    {
        DetectAndConfigurePlatform();
    }
    
    void DetectAndConfigurePlatform()
    {
        switch (Application.platform)
        {
            case RuntimePlatform.Android:
            case RuntimePlatform.IPhonePlayer:
                SetupMobile();
                break;
                
            case RuntimePlatform.WebGLPlayer:
                SetupWebGL();
                break;
                
            default:
                SetupDesktop();
                break;
        }
        
        Debug.Log($"Платформа: {Application.platform}");
    }
    
    void SetupMobile()
    {
        enableTouchControls = true;
        SetUIScale(mobileUIScale);
        QualitySettings.SetQualityLevel(1); // Низкое качество
        
        Debug.Log("Мобильная конфигурация применена");
    }
    
    void SetupWebGL()
    {
        enableTouchControls = SystemInfo.deviceType == DeviceType.Handheld;
        SetUIScale(enableTouchControls ? mobileUIScale : desktopUIScale);
        QualitySettings.SetQualityLevel(2); // Среднее качество
        
        Debug.Log("WebGL конфигурация применена");
    }
    
    void SetupDesktop()
    {
        enableTouchControls = false;
        SetUIScale(desktopUIScale);
        QualitySettings.SetQualityLevel(4); // Высокое качество
        
        Debug.Log("Десктопная конфигурация применена");
    }
    
    void SetUIScale(float scale)
    {
        var canvas = FindObjectOfType<Canvas>();
        if (canvas != null)
        {
            var scaler = canvas.GetComponent<UnityEngine.UI.CanvasScaler>();
            if (scaler != null)
            {
                scaler.scaleFactor = scale;
            }
        }
    }
}

Аналитика и отслеживание

Сбор данных о поведении игроков и производительности игры.

using UnityEngine;
using System.Collections.Generic;

public class AnalyticsManager : MonoBehaviour
{
    public string gameVersion = "1.0.0";
    
    private float sessionStartTime;
    private int levelCompletions = 0;
    
    void Start()
    {
        InitializeAnalytics();
        TrackSessionStart();
    }
    
    void InitializeAnalytics()
    {
        sessionStartTime = Time.time;
        Debug.Log("Аналитика инициализирована");
    }
    
    void TrackSessionStart()
    {
        var data = new Dictionary<string, object>();
        data["device"] = SystemInfo.deviceModel;
        data["os"] = SystemInfo.operatingSystem;
        data["version"] = gameVersion;
        data["platform"] = Application.platform.ToString();
        
        TrackEvent("session_start", data);
    }
    
    public void TrackEvent(string eventName, Dictionary<string, object> parameters = null)
    {
        var eventData = new Dictionary<string, object>();
        eventData["event"] = eventName;
        eventData["time"] = System.DateTime.Now.ToString();
        eventData["session_time"] = Time.time - sessionStartTime;
        
        if (parameters != null)
        {
            foreach (var param in parameters)
            {
                eventData[param.Key] = param.Value;
            }
        }
        
        Debug.Log($"Событие: {eventName}");
        LogEvent(eventData);
    }
    
    public void TrackLevelComplete(int level, float time)
    {
        levelCompletions++;
        var data = new Dictionary<string, object>();
        data["level"] = level;
        data["completion_time"] = time;
        data["total_completions"] = levelCompletions;
        
        TrackEvent("level_complete", data);
    }
    
    void LogEvent(Dictionary<string, object> data)
    {
        string log = "Аналитика:\n";
        foreach (var item in data)
        {
            log += $"  {item.Key}: {item.Value}\n";
        }
        Debug.Log(log);
    }
}

Монетизация с Unity Ads

Интеграция рекламы и внутриигровых покупок для монетизации.

using UnityEngine;
using UnityEngine.UI;

public class MonetizationManager : MonoBehaviour
{
    [Header("Settings")]
    public string gameId = "1234567";
    public Button watchAdButton;
    public Text coinsText;
    
    private int playerCoins = 0;
    private bool adReady = false;
    
    void Start()
    {
        InitializeMonetization();
        LoadPlayerData();
    }
    
    void InitializeMonetization()
    {
        // Симуляция инициализации Unity Ads
        Invoke("SetAdReady", 2f);
        
        if (watchAdButton != null)
        {
            watchAdButton.onClick.AddListener(ShowRewardedAd);
        }
        
        Debug.Log("Монетизация инициализирована");
    }
    
    void SetAdReady()
    {
        adReady = true;
        UpdateUI();
        Debug.Log("Реклама готова");
    }
    
    void LoadPlayerData()
    {
        playerCoins = PlayerPrefs.GetInt("Coins", 0);
        UpdateUI();
    }
    
    void SavePlayerData()
    {
        PlayerPrefs.SetInt("Coins", playerCoins);
        PlayerPrefs.Save();
    }
    
    public void ShowRewardedAd()
    {
        if (!adReady) return;
        
        Debug.Log("Показ рекламы...");
        adReady = false;
        UpdateUI();
        
        // Симуляция просмотра рекламы
        Invoke("OnAdComplete", 3f);
    }
    
    void OnAdComplete()
    {
        int reward = 50;
        playerCoins += reward;
        SavePlayerData();
        UpdateUI();
        
        Debug.Log($"Получено {reward} монет за рекламу");
        
        // Следующая реклама через 30 секунд
        Invoke("SetAdReady", 30f);
    }
    
    void UpdateUI()
    {
        if (coinsText != null)
        {
            coinsText.text = $"Монеты: {playerCoins}";
        }
        
        if (watchAdButton != null)
        {
            watchAdButton.interactable = adReady;
        }
    }
}

Подготовка к публикации

Автоматизация процесса сборки и подготовки игры к релизу.

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Build.Reporting;
#endif

public class BuildManager : MonoBehaviour
{
    [Header("Build Settings")]
    public string productName = "MyGame";
    public string version = "1.0.0";
    
#if UNITY_EDITOR
    [ContextMenu("Build Android")]
    public void BuildAndroid()
    {
        SetupBuildSettings();
        
        var buildOptions = new BuildPlayerOptions();
        buildOptions.scenes = GetScenePaths();
        buildOptions.locationPathName = $"Builds/Android/{productName}.apk";
        buildOptions.target = BuildTarget.Android;
        buildOptions.options = BuildOptions.None;
        
        Debug.Log("Начало сборки для Android...");
        var report = BuildPipeline.BuildPlayer(buildOptions);
        
        if (report.summary.result == BuildResult.Succeeded)
        {
            Debug.Log("Сборка Android завершена успешно!");
        }
        else
        {
            Debug.LogError("Ошибка сборки Android");
        }
    }
    
    void SetupBuildSettings()
    {
        PlayerSettings.productName = productName;
        PlayerSettings.bundleVersion = version;
        
        // Android настройки
        PlayerSettings.Android.bundleVersionCode++;
        PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel21;
        
        Debug.Log($"Настройки сборки: {productName} v{version}");
    }
    
    string[] GetScenePaths()
    {
        var scenes = new string[EditorBuildSettings.scenes.Length];
        for (int i = 0; i < scenes.Length; i++)
        {
            scenes[i] = EditorBuildSettings.scenes[i].path;
        }
        return scenes;
    }
#endif
}