Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход
Программирование в Unity Шаг 206 из 210

Создание и использование анализатора Roslyn

Вы можете использовать анализаторы кода для проверки кода на наличие ошибок, нарушений правил и проблем со стилем кодирования. Как и в случае с генераторами исходных кодов, вы можете использовать существующие анализаторы или создать собственные.

Чтобы создать анализатор Roslyn в вашем IDE и затем применить его для использования в вашем проекте Unity:

  1. В своей IDE создайте проект библиотеки классов C#, ориентированный на .NET Standard 2.0, и назовите проект ExampleAnalyzer.

  2. Установите Microsoft.CodeAnalysis.Csharp NuGet пакет для проекта. Ваш анализатор должен использовать Microsoft.CodeAnalysis.Csharp 4.3 работать с Unity.

  3. В вашем проекте IDE создайте новый файл C# и добавьте следующий код:

    using System.Collections.Immutable;
    using Microsoft.CodeAnalysis;
    using Microsoft.CodeAnalysis.CSharp;
    using Microsoft.CodeAnalysis.CSharp.Syntax;
    using Microsoft.CodeAnalysis.Diagnostics;
    
    namespace ExampleAnalyzer
    {
    [DiagnosticAnalyzer(LanguageNames.CSharp)]
    public class DebugLogAnalyzer : DiagnosticAnalyzer
    {
        public const string DiagnosticId = "EX0001";
    
        private static readonly LocalizableString Title =
            "Avoid using Debug.Log";
    
        private static readonly LocalizableString MessageFormat =
            "Debug.Log call detected - consider removing it before shipping";
    
        private static readonly LocalizableString Description =
            "Debug.Log calls can impact performance and clutter the console in production builds.";
    
        private const string Category = "Usage";
    
        private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
            DiagnosticId,
            Title,
            MessageFormat,
            Category,
            DiagnosticSeverity.Warning,
            isEnabledByDefault: true,
            description: Description);
    
        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
            ImmutableArray.Create(Rule);
    
        public override void Initialize(AnalysisContext context)
        {
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
            context.EnableConcurrentExecution();
            context.RegisterSyntaxNodeAction(AnalyzeInvocation, SyntaxKind.InvocationExpression);
        }
    
        private static void AnalyzeInvocation(SyntaxNodeAnalysisContext context)
        {
            var invocation = (InvocationExpressionSyntax)context.Node;
    
            if (!(invocation.Expression is MemberAccessExpressionSyntax memberAccess))
                return;
    
            // Match calls where the method name is "Log"
            if (memberAccess.Name.Identifier.Text != "Log")
                return;
    
            // Verify the symbol belongs to UnityEngine.Debug
            var symbolInfo = context.SemanticModel.GetSymbolInfo(memberAccess);
            if (!(symbolInfo.Symbol is IMethodSymbol methodSymbol))
                return;
    
            var containingType = methodSymbol.ContainingType;
            if (containingType?.ToDisplayString() != "UnityEngine.Debug")
                return;
    
            var diagnostic = Diagnostic.Create(Rule, memberAccess.GetLocation());
            context.ReportDiagnostic(diagnostic);
        }
    }
       }
    
    
  4. Создайте свой анализатор с выпуск конфигурация сборки.

  5. В папке проекта анализатора найдите файл bin/Release/netstandard2.0/ExampleAnalyzer.dll.

  6. Скопируйте этот файл в ваш проект Unity, в папку Assets.

  7. В Asset Browser нажмите на файл .dll, чтобы открыть окно Плагин Inspector.

  8. В Выберите платформы для плагина, снимите флажок Любая платформа.

  9. В Включить платформыснимите флажок Редактор и Автономный и любые другие отмеченные платформы.

  10. В разделе Метки активовнажмите на значок метки, чтобы открыть подменю Метки ассетов.

  11. Создайте и назначьте новую метку под названием RoslynAnalyzer. Чтобы сделать это, введите RoslynAnalyzer в поле ввода текста подменю Метки ассетов и нажмите Enter. Эта метка должна точно соответствовать и учитывать регистр букв. После создания метка появится в подменю Метки ассетов. Вы можете нажать на название метки в меню, чтобы назначить ее другим анализаторам.

  12. Чтобы проверить, работает ли анализатор, создайте в Редакторе новый скрипт MonoBehaviour со следующим кодом:

    using UnityEngine;
    
    public class TestScript : MonoBehaviour
    {
        void Start()
        {
            Debug.Log("Hello world"); // Should trigger EX0001 warning
        }
    }
    

После того, как Unity перекомпилирует скрипты, в Консоли появляется следующее предупреждение:

TestScript.cs(8,9): warning EX0001: Debug.Log call detected - consider removing it before shipping

Дополнительные сведения о создании анализаторов Roslyn см. в документации Microsoft в разделе Учебник: написание первого анализатора и исправление кода.

Диагностика анализатора отчетов

Чтобы просмотреть информацию, такую как общее время выполнения анализаторов и генераторов источников или относительное время выполнения каждого анализатора или генератора источников, перейдите в Изменить > Настройки (macOS: Unity > Настройки) > Диагностика редактора > Ядро и включите EnableDomainReloadTimings. При включении эта информация отображается в окне консоли.

Дополнительные ресурсы