feat: add support for creating PhysicsMaterial assets

main
亭鹤 2025-05-22 17:23:12 +08:00
parent cbe9b3a2f0
commit d1249cb281
1 changed files with 76 additions and 0 deletions

View File

@ -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<float>();
pmat.dynamicFriction = dynamicFriction;
modified = true;
}
// Example: Set static friction
if (properties["StaticFriction"]?.Type == JTokenType.Float)
{
float staticFriction = properties["StaticFriction"].ToObject<float>();
pmat.staticFriction = staticFriction;
modified = true;
}
// Example: Set bounciness
if (properties["Bounciness"]?.Type == JTokenType.Float)
{
float bounciness = properties["Bounciness"].ToObject<float>();
pmat.bounciness = bounciness;
modified = true;
}
List<String> averageList = new List<String>{"ave", "Ave", "average", "Average"};
List<String> multiplyList = new List<String>{"mul", "Mul", "mult", "Mult", "multiply", "Multiply"};
List<String> minimumList = new List<String>{"min", "Min", "minimum", "Minimum"};
List<String> maximumList = new List<String>{"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;
}
/// <summary>
/// Generic helper to set properties on any UnityEngine.Object using reflection.
/// </summary>