Files
coplaydev--unity-mcp/MCPForUnity/Editor/Tools/Profiler/Operations/SessionOps.cs
T
2026-07-13 12:49:17 +08:00

103 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using MCPForUnity.Editor.Helpers;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.Profiling;
using UProfiler = UnityEngine.Profiling.Profiler;
namespace MCPForUnity.Editor.Tools.Profiler
{
internal static class SessionOps
{
private static readonly string[] AreaNames = Enum.GetNames(typeof(ProfilerArea));
internal static object Start(JObject @params)
{
var p = new ToolParams(@params);
string logFile = p.Get("log_file");
bool enableCallstacks = p.GetBool("enable_callstacks");
UProfiler.enabled = true;
if (!string.IsNullOrEmpty(logFile))
{
string dir = Path.GetDirectoryName(logFile);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
return new ErrorResponse($"Log file directory does not exist: {dir}");
UProfiler.logFile = logFile;
UProfiler.enableBinaryLog = true;
}
if (enableCallstacks)
UProfiler.enableAllocationCallstacks = true;
return new SuccessResponse("Profiler started.", new
{
enabled = UProfiler.enabled,
recording = UProfiler.enableBinaryLog,
log_file = UProfiler.enableBinaryLog ? UProfiler.logFile : null,
allocation_callstacks = UProfiler.enableAllocationCallstacks,
});
}
internal static object Stop(JObject @params)
{
string previousLogFile = UProfiler.enableBinaryLog ? UProfiler.logFile : null;
UProfiler.enableBinaryLog = false;
UProfiler.enableAllocationCallstacks = false;
UProfiler.enabled = false;
return new SuccessResponse("Profiler stopped.", new
{
enabled = false,
previous_log_file = previousLogFile,
});
}
internal static object Status(JObject @params)
{
var areas = new Dictionary<string, bool>();
foreach (string name in AreaNames)
{
if (Enum.TryParse<ProfilerArea>(name, out var area))
areas[name] = UProfiler.GetAreaEnabled(area);
}
return new SuccessResponse("Profiler status.", new
{
enabled = UProfiler.enabled,
recording = UProfiler.enableBinaryLog,
log_file = UProfiler.enableBinaryLog ? UProfiler.logFile : null,
allocation_callstacks = UProfiler.enableAllocationCallstacks,
areas,
});
}
internal static object SetAreas(JObject @params)
{
var areasToken = @params["areas"] as JObject;
if (areasToken == null)
return new ErrorResponse($"'areas' parameter required. Valid areas: {string.Join(", ", AreaNames)}");
var updated = new Dictionary<string, bool>();
foreach (var prop in areasToken.Properties())
{
if (!Enum.TryParse<ProfilerArea>(prop.Name, true, out var area))
return new ErrorResponse($"Unknown area '{prop.Name}'. Valid: {string.Join(", ", AreaNames)}");
if (prop.Value.Type != JTokenType.Boolean)
return new ErrorResponse($"Area '{prop.Name}' value must be a boolean (true/false), got: {prop.Value}");
bool enabled = prop.Value.ToObject<bool>();
UProfiler.SetAreaEnabled(area, enabled);
updated[prop.Name] = enabled;
}
return new SuccessResponse($"Updated {updated.Count} profiler area(s).", new { areas = updated });
}
}
}