@mflrevan/ucp 0.3.3 → 0.4.1
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 +3 -3
- package/package.json +8 -2
- package/bridge/com.ucp.bridge/CHANGELOG.md +0 -112
- package/bridge/com.ucp.bridge/CHANGELOG.md.meta +0 -7
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs +0 -576
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Bridge.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs +0 -530
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs +0 -230
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs +0 -26
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs +0 -18
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs +0 -438
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs +0 -130
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs +0 -319
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs +0 -288
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs +0 -295
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs +0 -93
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs +0 -84
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs +0 -242
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs +0 -533
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs +0 -111
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs +0 -125
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs +0 -104
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs +0 -227
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs +0 -240
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs +0 -611
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs +0 -53
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs +0 -80
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs +0 -358
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs +0 -37
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Scripts.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef +0 -16
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Editor.meta +0 -8
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef +0 -14
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Runtime.meta +0 -8
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs +0 -591
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef +0 -12
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Tests/Editor.meta +0 -8
- package/bridge/com.ucp.bridge/Tests.meta +0 -8
- package/bridge/com.ucp.bridge/package.json +0 -27
- package/bridge/com.ucp.bridge/package.json.meta +0 -7
|
@@ -1,438 +0,0 @@
|
|
|
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 EditorSettingsController
|
|
10
|
-
{
|
|
11
|
-
public static void Register(CommandRouter router)
|
|
12
|
-
{
|
|
13
|
-
router.Register("settings/player", HandlePlayerSettings);
|
|
14
|
-
router.Register("settings/player-set", HandleSetPlayerSetting);
|
|
15
|
-
router.Register("settings/quality", HandleQualitySettings);
|
|
16
|
-
router.Register("settings/quality-set", HandleSetQualitySetting);
|
|
17
|
-
router.Register("settings/physics", HandlePhysicsSettings);
|
|
18
|
-
router.Register("settings/physics-set", HandleSetPhysicsSetting);
|
|
19
|
-
router.Register("settings/lighting", HandleLightingSettings);
|
|
20
|
-
router.Register("settings/lighting-set", HandleSetLightingSetting);
|
|
21
|
-
router.Register("settings/tags-layers", HandleTagsAndLayers);
|
|
22
|
-
router.Register("settings/add-tag", HandleAddTag);
|
|
23
|
-
router.Register("settings/add-layer", HandleAddLayer);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
private static object HandlePlayerSettings(string paramsJson)
|
|
27
|
-
{
|
|
28
|
-
return new Dictionary<string, object>
|
|
29
|
-
{
|
|
30
|
-
["companyName"] = PlayerSettings.companyName,
|
|
31
|
-
["productName"] = PlayerSettings.productName,
|
|
32
|
-
["bundleVersion"] = PlayerSettings.bundleVersion,
|
|
33
|
-
["defaultIsNativeResolution"] = PlayerSettings.defaultIsNativeResolution,
|
|
34
|
-
["runInBackground"] = PlayerSettings.runInBackground,
|
|
35
|
-
["colorSpace"] = PlayerSettings.colorSpace.ToString(),
|
|
36
|
-
["graphicsApi"] = PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget)?[0].ToString() ?? "Unknown",
|
|
37
|
-
["scriptingBackend"] = PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup).ToString(),
|
|
38
|
-
["apiCompatibilityLevel"] = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup).ToString(),
|
|
39
|
-
["targetFrameRate"] = Application.targetFrameRate,
|
|
40
|
-
["defaultScreenWidth"] = PlayerSettings.defaultScreenWidth,
|
|
41
|
-
["defaultScreenHeight"] = PlayerSettings.defaultScreenHeight
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
private static object HandleSetPlayerSetting(string paramsJson)
|
|
46
|
-
{
|
|
47
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
48
|
-
if (p == null || !p.TryGetValue("key", out var keyObj))
|
|
49
|
-
throw new ArgumentException("Missing 'key' parameter");
|
|
50
|
-
if (!p.ContainsKey("value"))
|
|
51
|
-
throw new ArgumentException("Missing 'value' parameter");
|
|
52
|
-
|
|
53
|
-
string key = keyObj.ToString();
|
|
54
|
-
object value = p["value"];
|
|
55
|
-
|
|
56
|
-
switch (key)
|
|
57
|
-
{
|
|
58
|
-
case "companyName":
|
|
59
|
-
PlayerSettings.companyName = value.ToString();
|
|
60
|
-
break;
|
|
61
|
-
case "productName":
|
|
62
|
-
PlayerSettings.productName = value.ToString();
|
|
63
|
-
break;
|
|
64
|
-
case "bundleVersion":
|
|
65
|
-
PlayerSettings.bundleVersion = value.ToString();
|
|
66
|
-
break;
|
|
67
|
-
case "runInBackground":
|
|
68
|
-
PlayerSettings.runInBackground = Convert.ToBoolean(value);
|
|
69
|
-
break;
|
|
70
|
-
case "defaultIsNativeResolution":
|
|
71
|
-
PlayerSettings.defaultIsNativeResolution = Convert.ToBoolean(value);
|
|
72
|
-
break;
|
|
73
|
-
case "defaultScreenWidth":
|
|
74
|
-
PlayerSettings.defaultScreenWidth = Convert.ToInt32(value);
|
|
75
|
-
break;
|
|
76
|
-
case "defaultScreenHeight":
|
|
77
|
-
PlayerSettings.defaultScreenHeight = Convert.ToInt32(value);
|
|
78
|
-
break;
|
|
79
|
-
case "colorSpace":
|
|
80
|
-
if (Enum.TryParse<ColorSpace>(value.ToString(), out var cs))
|
|
81
|
-
PlayerSettings.colorSpace = cs;
|
|
82
|
-
break;
|
|
83
|
-
default:
|
|
84
|
-
throw new ArgumentException($"Unknown player setting: {key}");
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return new Dictionary<string, object> { ["status"] = "ok", ["key"] = key };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private static object HandleQualitySettings(string paramsJson)
|
|
91
|
-
{
|
|
92
|
-
var names = QualitySettings.names;
|
|
93
|
-
var levels = new List<object>();
|
|
94
|
-
for (int i = 0; i < names.Length; i++)
|
|
95
|
-
{
|
|
96
|
-
levels.Add(new Dictionary<string, object>
|
|
97
|
-
{
|
|
98
|
-
["index"] = i,
|
|
99
|
-
["name"] = names[i],
|
|
100
|
-
["isCurrent"] = i == QualitySettings.GetQualityLevel()
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return new Dictionary<string, object>
|
|
105
|
-
{
|
|
106
|
-
["currentLevel"] = QualitySettings.GetQualityLevel(),
|
|
107
|
-
["currentName"] = names[QualitySettings.GetQualityLevel()],
|
|
108
|
-
["levels"] = levels,
|
|
109
|
-
["shadowDistance"] = (double)QualitySettings.shadowDistance,
|
|
110
|
-
["shadowCascades"] = QualitySettings.shadowCascades,
|
|
111
|
-
["antiAliasing"] = QualitySettings.antiAliasing,
|
|
112
|
-
["vSyncCount"] = QualitySettings.vSyncCount
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
private static object HandleSetQualitySetting(string paramsJson)
|
|
117
|
-
{
|
|
118
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
119
|
-
if (p == null || !p.TryGetValue("key", out var keyObj))
|
|
120
|
-
throw new ArgumentException("Missing 'key' parameter");
|
|
121
|
-
if (!p.ContainsKey("value"))
|
|
122
|
-
throw new ArgumentException("Missing 'value' parameter");
|
|
123
|
-
|
|
124
|
-
string key = keyObj.ToString();
|
|
125
|
-
object value = p["value"];
|
|
126
|
-
|
|
127
|
-
switch (key)
|
|
128
|
-
{
|
|
129
|
-
case "level":
|
|
130
|
-
QualitySettings.SetQualityLevel(Convert.ToInt32(value));
|
|
131
|
-
break;
|
|
132
|
-
case "shadowDistance":
|
|
133
|
-
QualitySettings.shadowDistance = Convert.ToSingle(value);
|
|
134
|
-
break;
|
|
135
|
-
case "shadowCascades":
|
|
136
|
-
QualitySettings.shadowCascades = Convert.ToInt32(value);
|
|
137
|
-
break;
|
|
138
|
-
case "antiAliasing":
|
|
139
|
-
QualitySettings.antiAliasing = Convert.ToInt32(value);
|
|
140
|
-
break;
|
|
141
|
-
case "vSyncCount":
|
|
142
|
-
QualitySettings.vSyncCount = Convert.ToInt32(value);
|
|
143
|
-
break;
|
|
144
|
-
default:
|
|
145
|
-
throw new ArgumentException($"Unknown quality setting: {key}");
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return new Dictionary<string, object> { ["status"] = "ok", ["key"] = key };
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
private static object HandlePhysicsSettings(string paramsJson)
|
|
152
|
-
{
|
|
153
|
-
return new Dictionary<string, object>
|
|
154
|
-
{
|
|
155
|
-
["gravity"] = new List<object>
|
|
156
|
-
{
|
|
157
|
-
(double)Physics.gravity.x,
|
|
158
|
-
(double)Physics.gravity.y,
|
|
159
|
-
(double)Physics.gravity.z
|
|
160
|
-
},
|
|
161
|
-
["defaultSolverIterations"] = Physics.defaultSolverIterations,
|
|
162
|
-
["defaultSolverVelocityIterations"] = Physics.defaultSolverVelocityIterations,
|
|
163
|
-
["bounceThreshold"] = (double)Physics.bounceThreshold,
|
|
164
|
-
["sleepThreshold"] = (double)Physics.sleepThreshold,
|
|
165
|
-
["defaultContactOffset"] = (double)Physics.defaultContactOffset,
|
|
166
|
-
["autoSimulation"] = Physics.simulationMode.ToString()
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
private static object HandleSetPhysicsSetting(string paramsJson)
|
|
171
|
-
{
|
|
172
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
173
|
-
if (p == null || !p.TryGetValue("key", out var keyObj))
|
|
174
|
-
throw new ArgumentException("Missing 'key' parameter");
|
|
175
|
-
if (!p.ContainsKey("value"))
|
|
176
|
-
throw new ArgumentException("Missing 'value' parameter");
|
|
177
|
-
|
|
178
|
-
string key = keyObj.ToString();
|
|
179
|
-
object value = p["value"];
|
|
180
|
-
|
|
181
|
-
switch (key)
|
|
182
|
-
{
|
|
183
|
-
case "gravity":
|
|
184
|
-
if (value is List<object> g && g.Count >= 3)
|
|
185
|
-
Physics.gravity = new Vector3(
|
|
186
|
-
Convert.ToSingle(g[0]),
|
|
187
|
-
Convert.ToSingle(g[1]),
|
|
188
|
-
Convert.ToSingle(g[2]));
|
|
189
|
-
break;
|
|
190
|
-
case "defaultSolverIterations":
|
|
191
|
-
Physics.defaultSolverIterations = Convert.ToInt32(value);
|
|
192
|
-
break;
|
|
193
|
-
case "defaultSolverVelocityIterations":
|
|
194
|
-
Physics.defaultSolverVelocityIterations = Convert.ToInt32(value);
|
|
195
|
-
break;
|
|
196
|
-
case "bounceThreshold":
|
|
197
|
-
Physics.bounceThreshold = Convert.ToSingle(value);
|
|
198
|
-
break;
|
|
199
|
-
case "sleepThreshold":
|
|
200
|
-
Physics.sleepThreshold = Convert.ToSingle(value);
|
|
201
|
-
break;
|
|
202
|
-
default:
|
|
203
|
-
throw new ArgumentException($"Unknown physics setting: {key}");
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return new Dictionary<string, object> { ["status"] = "ok", ["key"] = key };
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
private static object HandleLightingSettings(string paramsJson)
|
|
210
|
-
{
|
|
211
|
-
var result = new Dictionary<string, object>
|
|
212
|
-
{
|
|
213
|
-
["ambientMode"] = RenderSettings.ambientMode.ToString(),
|
|
214
|
-
["ambientIntensity"] = (double)RenderSettings.ambientIntensity,
|
|
215
|
-
["fog"] = RenderSettings.fog,
|
|
216
|
-
["fogMode"] = RenderSettings.fogMode.ToString(),
|
|
217
|
-
["fogDensity"] = (double)RenderSettings.fogDensity,
|
|
218
|
-
["fogStartDistance"] = (double)RenderSettings.fogStartDistance,
|
|
219
|
-
["fogEndDistance"] = (double)RenderSettings.fogEndDistance,
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
var c = RenderSettings.ambientLight;
|
|
223
|
-
result["ambientColor"] = new List<object> { (double)c.r, (double)c.g, (double)c.b, (double)c.a };
|
|
224
|
-
|
|
225
|
-
var fc = RenderSettings.fogColor;
|
|
226
|
-
result["fogColor"] = new List<object> { (double)fc.r, (double)fc.g, (double)fc.b, (double)fc.a };
|
|
227
|
-
|
|
228
|
-
if (RenderSettings.skybox != null)
|
|
229
|
-
result["skybox"] = RenderSettings.skybox.name;
|
|
230
|
-
|
|
231
|
-
if (RenderSettings.sun != null)
|
|
232
|
-
result["sunSource"] = RenderSettings.sun.gameObject.name;
|
|
233
|
-
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
private static object HandleSetLightingSetting(string paramsJson)
|
|
238
|
-
{
|
|
239
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
240
|
-
if (p == null || !p.TryGetValue("key", out var keyObj))
|
|
241
|
-
throw new ArgumentException("Missing 'key' parameter");
|
|
242
|
-
if (!p.ContainsKey("value"))
|
|
243
|
-
throw new ArgumentException("Missing 'value' parameter");
|
|
244
|
-
|
|
245
|
-
string key = keyObj.ToString();
|
|
246
|
-
object value = p["value"];
|
|
247
|
-
|
|
248
|
-
switch (key)
|
|
249
|
-
{
|
|
250
|
-
case "ambientMode":
|
|
251
|
-
if (Enum.TryParse<AmbientMode>(value.ToString(), out var am))
|
|
252
|
-
RenderSettings.ambientMode = am;
|
|
253
|
-
break;
|
|
254
|
-
case "ambientIntensity":
|
|
255
|
-
RenderSettings.ambientIntensity = Convert.ToSingle(value);
|
|
256
|
-
break;
|
|
257
|
-
case "ambientColor":
|
|
258
|
-
if (value is List<object> ac && ac.Count >= 3)
|
|
259
|
-
RenderSettings.ambientLight = new Color(
|
|
260
|
-
Convert.ToSingle(ac[0]),
|
|
261
|
-
Convert.ToSingle(ac[1]),
|
|
262
|
-
Convert.ToSingle(ac[2]),
|
|
263
|
-
ac.Count >= 4 ? Convert.ToSingle(ac[3]) : 1f);
|
|
264
|
-
break;
|
|
265
|
-
case "fog":
|
|
266
|
-
RenderSettings.fog = Convert.ToBoolean(value);
|
|
267
|
-
break;
|
|
268
|
-
case "fogMode":
|
|
269
|
-
if (Enum.TryParse<FogMode>(value.ToString(), out var fm))
|
|
270
|
-
RenderSettings.fogMode = fm;
|
|
271
|
-
break;
|
|
272
|
-
case "fogDensity":
|
|
273
|
-
RenderSettings.fogDensity = Convert.ToSingle(value);
|
|
274
|
-
break;
|
|
275
|
-
case "fogColor":
|
|
276
|
-
if (value is List<object> fca && fca.Count >= 3)
|
|
277
|
-
RenderSettings.fogColor = new Color(
|
|
278
|
-
Convert.ToSingle(fca[0]),
|
|
279
|
-
Convert.ToSingle(fca[1]),
|
|
280
|
-
Convert.ToSingle(fca[2]),
|
|
281
|
-
fca.Count >= 4 ? Convert.ToSingle(fca[3]) : 1f);
|
|
282
|
-
break;
|
|
283
|
-
case "fogStartDistance":
|
|
284
|
-
RenderSettings.fogStartDistance = Convert.ToSingle(value);
|
|
285
|
-
break;
|
|
286
|
-
case "fogEndDistance":
|
|
287
|
-
RenderSettings.fogEndDistance = Convert.ToSingle(value);
|
|
288
|
-
break;
|
|
289
|
-
default:
|
|
290
|
-
throw new ArgumentException($"Unknown lighting setting: {key}");
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return new Dictionary<string, object> { ["status"] = "ok", ["key"] = key };
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
private static object HandleTagsAndLayers(string paramsJson)
|
|
297
|
-
{
|
|
298
|
-
var tags = new List<object>();
|
|
299
|
-
foreach (var tag in UnityEditorInternal.InternalEditorUtility.tags)
|
|
300
|
-
tags.Add(tag);
|
|
301
|
-
|
|
302
|
-
var layers = new List<object>();
|
|
303
|
-
for (int i = 0; i < 32; i++)
|
|
304
|
-
{
|
|
305
|
-
string name = LayerMask.LayerToName(i);
|
|
306
|
-
if (!string.IsNullOrEmpty(name))
|
|
307
|
-
{
|
|
308
|
-
layers.Add(new Dictionary<string, object>
|
|
309
|
-
{
|
|
310
|
-
["index"] = i,
|
|
311
|
-
["name"] = name
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
var sortingLayers = new List<object>();
|
|
317
|
-
foreach (var sl in SortingLayer.layers)
|
|
318
|
-
{
|
|
319
|
-
sortingLayers.Add(new Dictionary<string, object>
|
|
320
|
-
{
|
|
321
|
-
["id"] = sl.id,
|
|
322
|
-
["name"] = sl.name,
|
|
323
|
-
["value"] = sl.value
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return new Dictionary<string, object>
|
|
328
|
-
{
|
|
329
|
-
["tags"] = tags,
|
|
330
|
-
["layers"] = layers,
|
|
331
|
-
["sortingLayers"] = sortingLayers
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
private static object HandleAddTag(string paramsJson)
|
|
336
|
-
{
|
|
337
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
338
|
-
if (p == null || !p.TryGetValue("tag", out var tagObj))
|
|
339
|
-
throw new ArgumentException("Missing 'tag' parameter");
|
|
340
|
-
|
|
341
|
-
string tag = tagObj.ToString();
|
|
342
|
-
|
|
343
|
-
// Check if tag already exists
|
|
344
|
-
var so = new SerializedObject(
|
|
345
|
-
AssetDatabase.LoadMainAssetAtPath("ProjectSettings/TagManager.asset"));
|
|
346
|
-
var tagsProp = so.FindProperty("tags");
|
|
347
|
-
|
|
348
|
-
for (int i = 0; i < tagsProp.arraySize; i++)
|
|
349
|
-
{
|
|
350
|
-
if (tagsProp.GetArrayElementAtIndex(i).stringValue == tag)
|
|
351
|
-
return new Dictionary<string, object>
|
|
352
|
-
{
|
|
353
|
-
["status"] = "exists",
|
|
354
|
-
["tag"] = tag
|
|
355
|
-
};
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
tagsProp.InsertArrayElementAtIndex(tagsProp.arraySize);
|
|
359
|
-
tagsProp.GetArrayElementAtIndex(tagsProp.arraySize - 1).stringValue = tag;
|
|
360
|
-
so.ApplyModifiedProperties();
|
|
361
|
-
so.Dispose();
|
|
362
|
-
|
|
363
|
-
return new Dictionary<string, object>
|
|
364
|
-
{
|
|
365
|
-
["status"] = "ok",
|
|
366
|
-
["tag"] = tag
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private static object HandleAddLayer(string paramsJson)
|
|
371
|
-
{
|
|
372
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
373
|
-
if (p == null || !p.TryGetValue("name", out var nameObj))
|
|
374
|
-
throw new ArgumentException("Missing 'name' parameter");
|
|
375
|
-
|
|
376
|
-
string layerName = nameObj.ToString();
|
|
377
|
-
int targetIndex = -1;
|
|
378
|
-
if (p.TryGetValue("index", out var idxObj))
|
|
379
|
-
targetIndex = Convert.ToInt32(idxObj);
|
|
380
|
-
|
|
381
|
-
var so = new SerializedObject(
|
|
382
|
-
AssetDatabase.LoadMainAssetAtPath("ProjectSettings/TagManager.asset"));
|
|
383
|
-
var layersProp = so.FindProperty("layers");
|
|
384
|
-
|
|
385
|
-
// Check if layer already exists
|
|
386
|
-
for (int i = 0; i < layersProp.arraySize; i++)
|
|
387
|
-
{
|
|
388
|
-
if (layersProp.GetArrayElementAtIndex(i).stringValue == layerName)
|
|
389
|
-
return new Dictionary<string, object>
|
|
390
|
-
{
|
|
391
|
-
["status"] = "exists",
|
|
392
|
-
["name"] = layerName,
|
|
393
|
-
["index"] = i
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// Find first empty user layer (8-31) or use specified index
|
|
398
|
-
int assignedIndex = -1;
|
|
399
|
-
if (targetIndex >= 8 && targetIndex < 32)
|
|
400
|
-
{
|
|
401
|
-
if (string.IsNullOrEmpty(layersProp.GetArrayElementAtIndex(targetIndex).stringValue))
|
|
402
|
-
{
|
|
403
|
-
layersProp.GetArrayElementAtIndex(targetIndex).stringValue = layerName;
|
|
404
|
-
assignedIndex = targetIndex;
|
|
405
|
-
}
|
|
406
|
-
else
|
|
407
|
-
{
|
|
408
|
-
throw new ArgumentException($"Layer index {targetIndex} is already in use");
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
else
|
|
412
|
-
{
|
|
413
|
-
for (int i = 8; i < 32; i++)
|
|
414
|
-
{
|
|
415
|
-
if (string.IsNullOrEmpty(layersProp.GetArrayElementAtIndex(i).stringValue))
|
|
416
|
-
{
|
|
417
|
-
layersProp.GetArrayElementAtIndex(i).stringValue = layerName;
|
|
418
|
-
assignedIndex = i;
|
|
419
|
-
break;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (assignedIndex < 0)
|
|
425
|
-
throw new InvalidOperationException("No empty layer slots available");
|
|
426
|
-
|
|
427
|
-
so.ApplyModifiedProperties();
|
|
428
|
-
so.Dispose();
|
|
429
|
-
|
|
430
|
-
return new Dictionary<string, object>
|
|
431
|
-
{
|
|
432
|
-
["status"] = "ok",
|
|
433
|
-
["name"] = layerName,
|
|
434
|
-
["index"] = assignedIndex
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
using System;
|
|
2
|
-
using System.Collections.Generic;
|
|
3
|
-
using System.IO;
|
|
4
|
-
using UnityEngine;
|
|
5
|
-
|
|
6
|
-
namespace UCP.Bridge
|
|
7
|
-
{
|
|
8
|
-
public static class FileController
|
|
9
|
-
{
|
|
10
|
-
public static void Register(CommandRouter router)
|
|
11
|
-
{
|
|
12
|
-
router.Register("file/read", HandleRead);
|
|
13
|
-
router.Register("file/write", HandleWrite);
|
|
14
|
-
router.Register("file/patch", HandlePatch);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
private static string ProjectRoot =>
|
|
18
|
-
Path.GetDirectoryName(Application.dataPath);
|
|
19
|
-
|
|
20
|
-
private static string ResolveSafePath(string relativePath)
|
|
21
|
-
{
|
|
22
|
-
var projectRoot = ProjectRoot;
|
|
23
|
-
var fullPath = Path.GetFullPath(Path.Combine(projectRoot, relativePath));
|
|
24
|
-
|
|
25
|
-
// Security: ensure path is within project root
|
|
26
|
-
if (!fullPath.StartsWith(projectRoot, StringComparison.OrdinalIgnoreCase))
|
|
27
|
-
throw new UnauthorizedAccessException(
|
|
28
|
-
$"Path escapes project root: {relativePath}");
|
|
29
|
-
|
|
30
|
-
return fullPath;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
private static object HandleRead(string paramsJson)
|
|
34
|
-
{
|
|
35
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
36
|
-
if (p == null || !p.TryGetValue("path", out var pathObj))
|
|
37
|
-
throw new ArgumentException("Missing 'path' parameter");
|
|
38
|
-
|
|
39
|
-
var fullPath = ResolveSafePath(pathObj.ToString());
|
|
40
|
-
|
|
41
|
-
if (!File.Exists(fullPath))
|
|
42
|
-
throw new FileNotFoundException($"File not found: {pathObj}");
|
|
43
|
-
|
|
44
|
-
var content = File.ReadAllText(fullPath);
|
|
45
|
-
|
|
46
|
-
return new Dictionary<string, object>
|
|
47
|
-
{
|
|
48
|
-
["path"] = pathObj.ToString(),
|
|
49
|
-
["content"] = content,
|
|
50
|
-
["size"] = content.Length
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private static object HandleWrite(string paramsJson)
|
|
55
|
-
{
|
|
56
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
57
|
-
if (p == null || !p.TryGetValue("path", out var pathObj))
|
|
58
|
-
throw new ArgumentException("Missing 'path' parameter");
|
|
59
|
-
if (!p.TryGetValue("content", out var contentObj))
|
|
60
|
-
throw new ArgumentException("Missing 'content' parameter");
|
|
61
|
-
|
|
62
|
-
var fullPath = ResolveSafePath(pathObj.ToString());
|
|
63
|
-
|
|
64
|
-
// Create directory if needed
|
|
65
|
-
var dir = Path.GetDirectoryName(fullPath);
|
|
66
|
-
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
|
|
67
|
-
Directory.CreateDirectory(dir);
|
|
68
|
-
|
|
69
|
-
File.WriteAllText(fullPath, contentObj.ToString());
|
|
70
|
-
|
|
71
|
-
return new Dictionary<string, object>
|
|
72
|
-
{
|
|
73
|
-
["path"] = pathObj.ToString(),
|
|
74
|
-
["written"] = true,
|
|
75
|
-
["size"] = contentObj.ToString().Length
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
private static object HandlePatch(string paramsJson)
|
|
80
|
-
{
|
|
81
|
-
var p = MiniJson.Deserialize(paramsJson) as Dictionary<string, object>;
|
|
82
|
-
if (p == null || !p.TryGetValue("path", out var pathObj))
|
|
83
|
-
throw new ArgumentException("Missing 'path' parameter");
|
|
84
|
-
if (!p.TryGetValue("patch", out var patchObj))
|
|
85
|
-
throw new ArgumentException("Missing 'patch' parameter");
|
|
86
|
-
|
|
87
|
-
var fullPath = ResolveSafePath(pathObj.ToString());
|
|
88
|
-
|
|
89
|
-
if (!File.Exists(fullPath))
|
|
90
|
-
throw new FileNotFoundException($"File not found: {pathObj}");
|
|
91
|
-
|
|
92
|
-
var original = File.ReadAllText(fullPath);
|
|
93
|
-
|
|
94
|
-
// Support patch as either a dict with find/replace keys, or a JSON string
|
|
95
|
-
Dictionary<string, object> patchData = null;
|
|
96
|
-
|
|
97
|
-
if (patchObj is Dictionary<string, object> dict)
|
|
98
|
-
{
|
|
99
|
-
patchData = dict;
|
|
100
|
-
}
|
|
101
|
-
else
|
|
102
|
-
{
|
|
103
|
-
var patchContent = patchObj.ToString();
|
|
104
|
-
if (patchContent.TrimStart().StartsWith("{"))
|
|
105
|
-
patchData = MiniJson.Deserialize(patchContent) as Dictionary<string, object>;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (patchData != null &&
|
|
109
|
-
patchData.TryGetValue("find", out var findObj) &&
|
|
110
|
-
patchData.TryGetValue("replace", out var replaceObj))
|
|
111
|
-
{
|
|
112
|
-
var find = findObj.ToString();
|
|
113
|
-
var replace = replaceObj.ToString();
|
|
114
|
-
if (!original.Contains(find))
|
|
115
|
-
throw new Exception("Patch target not found in file");
|
|
116
|
-
|
|
117
|
-
var patched = original.Replace(find, replace);
|
|
118
|
-
File.WriteAllText(fullPath, patched);
|
|
119
|
-
|
|
120
|
-
return new Dictionary<string, object>
|
|
121
|
-
{
|
|
122
|
-
["path"] = pathObj.ToString(),
|
|
123
|
-
["patched"] = true
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
throw new ArgumentException("Unsupported patch format. Use {\"find\": \"...\", \"replace\": \"...\"}");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|