升级XR插件版本
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#nullable disable
|
||||
using MCPForUnity.Editor.Helpers;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
|
||||
namespace MCPForUnity.Editor.Tools.GameObjects
|
||||
{
|
||||
internal static class GameObjectDuplicate
|
||||
{
|
||||
internal static object Handle(JObject @params, JToken targetToken, string searchMethod)
|
||||
{
|
||||
GameObject sourceGo = ManageGameObjectCommon.FindObjectInternal(targetToken, searchMethod);
|
||||
if (sourceGo == null)
|
||||
{
|
||||
return new ErrorResponse($"Target GameObject ('{targetToken}') not found using method '{searchMethod ?? "default"}'.");
|
||||
}
|
||||
|
||||
string newName = @params["new_name"]?.ToString();
|
||||
Vector3? position = VectorParsing.ParseVector3(@params["position"]);
|
||||
Vector3? offset = VectorParsing.ParseVector3(@params["offset"]);
|
||||
JToken parentToken = @params["parent"];
|
||||
|
||||
GameObject duplicatedGo = UnityEngine.Object.Instantiate(sourceGo);
|
||||
Undo.RegisterCreatedObjectUndo(duplicatedGo, $"Duplicate {sourceGo.name}");
|
||||
|
||||
if (!string.IsNullOrEmpty(newName))
|
||||
{
|
||||
duplicatedGo.name = newName;
|
||||
}
|
||||
else
|
||||
{
|
||||
duplicatedGo.name = sourceGo.name.Replace("(Clone)", "").Trim() + "_Copy";
|
||||
}
|
||||
|
||||
if (position.HasValue)
|
||||
{
|
||||
duplicatedGo.transform.position = position.Value;
|
||||
}
|
||||
else if (offset.HasValue)
|
||||
{
|
||||
duplicatedGo.transform.position = sourceGo.transform.position + offset.Value;
|
||||
}
|
||||
|
||||
if (parentToken != null)
|
||||
{
|
||||
if (parentToken.Type == JTokenType.Null || (parentToken.Type == JTokenType.String && string.IsNullOrEmpty(parentToken.ToString())))
|
||||
{
|
||||
duplicatedGo.transform.SetParent(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
GameObject newParent = ManageGameObjectCommon.FindObjectInternal(parentToken, "by_id_or_name_or_path");
|
||||
if (newParent != null)
|
||||
{
|
||||
duplicatedGo.transform.SetParent(newParent.transform, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
McpLog.Warn($"[ManageGameObject.Duplicate] Parent '{parentToken}' not found. Object will remain at root level.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
duplicatedGo.transform.SetParent(sourceGo.transform.parent, true);
|
||||
}
|
||||
|
||||
EditorUtility.SetDirty(duplicatedGo);
|
||||
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
|
||||
|
||||
Selection.activeGameObject = duplicatedGo;
|
||||
|
||||
return new SuccessResponse(
|
||||
$"Duplicated '{sourceGo.name}' as '{duplicatedGo.name}'.",
|
||||
new
|
||||
{
|
||||
originalName = sourceGo.name,
|
||||
originalId = sourceGo.GetInstanceID(),
|
||||
duplicatedObject = Helpers.GameObjectSerializer.GetGameObjectData(duplicatedGo)
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user