@mflrevan/ucp 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bridge/com.ucp.bridge/CHANGELOG.md +145 -0
- package/bridge/com.ucp.bridge/CHANGELOG.md.meta +7 -0
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs +583 -0
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Bridge.meta +8 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs +425 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetImportSupport.cs +355 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetImportSupport.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs +233 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs +26 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs +31 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs +527 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs +141 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs +326 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ImporterController.cs +209 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ImporterController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs +409 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs +354 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs +93 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PackagesController.cs +503 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PackagesController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs +188 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs +260 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ProfilerController.cs +1679 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ProfilerController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs +563 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneChangeTracker.cs +166 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneChangeTracker.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs +318 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs +125 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs +104 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs +227 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs +240 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs +611 -0
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Controllers.meta +8 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs +53 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs +80 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs +358 -0
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Protocol.meta +8 -0
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs +37 -0
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Editor/Scripts.meta +8 -0
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef +16 -0
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef.meta +7 -0
- package/bridge/com.ucp.bridge/Editor.meta +8 -0
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef +14 -0
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef.meta +7 -0
- package/bridge/com.ucp.bridge/Runtime.meta +8 -0
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs +1085 -0
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs.meta +2 -0
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef +12 -0
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef.meta +7 -0
- package/bridge/com.ucp.bridge/Tests/Editor.meta +8 -0
- package/bridge/com.ucp.bridge/Tests.meta +8 -0
- package/bridge/com.ucp.bridge/package.json +27 -0
- package/bridge/com.ucp.bridge/package.json.meta +7 -0
- package/package.json +2 -2
- package/scripts/install.js +4 -6
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using UnityEditor;
|
|
4
|
+
using UnityEngine;
|
|
5
|
+
using UnityEngine.Rendering;
|
|
6
|
+
|
|
7
|
+
namespace UCP.Bridge
|
|
8
|
+
{
|
|
9
|
+
public static class MaterialController
|
|
10
|
+
{
|
|
11
|
+
public static void Register(CommandRouter router)
|
|
12
|
+
{
|
|
13
|
+
router.Register("material/create", HandleCreate);
|
|
14
|
+
router.Register("material/get-properties", HandleGetProperties);
|
|
15
|
+
router.Register("material/get-property", HandleGetProperty);
|
|
16
|
+
router.Register("material/set-property", HandleSetProperty);
|
|
17
|
+
router.Register("material/get-keywords", HandleGetKeywords);
|
|
18
|
+
router.Register("material/set-keyword", HandleSetKeyword);
|
|
19
|
+
router.Register("material/set-shader", HandleSetShader);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private static object HandleCreate(string paramsJson)
|
|
23
|
+
{
|
|
24
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
25
|
+
if (p == null || !p.TryGetValue("path", out var pathObj) || pathObj == null)
|
|
26
|
+
throw new ArgumentException("Missing 'path' parameter");
|
|
27
|
+
|
|
28
|
+
string path = pathObj.ToString();
|
|
29
|
+
string shaderName = p.TryGetValue("shader", out var shaderObj) && shaderObj != null
|
|
30
|
+
? shaderObj.ToString()
|
|
31
|
+
: null;
|
|
32
|
+
|
|
33
|
+
var shader = ResolveCreateShader(shaderName);
|
|
34
|
+
if (shader == null)
|
|
35
|
+
throw new ArgumentException("Could not resolve a shader for material creation");
|
|
36
|
+
|
|
37
|
+
string dir = System.IO.Path.GetDirectoryName(path);
|
|
38
|
+
if (!string.IsNullOrEmpty(dir) && !AssetDatabase.IsValidFolder(dir))
|
|
39
|
+
{
|
|
40
|
+
CreateFoldersRecursive(dir);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
var material = new Material(shader);
|
|
44
|
+
AssetDatabase.CreateAsset(material, path);
|
|
45
|
+
AssetDatabase.SaveAssets();
|
|
46
|
+
|
|
47
|
+
return new Dictionary<string, object>
|
|
48
|
+
{
|
|
49
|
+
["status"] = "ok",
|
|
50
|
+
["path"] = path,
|
|
51
|
+
["name"] = material.name,
|
|
52
|
+
["shader"] = shader.name,
|
|
53
|
+
["instanceId"] = material.GetInstanceID()
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private static object HandleGetProperties(string paramsJson)
|
|
58
|
+
{
|
|
59
|
+
var mat = ResolveMaterial(paramsJson);
|
|
60
|
+
var shader = mat.shader;
|
|
61
|
+
int count = shader.GetPropertyCount();
|
|
62
|
+
|
|
63
|
+
var properties = new List<object>();
|
|
64
|
+
for (int i = 0; i < count; i++)
|
|
65
|
+
{
|
|
66
|
+
var propName = shader.GetPropertyName(i);
|
|
67
|
+
var propType = shader.GetPropertyType(i);
|
|
68
|
+
var propDesc = shader.GetPropertyDescription(i);
|
|
69
|
+
|
|
70
|
+
var propInfo = new Dictionary<string, object>
|
|
71
|
+
{
|
|
72
|
+
["name"] = propName,
|
|
73
|
+
["type"] = propType.ToString(),
|
|
74
|
+
["description"] = propDesc,
|
|
75
|
+
["value"] = ReadMaterialValue(mat, propName, propType)
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
properties.Add(propInfo);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return new Dictionary<string, object>
|
|
82
|
+
{
|
|
83
|
+
["material"] = mat.name,
|
|
84
|
+
["shader"] = shader.name,
|
|
85
|
+
["properties"] = properties
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private static object HandleGetProperty(string paramsJson)
|
|
90
|
+
{
|
|
91
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
92
|
+
if (p == null || !p.TryGetValue("property", out var propObj))
|
|
93
|
+
throw new ArgumentException("Missing 'property' parameter");
|
|
94
|
+
|
|
95
|
+
var mat = ResolveMaterial(paramsJson);
|
|
96
|
+
string propName = propObj.ToString();
|
|
97
|
+
var shader = mat.shader;
|
|
98
|
+
|
|
99
|
+
int propIdx = shader.FindPropertyIndex(propName);
|
|
100
|
+
if (propIdx < 0)
|
|
101
|
+
throw new ArgumentException($"Property '{propName}' not found on shader {shader.name}");
|
|
102
|
+
|
|
103
|
+
var propType = shader.GetPropertyType(propIdx);
|
|
104
|
+
|
|
105
|
+
return new Dictionary<string, object>
|
|
106
|
+
{
|
|
107
|
+
["material"] = mat.name,
|
|
108
|
+
["property"] = propName,
|
|
109
|
+
["type"] = propType.ToString(),
|
|
110
|
+
["value"] = ReadMaterialValue(mat, propName, propType)
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private static object HandleSetProperty(string paramsJson)
|
|
115
|
+
{
|
|
116
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
117
|
+
if (p == null || !p.TryGetValue("property", out var propObj))
|
|
118
|
+
throw new ArgumentException("Missing 'property' parameter");
|
|
119
|
+
if (!p.ContainsKey("value"))
|
|
120
|
+
throw new ArgumentException("Missing 'value' parameter");
|
|
121
|
+
|
|
122
|
+
var mat = ResolveMaterial(paramsJson);
|
|
123
|
+
string propName = propObj.ToString();
|
|
124
|
+
var shader = mat.shader;
|
|
125
|
+
|
|
126
|
+
int propIdx = shader.FindPropertyIndex(propName);
|
|
127
|
+
if (propIdx < 0)
|
|
128
|
+
throw new ArgumentException($"Property '{propName}' not found on shader {shader.name}");
|
|
129
|
+
|
|
130
|
+
var propType = shader.GetPropertyType(propIdx);
|
|
131
|
+
Undo.RecordObject(mat, $"UCP Set Material {propName}");
|
|
132
|
+
WriteMaterialValue(mat, propName, propType, p["value"]);
|
|
133
|
+
EditorUtility.SetDirty(mat);
|
|
134
|
+
|
|
135
|
+
return new Dictionary<string, object>
|
|
136
|
+
{
|
|
137
|
+
["status"] = "ok",
|
|
138
|
+
["material"] = mat.name,
|
|
139
|
+
["property"] = propName
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private static object HandleGetKeywords(string paramsJson)
|
|
144
|
+
{
|
|
145
|
+
var mat = ResolveMaterial(paramsJson);
|
|
146
|
+
var keywords = new List<object>();
|
|
147
|
+
foreach (var kw in mat.enabledKeywords)
|
|
148
|
+
keywords.Add(kw.name);
|
|
149
|
+
|
|
150
|
+
return new Dictionary<string, object>
|
|
151
|
+
{
|
|
152
|
+
["material"] = mat.name,
|
|
153
|
+
["keywords"] = keywords
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private static object HandleSetKeyword(string paramsJson)
|
|
158
|
+
{
|
|
159
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
160
|
+
if (p == null || !p.TryGetValue("keyword", out var kwObj))
|
|
161
|
+
throw new ArgumentException("Missing 'keyword' parameter");
|
|
162
|
+
if (!p.TryGetValue("enabled", out var enObj))
|
|
163
|
+
throw new ArgumentException("Missing 'enabled' parameter");
|
|
164
|
+
|
|
165
|
+
var mat = ResolveMaterial(paramsJson);
|
|
166
|
+
string keyword = kwObj.ToString();
|
|
167
|
+
bool enabled = Convert.ToBoolean(enObj);
|
|
168
|
+
|
|
169
|
+
Undo.RecordObject(mat, $"UCP Set Keyword {keyword}");
|
|
170
|
+
if (enabled)
|
|
171
|
+
mat.EnableKeyword(keyword);
|
|
172
|
+
else
|
|
173
|
+
mat.DisableKeyword(keyword);
|
|
174
|
+
EditorUtility.SetDirty(mat);
|
|
175
|
+
|
|
176
|
+
return new Dictionary<string, object>
|
|
177
|
+
{
|
|
178
|
+
["status"] = "ok",
|
|
179
|
+
["material"] = mat.name,
|
|
180
|
+
["keyword"] = keyword,
|
|
181
|
+
["enabled"] = enabled
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private static object HandleSetShader(string paramsJson)
|
|
186
|
+
{
|
|
187
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
188
|
+
if (p == null || !p.TryGetValue("shader", out var shaderObj))
|
|
189
|
+
throw new ArgumentException("Missing 'shader' parameter");
|
|
190
|
+
|
|
191
|
+
var mat = ResolveMaterial(paramsJson);
|
|
192
|
+
string shaderName = shaderObj.ToString();
|
|
193
|
+
var shader = Shader.Find(shaderName);
|
|
194
|
+
if (shader == null)
|
|
195
|
+
throw new ArgumentException($"Shader not found: {shaderName}");
|
|
196
|
+
|
|
197
|
+
Undo.RecordObject(mat, "UCP Set Shader");
|
|
198
|
+
mat.shader = shader;
|
|
199
|
+
EditorUtility.SetDirty(mat);
|
|
200
|
+
|
|
201
|
+
return new Dictionary<string, object>
|
|
202
|
+
{
|
|
203
|
+
["status"] = "ok",
|
|
204
|
+
["material"] = mat.name,
|
|
205
|
+
["shader"] = shaderName
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ---- Helper methods ----
|
|
210
|
+
|
|
211
|
+
private static Material ResolveMaterial(string paramsJson)
|
|
212
|
+
{
|
|
213
|
+
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
214
|
+
if (p == null)
|
|
215
|
+
throw new ArgumentException("Invalid parameters");
|
|
216
|
+
|
|
217
|
+
// Resolve by asset path
|
|
218
|
+
if (p.TryGetValue("path", out var pathObj) && pathObj != null)
|
|
219
|
+
{
|
|
220
|
+
string path = pathObj.ToString();
|
|
221
|
+
var mat = AssetDatabase.LoadAssetAtPath<Material>(path);
|
|
222
|
+
if (mat == null)
|
|
223
|
+
throw new ArgumentException($"Material not found at: {path}");
|
|
224
|
+
return mat;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Resolve by instanceId (scene object's renderer material)
|
|
228
|
+
if (p.TryGetValue("instanceId", out var idObj))
|
|
229
|
+
{
|
|
230
|
+
int instanceId = Convert.ToInt32(idObj);
|
|
231
|
+
var obj = EditorUtility.EntityIdToObject(instanceId);
|
|
232
|
+
|
|
233
|
+
if (obj is Material directMat)
|
|
234
|
+
return directMat;
|
|
235
|
+
|
|
236
|
+
if (obj is GameObject go)
|
|
237
|
+
{
|
|
238
|
+
var renderer = go.GetComponent<Renderer>();
|
|
239
|
+
if (renderer != null && renderer.sharedMaterial != null)
|
|
240
|
+
return renderer.sharedMaterial;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
throw new ArgumentException($"No material found for instance {instanceId}");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
throw new ArgumentException("Provide 'path' or 'instanceId' to identify the material");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private static Shader ResolveCreateShader(string shaderName)
|
|
250
|
+
{
|
|
251
|
+
if (!string.IsNullOrWhiteSpace(shaderName))
|
|
252
|
+
return Shader.Find(shaderName);
|
|
253
|
+
|
|
254
|
+
return Shader.Find("Universal Render Pipeline/Lit")
|
|
255
|
+
?? Shader.Find("Standard")
|
|
256
|
+
?? Shader.Find("Sprites/Default");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private static object ReadMaterialValue(Material mat, string propName, UnityEngine.Rendering.ShaderPropertyType propType)
|
|
260
|
+
{
|
|
261
|
+
switch (propType)
|
|
262
|
+
{
|
|
263
|
+
case ShaderPropertyType.Color:
|
|
264
|
+
var c = mat.GetColor(propName);
|
|
265
|
+
return new List<object> { (double)c.r, (double)c.g, (double)c.b, (double)c.a };
|
|
266
|
+
case ShaderPropertyType.Vector:
|
|
267
|
+
var v = mat.GetVector(propName);
|
|
268
|
+
return new List<object> { (double)v.x, (double)v.y, (double)v.z, (double)v.w };
|
|
269
|
+
case ShaderPropertyType.Float:
|
|
270
|
+
case ShaderPropertyType.Range:
|
|
271
|
+
return (double)mat.GetFloat(propName);
|
|
272
|
+
case ShaderPropertyType.Texture:
|
|
273
|
+
var tex = mat.GetTexture(propName);
|
|
274
|
+
if (tex != null)
|
|
275
|
+
{
|
|
276
|
+
var texPath = AssetDatabase.GetAssetPath(tex);
|
|
277
|
+
return new Dictionary<string, object>
|
|
278
|
+
{
|
|
279
|
+
["name"] = tex.name,
|
|
280
|
+
["path"] = texPath,
|
|
281
|
+
["instanceId"] = tex.GetInstanceID()
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
case ShaderPropertyType.Int:
|
|
286
|
+
return mat.GetInteger(propName);
|
|
287
|
+
default:
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private static void WriteMaterialValue(Material mat, string propName, ShaderPropertyType propType, object value)
|
|
293
|
+
{
|
|
294
|
+
switch (propType)
|
|
295
|
+
{
|
|
296
|
+
case ShaderPropertyType.Color:
|
|
297
|
+
if (value is List<object> ca && ca.Count >= 3)
|
|
298
|
+
mat.SetColor(propName, new Color(
|
|
299
|
+
Convert.ToSingle(ca[0]),
|
|
300
|
+
Convert.ToSingle(ca[1]),
|
|
301
|
+
Convert.ToSingle(ca[2]),
|
|
302
|
+
ca.Count >= 4 ? Convert.ToSingle(ca[3]) : 1f));
|
|
303
|
+
break;
|
|
304
|
+
case ShaderPropertyType.Vector:
|
|
305
|
+
if (value is List<object> va && va.Count >= 4)
|
|
306
|
+
mat.SetVector(propName, new Vector4(
|
|
307
|
+
Convert.ToSingle(va[0]),
|
|
308
|
+
Convert.ToSingle(va[1]),
|
|
309
|
+
Convert.ToSingle(va[2]),
|
|
310
|
+
Convert.ToSingle(va[3])));
|
|
311
|
+
break;
|
|
312
|
+
case ShaderPropertyType.Float:
|
|
313
|
+
case ShaderPropertyType.Range:
|
|
314
|
+
mat.SetFloat(propName, Convert.ToSingle(value));
|
|
315
|
+
break;
|
|
316
|
+
case ShaderPropertyType.Int:
|
|
317
|
+
mat.SetInteger(propName, Convert.ToInt32(value));
|
|
318
|
+
break;
|
|
319
|
+
case ShaderPropertyType.Texture:
|
|
320
|
+
if (value == null)
|
|
321
|
+
{
|
|
322
|
+
mat.SetTexture(propName, null);
|
|
323
|
+
}
|
|
324
|
+
else if (value is Dictionary<string, object> texDict)
|
|
325
|
+
{
|
|
326
|
+
if (texDict.TryGetValue("path", out var tp))
|
|
327
|
+
{
|
|
328
|
+
var tex = AssetDatabase.LoadAssetAtPath<Texture>(tp.ToString());
|
|
329
|
+
mat.SetTexture(propName, tex);
|
|
330
|
+
}
|
|
331
|
+
else if (texDict.TryGetValue("instanceId", out var tid))
|
|
332
|
+
{
|
|
333
|
+
var tex = EditorUtility.EntityIdToObject(Convert.ToInt32(tid)) as Texture;
|
|
334
|
+
mat.SetTexture(propName, tex);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
private static void CreateFoldersRecursive(string path)
|
|
342
|
+
{
|
|
343
|
+
var parts = path.Replace("\\", "/").Split('/');
|
|
344
|
+
string current = parts[0];
|
|
345
|
+
for (int i = 1; i < parts.Length; i++)
|
|
346
|
+
{
|
|
347
|
+
string next = current + "/" + parts[i];
|
|
348
|
+
if (!AssetDatabase.IsValidFolder(next))
|
|
349
|
+
AssetDatabase.CreateFolder(current, parts[i]);
|
|
350
|
+
current = next;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using UnityEditor;
|
|
4
|
+
using UnityEngine;
|
|
5
|
+
|
|
6
|
+
namespace UCP.Bridge
|
|
7
|
+
{
|
|
8
|
+
internal static class ObjectReferenceResolver
|
|
9
|
+
{
|
|
10
|
+
public static Dictionary<string, object> Serialize(UnityEngine.Object obj)
|
|
11
|
+
{
|
|
12
|
+
if (obj == null)
|
|
13
|
+
return null;
|
|
14
|
+
|
|
15
|
+
var result = new Dictionary<string, object>
|
|
16
|
+
{
|
|
17
|
+
["instanceId"] = obj.GetInstanceID(),
|
|
18
|
+
["name"] = obj.name,
|
|
19
|
+
["type"] = obj.GetType().Name
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
var assetPath = AssetDatabase.GetAssetPath(obj);
|
|
23
|
+
if (!string.IsNullOrEmpty(assetPath))
|
|
24
|
+
{
|
|
25
|
+
result["path"] = assetPath;
|
|
26
|
+
var guid = AssetDatabase.AssetPathToGUID(assetPath);
|
|
27
|
+
if (!string.IsNullOrEmpty(guid))
|
|
28
|
+
result["guid"] = guid;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static UnityEngine.Object Resolve(object value, string propertyName)
|
|
35
|
+
{
|
|
36
|
+
if (value == null)
|
|
37
|
+
return null;
|
|
38
|
+
|
|
39
|
+
if (value is Dictionary<string, object> reference)
|
|
40
|
+
{
|
|
41
|
+
if (reference.TryGetValue("instanceId", out var instanceId) && instanceId != null)
|
|
42
|
+
return ResolveByInstanceId(Convert.ToInt32(instanceId), propertyName);
|
|
43
|
+
|
|
44
|
+
if (reference.TryGetValue("path", out var path) && path != null)
|
|
45
|
+
return ResolveByPath(path.ToString(), propertyName);
|
|
46
|
+
|
|
47
|
+
if (reference.TryGetValue("guid", out var guid) && guid != null)
|
|
48
|
+
return ResolveByGuid(guid.ToString(), propertyName);
|
|
49
|
+
|
|
50
|
+
throw new ArgumentException($"Object reference for '{propertyName}' must include instanceId, path, or guid");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (value is string stringValue)
|
|
54
|
+
{
|
|
55
|
+
return stringValue.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase)
|
|
56
|
+
? ResolveByPath(stringValue, propertyName)
|
|
57
|
+
: ResolveByGuid(stringValue, propertyName);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long || value is ulong)
|
|
61
|
+
return ResolveByInstanceId(Convert.ToInt32(value), propertyName);
|
|
62
|
+
|
|
63
|
+
throw new ArgumentException($"Unsupported object reference value for '{propertyName}'");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private static UnityEngine.Object ResolveByInstanceId(int instanceId, string propertyName)
|
|
67
|
+
{
|
|
68
|
+
var resolved = EditorUtility.EntityIdToObject(instanceId);
|
|
69
|
+
if (resolved == null)
|
|
70
|
+
throw new ArgumentException($"Object reference for '{propertyName}' could not resolve instance id {instanceId}");
|
|
71
|
+
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private static UnityEngine.Object ResolveByPath(string assetPath, string propertyName)
|
|
76
|
+
{
|
|
77
|
+
var resolved = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(assetPath);
|
|
78
|
+
if (resolved == null)
|
|
79
|
+
throw new ArgumentException($"Object reference for '{propertyName}' could not load asset at {assetPath}");
|
|
80
|
+
|
|
81
|
+
return resolved;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private static UnityEngine.Object ResolveByGuid(string guid, string propertyName)
|
|
85
|
+
{
|
|
86
|
+
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
|
|
87
|
+
if (string.IsNullOrEmpty(assetPath))
|
|
88
|
+
throw new ArgumentException($"Object reference for '{propertyName}' could not resolve guid {guid}");
|
|
89
|
+
|
|
90
|
+
return ResolveByPath(assetPath, propertyName);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|