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] 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. ///