Skip to content

Commit eb9327c

Browse files
authored
[FIX] Temp Update on Material Assignment (#420)
* Temp Update on Material Assignment Previously it was shader assignment by request or iterative order from URP to Unlit, but LLM usually assign Standard in a URP setting. This small fix introduce the helper to resolve some of the conflicts, while give warnings in the log to show if the user is creating a shader in a non-compatible setting. * Update RenderPipelineUtility.cs
1 parent 84f7b85 commit eb9327c

File tree

3 files changed

+223
-10
lines changed

3 files changed

+223
-10
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
using System;
2+
using UnityEngine;
3+
using UnityEngine.Rendering;
4+
5+
namespace MCPForUnity.Editor.Helpers
6+
{
7+
internal static class RenderPipelineUtility
8+
{
9+
internal enum PipelineKind
10+
{
11+
BuiltIn,
12+
Universal,
13+
HighDefinition,
14+
Custom
15+
}
16+
17+
private static readonly string[] BuiltInLitShaders = { "Standard", "Legacy Shaders/Diffuse" };
18+
private static readonly string[] BuiltInUnlitShaders = { "Unlit/Color", "Unlit/Texture" };
19+
private static readonly string[] UrpLitShaders = { "Universal Render Pipeline/Lit", "Universal Render Pipeline/Simple Lit" };
20+
private static readonly string[] UrpUnlitShaders = { "Universal Render Pipeline/Unlit" };
21+
private static readonly string[] HdrpLitShaders = { "HDRP/Lit", "High Definition Render Pipeline/Lit" };
22+
private static readonly string[] HdrpUnlitShaders = { "HDRP/Unlit", "High Definition Render Pipeline/Unlit" };
23+
24+
internal static PipelineKind GetActivePipeline()
25+
{
26+
var asset = GraphicsSettings.currentRenderPipeline;
27+
if (asset == null)
28+
{
29+
return PipelineKind.BuiltIn;
30+
}
31+
32+
var typeName = asset.GetType().FullName ?? string.Empty;
33+
if (typeName.IndexOf("HighDefinition", StringComparison.OrdinalIgnoreCase) >= 0 ||
34+
typeName.IndexOf("HDRP", StringComparison.OrdinalIgnoreCase) >= 0)
35+
{
36+
return PipelineKind.HighDefinition;
37+
}
38+
39+
if (typeName.IndexOf("Universal", StringComparison.OrdinalIgnoreCase) >= 0 ||
40+
typeName.IndexOf("URP", StringComparison.OrdinalIgnoreCase) >= 0)
41+
{
42+
return PipelineKind.Universal;
43+
}
44+
45+
return PipelineKind.Custom;
46+
}
47+
48+
internal static Shader ResolveShader(string requestedNameOrAlias)
49+
{
50+
var pipeline = GetActivePipeline();
51+
52+
if (!string.IsNullOrWhiteSpace(requestedNameOrAlias))
53+
{
54+
var alias = requestedNameOrAlias.Trim();
55+
var aliasMatch = ResolveAlias(alias, pipeline);
56+
if (aliasMatch != null)
57+
{
58+
WarnIfPipelineMismatch(aliasMatch.name, pipeline);
59+
return aliasMatch;
60+
}
61+
62+
var direct = Shader.Find(alias);
63+
if (direct != null)
64+
{
65+
WarnIfPipelineMismatch(direct.name, pipeline);
66+
return direct;
67+
}
68+
69+
McpLog.Warn($"Shader '{alias}' not found. Falling back to {pipeline} defaults.");
70+
}
71+
72+
var fallback = ResolveDefaultLitShader(pipeline)
73+
?? ResolveDefaultLitShader(PipelineKind.BuiltIn)
74+
?? Shader.Find("Unlit/Color");
75+
76+
if (fallback != null)
77+
{
78+
WarnIfPipelineMismatch(fallback.name, pipeline);
79+
}
80+
81+
return fallback;
82+
}
83+
84+
internal static Shader ResolveDefaultLitShader(PipelineKind pipeline)
85+
{
86+
return pipeline switch
87+
{
88+
PipelineKind.HighDefinition => TryFindShader(HdrpLitShaders) ?? TryFindShader(UrpLitShaders),
89+
PipelineKind.Universal => TryFindShader(UrpLitShaders) ?? TryFindShader(HdrpLitShaders),
90+
PipelineKind.Custom => TryFindShader(BuiltInLitShaders) ?? TryFindShader(UrpLitShaders) ?? TryFindShader(HdrpLitShaders),
91+
_ => TryFindShader(BuiltInLitShaders) ?? Shader.Find("Unlit/Color")
92+
};
93+
}
94+
95+
internal static Shader ResolveDefaultUnlitShader(PipelineKind pipeline)
96+
{
97+
return pipeline switch
98+
{
99+
PipelineKind.HighDefinition => TryFindShader(HdrpUnlitShaders) ?? TryFindShader(UrpUnlitShaders) ?? TryFindShader(BuiltInUnlitShaders),
100+
PipelineKind.Universal => TryFindShader(UrpUnlitShaders) ?? TryFindShader(HdrpUnlitShaders) ?? TryFindShader(BuiltInUnlitShaders),
101+
PipelineKind.Custom => TryFindShader(BuiltInUnlitShaders) ?? TryFindShader(UrpUnlitShaders) ?? TryFindShader(HdrpUnlitShaders),
102+
_ => TryFindShader(BuiltInUnlitShaders)
103+
};
104+
}
105+
106+
private static Shader ResolveAlias(string alias, PipelineKind pipeline)
107+
{
108+
if (string.Equals(alias, "lit", StringComparison.OrdinalIgnoreCase) ||
109+
string.Equals(alias, "default", StringComparison.OrdinalIgnoreCase) ||
110+
string.Equals(alias, "default_lit", StringComparison.OrdinalIgnoreCase))
111+
{
112+
return ResolveDefaultLitShader(pipeline);
113+
}
114+
115+
if (string.Equals(alias, "unlit", StringComparison.OrdinalIgnoreCase))
116+
{
117+
return ResolveDefaultUnlitShader(pipeline);
118+
}
119+
120+
if (string.Equals(alias, "urp_lit", StringComparison.OrdinalIgnoreCase))
121+
{
122+
return TryFindShader(UrpLitShaders);
123+
}
124+
125+
if (string.Equals(alias, "hdrp_lit", StringComparison.OrdinalIgnoreCase))
126+
{
127+
return TryFindShader(HdrpLitShaders);
128+
}
129+
130+
if (string.Equals(alias, "built_in_lit", StringComparison.OrdinalIgnoreCase))
131+
{
132+
return TryFindShader(BuiltInLitShaders);
133+
}
134+
135+
return null;
136+
}
137+
138+
private static Shader TryFindShader(params string[] shaderNames)
139+
{
140+
foreach (var shaderName in shaderNames)
141+
{
142+
var shader = Shader.Find(shaderName);
143+
if (shader != null)
144+
{
145+
return shader;
146+
}
147+
}
148+
return null;
149+
}
150+
151+
private static void WarnIfPipelineMismatch(string shaderName, PipelineKind activePipeline)
152+
{
153+
if (string.IsNullOrEmpty(shaderName))
154+
{
155+
return;
156+
}
157+
158+
var lowerName = shaderName.ToLowerInvariant();
159+
bool shaderLooksUrp = lowerName.Contains("universal render pipeline") || lowerName.Contains("urp/");
160+
bool shaderLooksHdrp = lowerName.Contains("high definition render pipeline") || lowerName.Contains("hdrp/");
161+
bool shaderLooksBuiltin = lowerName.Contains("standard") || lowerName.Contains("legacy shaders/");
162+
bool shaderLooksSrp = shaderLooksUrp || shaderLooksHdrp;
163+
164+
switch (activePipeline)
165+
{
166+
case PipelineKind.HighDefinition:
167+
if (shaderLooksUrp)
168+
{
169+
McpLog.Warn($"[RenderPipelineUtility] Active pipeline is HDRP but shader '{shaderName}' looks URP-based. Asset may appear incorrect.");
170+
}
171+
else if (shaderLooksBuiltin && !shaderLooksHdrp)
172+
{
173+
McpLog.Warn($"[RenderPipelineUtility] Active pipeline is HDRP but shader '{shaderName}' looks Built-in. Consider using an HDRP shader for correct results.");
174+
}
175+
break;
176+
case PipelineKind.Universal:
177+
if (shaderLooksHdrp)
178+
{
179+
McpLog.Warn($"[RenderPipelineUtility] Active pipeline is URP but shader '{shaderName}' looks HDRP-based. Asset may appear incorrect.");
180+
}
181+
else if (shaderLooksBuiltin && !shaderLooksUrp)
182+
{
183+
McpLog.Warn($"[RenderPipelineUtility] Active pipeline is URP but shader '{shaderName}' looks Built-in. Consider using a URP shader for correct results.");
184+
}
185+
break;
186+
case PipelineKind.BuiltIn:
187+
if (shaderLooksSrp)
188+
{
189+
McpLog.Warn($"[RenderPipelineUtility] Active pipeline is Built-in but shader '{shaderName}' targets URP/HDRP. Asset may not render as expected.");
190+
}
191+
break;
192+
}
193+
}
194+
}
195+
}

MCPForUnity/Editor/Helpers/RenderPipelineUtility.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

MCPForUnity/Editor/Tools/ManageAsset.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -196,20 +196,26 @@ private static object CreateAsset(JObject @params)
196196
}
197197
else if (lowerAssetType == "material")
198198
{
199-
// Prefer provided shader; fall back to common pipelines
200199
var requested = properties?["shader"]?.ToString();
201-
Shader shader =
202-
(!string.IsNullOrEmpty(requested) ? Shader.Find(requested) : null)
203-
?? Shader.Find("Universal Render Pipeline/Lit")
204-
?? Shader.Find("HDRP/Lit")
205-
?? Shader.Find("Standard")
206-
?? Shader.Find("Unlit/Color");
200+
Shader shader = RenderPipelineUtility.ResolveShader(requested);
207201
if (shader == null)
208-
return new ErrorResponse($"Could not find a suitable shader (requested: '{requested ?? "none"}').");
202+
return new ErrorResponse($"Could not find a project-compatible shader (requested: '{requested ?? "none"}'). Consider installing URP/HDRP or provide an explicit shader path.");
209203

210204
var mat = new Material(shader);
211205
if (properties != null)
212-
ApplyMaterialProperties(mat, properties);
206+
{
207+
JObject propertiesForApply = properties;
208+
if (propertiesForApply["shader"] != null)
209+
{
210+
propertiesForApply = (JObject)properties.DeepClone();
211+
propertiesForApply.Remove("shader");
212+
}
213+
214+
if (propertiesForApply.HasValues)
215+
{
216+
ApplyMaterialProperties(mat, propertiesForApply);
217+
}
218+
}
213219
AssetDatabase.CreateAsset(mat, fullPath);
214220
newAsset = mat;
215221
}
@@ -901,7 +907,8 @@ private static bool ApplyMaterialProperties(Material mat, JObject properties)
901907
// Example: Set shader
902908
if (properties["shader"]?.Type == JTokenType.String)
903909
{
904-
Shader newShader = Shader.Find(properties["shader"].ToString());
910+
string shaderRequest = properties["shader"].ToString();
911+
Shader newShader = RenderPipelineUtility.ResolveShader(shaderRequest);
905912
if (newShader != null && mat.shader != newShader)
906913
{
907914
mat.shader = newShader;

0 commit comments

Comments
 (0)