Примеры кода
Система 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
}