135 lines
5.4 KiB
C#
135 lines
5.4 KiB
C#
using System;
|
|
using Newtonsoft.Json.Linq;
|
|
using MCPForUnity.Editor.Helpers;
|
|
|
|
namespace MCPForUnity.Editor.Tools.Cameras
|
|
{
|
|
[McpForUnityTool("manage_camera", AutoRegister = false)]
|
|
public static class ManageCamera
|
|
{
|
|
public static object HandleCommand(JObject @params)
|
|
{
|
|
if (@params == null)
|
|
return new ErrorResponse("Parameters cannot be null.");
|
|
|
|
var p = new ToolParams(@params);
|
|
string action = p.Get("action")?.ToLowerInvariant();
|
|
|
|
if (string.IsNullOrEmpty(action))
|
|
return new ErrorResponse("'action' parameter is required.");
|
|
|
|
try
|
|
{
|
|
// Tier 1: Always-available actions (basic Camera fallback)
|
|
switch (action)
|
|
{
|
|
case "ping":
|
|
return new
|
|
{
|
|
success = true,
|
|
message = CameraHelpers.HasCinemachine
|
|
? "Cinemachine is available."
|
|
: "Cinemachine not installed. Basic Camera operations available.",
|
|
data = new
|
|
{
|
|
cinemachine = CameraHelpers.HasCinemachine,
|
|
version = CameraHelpers.GetCinemachineVersion()
|
|
}
|
|
};
|
|
|
|
case "create_camera":
|
|
return CameraHelpers.HasCinemachine
|
|
? CameraCreate.CreateCinemachineCamera(@params)
|
|
: CameraCreate.CreateBasicCamera(@params);
|
|
|
|
case "set_target":
|
|
return CameraHelpers.HasCinemachine
|
|
? CameraConfigure.SetCinemachineTarget(@params)
|
|
: CameraConfigure.SetBasicCameraTarget(@params);
|
|
|
|
case "set_lens":
|
|
return CameraHelpers.HasCinemachine
|
|
? CameraConfigure.SetCinemachineLens(@params)
|
|
: CameraConfigure.SetBasicCameraLens(@params);
|
|
|
|
case "set_priority":
|
|
return CameraHelpers.HasCinemachine
|
|
? CameraConfigure.SetCinemachinePriority(@params)
|
|
: CameraConfigure.SetBasicCameraPriority(@params);
|
|
|
|
case "list_cameras":
|
|
return CameraControl.ListCameras(@params);
|
|
|
|
case "screenshot":
|
|
case "screenshot_multiview":
|
|
{
|
|
// Delegate to ManageScene's screenshot infrastructure
|
|
var shotParams = new JObject(@params);
|
|
shotParams["action"] = "screenshot";
|
|
if (action == "screenshot_multiview")
|
|
{
|
|
shotParams["batch"] = "surround";
|
|
shotParams["includeImage"] = true;
|
|
}
|
|
return ManageScene.HandleCommand(shotParams);
|
|
}
|
|
}
|
|
|
|
// Tier 2: Cinemachine-only actions
|
|
if (!CameraHelpers.HasCinemachine)
|
|
{
|
|
return new ErrorResponse(
|
|
$"Action '{action}' requires the Cinemachine package (com.unity.cinemachine). "
|
|
+ CameraHelpers.GetFallbackSuggestion(action));
|
|
}
|
|
|
|
switch (action)
|
|
{
|
|
case "ensure_brain":
|
|
return CameraCreate.EnsureBrain(@params);
|
|
|
|
case "get_brain_status":
|
|
return CameraControl.GetBrainStatus(@params);
|
|
|
|
case "set_body":
|
|
return CameraConfigure.SetBody(@params);
|
|
|
|
case "set_aim":
|
|
return CameraConfigure.SetAim(@params);
|
|
|
|
case "set_noise":
|
|
return CameraConfigure.SetNoise(@params);
|
|
|
|
case "add_extension":
|
|
return CameraConfigure.AddExtension(@params);
|
|
|
|
case "remove_extension":
|
|
return CameraConfigure.RemoveExtension(@params);
|
|
|
|
case "set_blend":
|
|
return CameraControl.SetBlend(@params);
|
|
|
|
case "force_camera":
|
|
return CameraControl.ForceCamera(@params);
|
|
|
|
case "release_override":
|
|
return CameraControl.ReleaseOverride(@params);
|
|
|
|
default:
|
|
return new ErrorResponse(
|
|
$"Unknown action: '{action}'. Valid actions: ping, create_camera, set_target, "
|
|
+ "set_lens, set_priority, list_cameras, screenshot, screenshot_multiview, "
|
|
+ "ensure_brain, get_brain_status, "
|
|
+ "set_body, set_aim, set_noise, add_extension, remove_extension, "
|
|
+ "set_blend, force_camera, release_override.");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
McpLog.Error($"[ManageCamera] Action '{action}' failed: {ex}");
|
|
return new ErrorResponse($"Error in action '{action}': {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
}
|