Skip to content

Commit 221a14e

Browse files
committed
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.
1 parent 84f7b85 commit 221a14e

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+
Debug.LogWarning($"[RenderPipelineUtility] Active pipeline is HDRP but shader '{shaderName}' looks URP-based. Asset may appear incorrect.");
170+
}
171+
else if (shaderLooksBuiltin && !shaderLooksHdrp)
172+
{
173+
Debug.LogWarning($"[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+
Debug.LogWarning($"[RenderPipelineUtility] Active pipeline is URP but shader '{shaderName}' looks HDRP-based. Asset may appear incorrect.");
180+
}
181+
else if (shaderLooksBuiltin && !shaderLooksUrp)
182+
{
183+
Debug.LogWarning($"[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+
Debug.LogWarning($"[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)