Unity 6.3
0 онлайн 76 гостей 3 в системе
Вход

CompilationPipeline.compilationFinished

Параметры

Параметр Описание
контекст Токен, созданный Unity, который уникально идентифицирует один цикл компиляции и действителен только в течение этого цикла.

Описание

Событие, вызванное на главном потоке при завершении компиляции сборок.

CompilationPipeline.compilationFinished вызывается после последнего CompilationPipeline.assemblyCompilationFinished событие.

Вы можете использовать context чтобы соответствовать CompilationPipeline.compilationStarted и CompilationPipeline.compilationFinished событий, относящихся к одному и тому же циклу компиляции. События начала и окончания компиляции из одного и того же цикла компиляции context пример. context только в качестве идентификатора: сравнивайте по ссылке или используйте его в качестве словарного ключа, но не принимайте никакой структуры или строкового представления.

Если несколько компиляций происходят одновременно или в быстрой последовательности, вы можете использовать context связать время, журналирование, число ошибок или любые данные по компиляции с правильным циклом компиляции. Например, в начале компиляции можно создать запись, на которую ссылается context в качестве ключа и фиксация времени начала или соответствующего состояния. После завершения компиляции ту же запись можно просмотреть с помощью context, вычислить продолжительность, обобщить результаты и очистить.

Примечание: Выполнять сборки плеера или запускать дополнительные задачи компиляции из обратных вызовов не поддерживается, поскольку не гарантируется глобальное состояние Unity, необходимое для выполнения сборки.

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Compilation;

[InitializeOnLoad] public static class CompilationTracker { // Store per-compilation data keyed by the context object private static readonly Dictionary<object, CompilationInfo> _compilations = new();

static CompilationTracker() { CompilationPipeline.compilationStarted += OnCompilationStarted; CompilationPipeline.compilationFinished += OnCompilationFinished; }

private static void OnCompilationStarted(object context) { _compilations[context] = new CompilationInfo { StartTime = DateTime.UtcNow, TriggerSummary = "Scripts changed or domain reload pending" // whatever you want to record };

// Optional: log or prepare resources UnityEngine.Debug.Log("Compilation started"); }

private static void OnCompilationFinished(object context) { if (_compilations.TryGetValue(context, out var info)) { var duration = DateTime.UtcNow - info.StartTime;

// You can also inspect CompilationPipeline.GetAssemblies() or other APIs here UnityEngine.Debug.Log($"Compilation finished in {duration.TotalSeconds:F2}s");

// Clean up _compilations.Remove(context); } else { // In case something slipped through, avoid leaking state UnityEngine.Debug.LogWarning("Compilation finished, but no matching context found."); } }

private class CompilationInfo { public DateTime StartTime; public string TriggerSummary; } }