Update warning message for Camera Capture (#661)
parent
140a7e5c55
commit
424df879d4
|
|
@ -361,6 +361,41 @@ namespace MCPForUnity.Editor.Tools
|
||||||
{
|
{
|
||||||
int resolvedSuperSize = (superSize.HasValue && superSize.Value > 0) ? superSize.Value : 1;
|
int resolvedSuperSize = (superSize.HasValue && superSize.Value > 0) ? superSize.Value : 1;
|
||||||
|
|
||||||
|
// Batch mode warning
|
||||||
|
if (Application.isBatchMode)
|
||||||
|
{
|
||||||
|
McpLog.Warn("[ManageScene] Screenshot capture in batch mode uses camera-based fallback. Results may vary.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Screen Capture module availability and warn if not available
|
||||||
|
bool screenCaptureAvailable = ScreenshotUtility.IsScreenCaptureModuleAvailable;
|
||||||
|
bool hasCameraFallback = Camera.main != null || UnityEngine.Object.FindObjectsOfType<Camera>().Length > 0;
|
||||||
|
|
||||||
|
#if UNITY_2022_1_OR_NEWER
|
||||||
|
if (!screenCaptureAvailable && !hasCameraFallback)
|
||||||
|
{
|
||||||
|
return new ErrorResponse(
|
||||||
|
"Cannot capture screenshot. The Screen Capture module is not enabled and no Camera was found in the scene. " +
|
||||||
|
"Please either: (1) Enable the Screen Capture module: Window > Package Manager > Built-in > Screen Capture > Enable, " +
|
||||||
|
"or (2) Add a Camera to your scene for camera-based fallback capture."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!screenCaptureAvailable)
|
||||||
|
{
|
||||||
|
McpLog.Warn("[ManageScene] Screen Capture module not enabled. Using camera-based fallback. " +
|
||||||
|
"For best results, enable it: Window > Package Manager > Built-in > Screen Capture > Enable.");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (!hasCameraFallback)
|
||||||
|
{
|
||||||
|
return new ErrorResponse(
|
||||||
|
"No camera found in the scene. Screenshot capture on Unity versions before 2022.1 requires a Camera in the scene. " +
|
||||||
|
"Please add a Camera to your scene or upgrade to Unity 2022.1+ for ScreenCapture API support."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Best-effort: ensure Game View exists and repaints before capture.
|
// Best-effort: ensure Game View exists and repaints before capture.
|
||||||
if (!Application.isBatchMode)
|
if (!Application.isBatchMode)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,34 @@ namespace MCPForUnity.Runtime.Helpers
|
||||||
{
|
{
|
||||||
private const string ScreenshotsFolderName = "Screenshots";
|
private const string ScreenshotsFolderName = "Screenshots";
|
||||||
private static bool s_loggedLegacyScreenCaptureFallback;
|
private static bool s_loggedLegacyScreenCaptureFallback;
|
||||||
|
private static bool? s_screenCaptureModuleAvailable;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the Screen Capture module (com.unity.modules.screencapture) is enabled.
|
||||||
|
/// This module can be disabled in Package Manager > Built-in, which removes the ScreenCapture class.
|
||||||
|
/// </summary>
|
||||||
|
public static bool IsScreenCaptureModuleAvailable
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!s_screenCaptureModuleAvailable.HasValue)
|
||||||
|
{
|
||||||
|
// Check if ScreenCapture type exists (module might be disabled)
|
||||||
|
s_screenCaptureModuleAvailable = Type.GetType("UnityEngine.ScreenCapture, UnityEngine.ScreenCaptureModule") != null
|
||||||
|
|| Type.GetType("UnityEngine.ScreenCapture, UnityEngine.CoreModule") != null;
|
||||||
|
}
|
||||||
|
return s_screenCaptureModuleAvailable.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Error message to display when Screen Capture module is not available.
|
||||||
|
/// </summary>
|
||||||
|
public const string ScreenCaptureModuleNotAvailableError =
|
||||||
|
"The Screen Capture module (com.unity.modules.screencapture) is not enabled. " +
|
||||||
|
"To use screenshot capture with ScreenCapture API, please enable it in Unity: " +
|
||||||
|
"Window > Package Manager > Built-in > Screen Capture > Enable. " +
|
||||||
|
"Alternatively, MCP for Unity will use camera-based capture as a fallback if a Camera exists in the scene.";
|
||||||
|
|
||||||
private static Camera FindAvailableCamera()
|
private static Camera FindAvailableCamera()
|
||||||
{
|
{
|
||||||
|
|
@ -55,24 +83,46 @@ namespace MCPForUnity.Runtime.Helpers
|
||||||
public static ScreenshotCaptureResult CaptureToAssetsFolder(string fileName = null, int superSize = 1, bool ensureUniqueFileName = true)
|
public static ScreenshotCaptureResult CaptureToAssetsFolder(string fileName = null, int superSize = 1, bool ensureUniqueFileName = true)
|
||||||
{
|
{
|
||||||
#if UNITY_2022_1_OR_NEWER
|
#if UNITY_2022_1_OR_NEWER
|
||||||
|
// Check if Screen Capture module is available (can be disabled in Package Manager > Built-in)
|
||||||
|
if (IsScreenCaptureModuleAvailable)
|
||||||
|
{
|
||||||
ScreenshotCaptureResult result = PrepareCaptureResult(fileName, superSize, ensureUniqueFileName, isAsync: true);
|
ScreenshotCaptureResult result = PrepareCaptureResult(fileName, superSize, ensureUniqueFileName, isAsync: true);
|
||||||
ScreenCapture.CaptureScreenshot(result.AssetsRelativePath, result.SuperSize);
|
ScreenCapture.CaptureScreenshot(result.AssetsRelativePath, result.SuperSize);
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Module disabled - try camera fallback
|
||||||
|
Debug.LogWarning("[MCP for Unity] " + ScreenCaptureModuleNotAvailableError);
|
||||||
|
return CaptureWithCameraFallback(fileName, superSize, ensureUniqueFileName);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
// Unity < 2022.1 - always use camera fallback
|
||||||
|
return CaptureWithCameraFallback(fileName, superSize, ensureUniqueFileName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ScreenshotCaptureResult CaptureWithCameraFallback(string fileName, int superSize, bool ensureUniqueFileName)
|
||||||
|
{
|
||||||
if (!s_loggedLegacyScreenCaptureFallback)
|
if (!s_loggedLegacyScreenCaptureFallback)
|
||||||
{
|
{
|
||||||
Debug.Log("ScreenCapture is supported after Unity 2022.1. Using camera capture as fallback.");
|
Debug.Log("[MCP for Unity] Using camera-based screenshot capture. " +
|
||||||
|
"This requires a Camera in the scene. For best results on Unity 2022.1+, ensure the Screen Capture module is enabled: " +
|
||||||
|
"Window > Package Manager > Built-in > Screen Capture > Enable.");
|
||||||
s_loggedLegacyScreenCaptureFallback = true;
|
s_loggedLegacyScreenCaptureFallback = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cam = FindAvailableCamera();
|
var cam = FindAvailableCamera();
|
||||||
if (cam == null)
|
if (cam == null)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("No camera found to capture screenshot.");
|
throw new InvalidOperationException(
|
||||||
|
"No camera found to capture screenshot. Camera-based capture requires a Camera in the scene. " +
|
||||||
|
"Either add a Camera to your scene, or enable the Screen Capture module: " +
|
||||||
|
"Window > Package Manager > Built-in > Screen Capture > Enable."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CaptureFromCameraToAssetsFolder(cam, fileName, superSize, ensureUniqueFileName);
|
return CaptureFromCameraToAssetsFolder(cam, fileName, superSize, ensureUniqueFileName);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue