From d1249cb28116be2f46042a53575d9efefea32112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=AD=E9=B9=A4?= Date: Thu, 22 May 2025 17:23:12 +0800 Subject: [PATCH 1/3] feat: add support for creating PhysicsMaterial assets --- UnityMcpBridge/Editor/Tools/ManageAsset.cs | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/UnityMcpBridge/Editor/Tools/ManageAsset.cs b/UnityMcpBridge/Editor/Tools/ManageAsset.cs index 7a0dad7..35df474 100644 --- a/UnityMcpBridge/Editor/Tools/ManageAsset.cs +++ b/UnityMcpBridge/Editor/Tools/ManageAsset.cs @@ -177,6 +177,14 @@ namespace UnityMcpBridge.Editor.Tools AssetDatabase.CreateAsset(mat, fullPath); newAsset = mat; } + else if (lowerAssetType == "physicsmaterial") + { + PhysicsMaterial pmat = new PhysicsMaterial(); + if (properties != null) + ApplyPhysicsMaterialProperties(pmat, properties); + AssetDatabase.CreateAsset(pmat, fullPath); + newAsset = pmat; + } else if (lowerAssetType == "scriptableobject") { string scriptClassName = properties?["scriptClass"]?.ToString(); @@ -948,6 +956,74 @@ namespace UnityMcpBridge.Editor.Tools return modified; } + private static bool ApplyPhysicsMaterialProperties(PhysicsMaterial pmat, JObject properties) + { + if (pmat == null || properties == null) + return false; + bool modified = false; + + // Example: Set dynamic friction + if (properties["DynamicFriction"]?.Type == JTokenType.Float) + { + float dynamicFriction = properties["DynamicFriction"].ToObject(); + pmat.dynamicFriction = dynamicFriction; + modified = true; + } + + // Example: Set static friction + if (properties["StaticFriction"]?.Type == JTokenType.Float) + { + float staticFriction = properties["StaticFriction"].ToObject(); + pmat.staticFriction = staticFriction; + modified = true; + } + + // Example: Set bounciness + if (properties["Bounciness"]?.Type == JTokenType.Float) + { + float bounciness = properties["Bounciness"].ToObject(); + pmat.bounciness = bounciness; + modified = true; + } + + List averageList = new List{"ave", "Ave", "average", "Average"}; + List multiplyList = new List{"mul", "Mul", "mult", "Mult", "multiply", "Multiply"}; + List minimumList = new List{"min", "Min", "minimum", "Minimum"}; + List maximumList = new List{"max", "Max", "maximum", "Maximum"}; + + // Example: Set friction combine + if (properties["FrictionCombine"]?.Type == JTokenType.String) + { + string frictionCombine = properties["FrictionCombine"].ToString(); + if (averageList.Contains(frictionCombine)) + pmat.frictionCombine = PhysicsMaterialCombine.Average; + else if (multiplyList.Contains(frictionCombine)) + pmat.frictionCombine = PhysicsMaterialCombine.Multiply; + else if (minimumList.Contains(frictionCombine)) + pmat.frictionCombine = PhysicsMaterialCombine.Minimum; + else if (maximumList.Contains(frictionCombine)) + pmat.frictionCombine = PhysicsMaterialCombine.Maximum; + modified = true; + } + + // Example: Set bounce combine + if (properties["BounceCombine"]?.Type == JTokenType.String) + { + string bounceCombine = properties["BounceCombine"].ToString(); + if (averageList.Contains(bounceCombine)) + pmat.bounceCombine = PhysicsMaterialCombine.Average; + else if (multiplyList.Contains(bounceCombine)) + pmat.bounceCombine = PhysicsMaterialCombine.Multiply; + else if (minimumList.Contains(bounceCombine)) + pmat.bounceCombine = PhysicsMaterialCombine.Minimum; + else if (maximumList.Contains(bounceCombine)) + pmat.bounceCombine = PhysicsMaterialCombine.Maximum; + modified = true; + } + + return modified; + } + /// /// Generic helper to set properties on any UnityEngine.Object using reflection. /// From 77ed43bac531a87dbaa76987acff3a767a7dc740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=AD=E9=B9=A4?= Date: Thu, 22 May 2025 19:48:16 +0800 Subject: [PATCH 2/3] docs: add summary for ApplyPhysicsMaterialProperties method --- UnityMcpBridge/Editor/Tools/ManageAsset.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UnityMcpBridge/Editor/Tools/ManageAsset.cs b/UnityMcpBridge/Editor/Tools/ManageAsset.cs index 35df474..aeeb08e 100644 --- a/UnityMcpBridge/Editor/Tools/ManageAsset.cs +++ b/UnityMcpBridge/Editor/Tools/ManageAsset.cs @@ -956,6 +956,9 @@ namespace UnityMcpBridge.Editor.Tools return modified; } + /// + /// Applies properties from JObject to a PhysicsMaterial. + /// private static bool ApplyPhysicsMaterialProperties(PhysicsMaterial pmat, JObject properties) { if (pmat == null || properties == null) From 21fbac60c21d376af9f788dff8d002aaed529aba Mon Sep 17 00:00:00 2001 From: Scriptwonder <1300285021@qq.com> Date: Sun, 13 Jul 2025 14:33:06 -0400 Subject: [PATCH 3/3] Update for PhysicsMaterial 1. Fixing to ensure both version of PhysicMaterial works, editing PhysicsMaterial properties to camelCase 2. Add example output on server --- UnityMcpBridge/Editor/Tools/ManageAsset.cs | 40 +++++++++++++--------- UnityMcpServer/src/tools/manage_asset.py | 3 ++ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/UnityMcpBridge/Editor/Tools/ManageAsset.cs b/UnityMcpBridge/Editor/Tools/ManageAsset.cs index aeeb08e..90657b2 100644 --- a/UnityMcpBridge/Editor/Tools/ManageAsset.cs +++ b/UnityMcpBridge/Editor/Tools/ManageAsset.cs @@ -8,6 +8,14 @@ using UnityEditor; using UnityEngine; using UnityMcpBridge.Editor.Helpers; // For Response class +#if UNITY_6000_0_OR_NEWER +using PhysicsMaterialType = UnityEngine.PhysicsMaterial; +using PhysicsMaterialCombine = UnityEngine.PhysicsMaterialCombine; +#else +using PhysicsMaterialType = UnityEngine.PhysicMaterial; +using PhysicsMaterialCombine = UnityEngine.PhysicMaterialCombine; +#endif + namespace UnityMcpBridge.Editor.Tools { /// @@ -179,7 +187,7 @@ namespace UnityMcpBridge.Editor.Tools } else if (lowerAssetType == "physicsmaterial") { - PhysicsMaterial pmat = new PhysicsMaterial(); + PhysicsMaterialType pmat = new PhysicsMaterialType(); if (properties != null) ApplyPhysicsMaterialProperties(pmat, properties); AssetDatabase.CreateAsset(pmat, fullPath); @@ -959,45 +967,45 @@ namespace UnityMcpBridge.Editor.Tools /// /// Applies properties from JObject to a PhysicsMaterial. /// - private static bool ApplyPhysicsMaterialProperties(PhysicsMaterial pmat, JObject properties) + private static bool ApplyPhysicsMaterialProperties(PhysicsMaterialType pmat, JObject properties) { if (pmat == null || properties == null) return false; bool modified = false; // Example: Set dynamic friction - if (properties["DynamicFriction"]?.Type == JTokenType.Float) + if (properties["dynamicFriction"]?.Type == JTokenType.Float) { - float dynamicFriction = properties["DynamicFriction"].ToObject(); + float dynamicFriction = properties["dynamicFriction"].ToObject(); pmat.dynamicFriction = dynamicFriction; modified = true; } // Example: Set static friction - if (properties["StaticFriction"]?.Type == JTokenType.Float) + if (properties["staticFriction"]?.Type == JTokenType.Float) { - float staticFriction = properties["StaticFriction"].ToObject(); + float staticFriction = properties["staticFriction"].ToObject(); pmat.staticFriction = staticFriction; modified = true; } // Example: Set bounciness - if (properties["Bounciness"]?.Type == JTokenType.Float) + if (properties["bounciness"]?.Type == JTokenType.Float) { - float bounciness = properties["Bounciness"].ToObject(); + float bounciness = properties["bounciness"].ToObject(); pmat.bounciness = bounciness; modified = true; } - List averageList = new List{"ave", "Ave", "average", "Average"}; - List multiplyList = new List{"mul", "Mul", "mult", "Mult", "multiply", "Multiply"}; - List minimumList = new List{"min", "Min", "minimum", "Minimum"}; - List maximumList = new List{"max", "Max", "maximum", "Maximum"}; + List averageList = new List { "ave", "Ave", "average", "Average" }; + List multiplyList = new List { "mul", "Mul", "mult", "Mult", "multiply", "Multiply" }; + List minimumList = new List { "min", "Min", "minimum", "Minimum" }; + List maximumList = new List { "max", "Max", "maximum", "Maximum" }; // Example: Set friction combine - if (properties["FrictionCombine"]?.Type == JTokenType.String) + if (properties["frictionCombine"]?.Type == JTokenType.String) { - string frictionCombine = properties["FrictionCombine"].ToString(); + string frictionCombine = properties["frictionCombine"].ToString(); if (averageList.Contains(frictionCombine)) pmat.frictionCombine = PhysicsMaterialCombine.Average; else if (multiplyList.Contains(frictionCombine)) @@ -1010,9 +1018,9 @@ namespace UnityMcpBridge.Editor.Tools } // Example: Set bounce combine - if (properties["BounceCombine"]?.Type == JTokenType.String) + if (properties["bounceCombine"]?.Type == JTokenType.String) { - string bounceCombine = properties["BounceCombine"].ToString(); + string bounceCombine = properties["bounceCombine"].ToString(); if (averageList.Contains(bounceCombine)) pmat.bounceCombine = PhysicsMaterialCombine.Average; else if (multiplyList.Contains(bounceCombine)) diff --git a/UnityMcpServer/src/tools/manage_asset.py b/UnityMcpServer/src/tools/manage_asset.py index 328b85a..dada66b 100644 --- a/UnityMcpServer/src/tools/manage_asset.py +++ b/UnityMcpServer/src/tools/manage_asset.py @@ -33,6 +33,9 @@ def register_manage_asset_tools(mcp: FastMCP): path: Asset path (e.g., "Materials/MyMaterial.mat") or search scope. asset_type: Asset type (e.g., 'Material', 'Folder') - required for 'create'. properties: Dictionary of properties for 'create'/'modify'. + example properties for Material: {"color": [1, 0, 0, 1], "shader": "Standard"}. + example properties for Texture: {"width": 1024, "height": 1024, "format": "RGBA32"}. + example properties for PhysicsMaterial: {"bounciness": 1.0, "staticFriction": 0.5, "dynamicFriction": 0.5}. destination: Target path for 'duplicate'/'move'. search_pattern: Search pattern (e.g., '*.prefab'). filter_*: Filters for search (type, date).