@cc-component/cc-pathfinding 1.1.5 → 1.1.6

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.
@@ -65,6 +65,12 @@ declare global {
65
65
  * 传 { handler: (nodes) => void } → 完全交给外部处理层级(一帧只回调一次)
66
66
  */
67
67
  export function SetDepthSort(enabled: boolean, setting?: ((node: Node) => number) | DepthSortOptions): void
68
+ /**
69
+ * 一次性给一批节点设置层级(初始化、批量改完位置后调用一次)
70
+ * @param getOrder 排序键,键越大越靠前显示;不传则用 SetDepthSort 设过的键,
71
+ * 都没设过默认按世界坐标 y(y 越小越靠前)
72
+ */
73
+ export function SetNodesLayer(nodes: Node[], getOrder?: (node: Node) => number): void
68
74
  /**
69
75
  * 注入自定义 tween 实现(比如换成项目自己的动画系统)
70
76
  * @param factory 传 null 或从未调用时,自动使用 cc 自带 tween
@@ -19,7 +19,7 @@ export class DepthSorter {
19
19
  * @param getOrder 排序键:键越大越靠前显示(siblingIndex 越大,越后绘制、盖在上面)。
20
20
  * 默认按世界坐标 y:(node) => -node.worldPosition.y
21
21
  */
22
- constructor(private readonly getOrder: (node: Node) => number = DepthSorter.DEFAULT_ORDER) { }
22
+ constructor(readonly getOrder: (node: Node) => number = DepthSorter.DEFAULT_ORDER) { }
23
23
 
24
24
  /**
25
25
  * 把节点调整到正确的层级位置。位置已经正确时不做任何操作。
@@ -118,6 +118,8 @@ export class GridMovementController {
118
118
  private depthSorter: DepthSorter | null = null;
119
119
  /** 外部深度排序处理器,设置后内置排序不生效 */
120
120
  private depthSortHandler: ((nodes: Node[]) => void) | null = null;
121
+ /** 当前排序键:SetNodesLayer 在没有显式传 getOrder 时用它 */
122
+ private depthSortOrder: (node: Node) => number = DepthSorter.DEFAULT_ORDER;
121
123
 
122
124
  constructor(private readonly scheduler: Component, options: GridMovementOptions = {}) {
123
125
  // 允许外部按场景调整重试间隔和动画时长,默认值保持兼容。
@@ -182,6 +184,7 @@ export class GridMovementController {
182
184
  * 传 { handler } → 完全交给外部处理层级(内部只做脏标记与每帧合并)。
183
185
  */
184
186
  setDepthSort(enabled: boolean, setting?: DepthSortSetting): void {
187
+ this.depthSortOrder = this.resolveDepthSortOrder(setting);
185
188
  if (!enabled) {
186
189
  this.depthSorter = null;
187
190
  this.depthSortHandler = null;
@@ -197,6 +200,53 @@ export class GridMovementController {
197
200
  this.depthSorter = this.depthSortHandler ? null : new DepthSorter(setting?.getOrder);
198
201
  }
199
202
 
203
+ /** 取出排序键:函数直接用,配置对象取 getOrder,都没有就用默认(世界坐标 y) */
204
+ private resolveDepthSortOrder(setting?: DepthSortSetting): (node: Node) => number {
205
+ if (typeof setting === 'function') {
206
+ return setting;
207
+ }
208
+ return setting?.getOrder ?? DepthSorter.DEFAULT_ORDER;
209
+ }
210
+
211
+ /**
212
+ * 一次性给一批节点设置层级(初始化、批量改动位置后调用)。
213
+ * 按父节点分组,只在这些节点当前占据的"槽位"之间按排序键重排,
214
+ * 不会打乱父节点下其它子节点(比如地图格子)的顺序。
215
+ */
216
+ setNodesLayer(nodes: Node[], getOrder?: (node: Node) => number): void {
217
+ if (!nodes || nodes.length === 0) {
218
+ return;
219
+ }
220
+ const order = getOrder ?? this.depthSortOrder;
221
+
222
+ // 按父节点分组,跳过无效 / 无父节点的
223
+ const groups = new Map<Node, Node[]>();
224
+ for (const node of nodes) {
225
+ if (!node?.isValid || !node.parent) {
226
+ continue;
227
+ }
228
+ const list = groups.get(node.parent);
229
+ if (list) {
230
+ list.push(node);
231
+ } else {
232
+ groups.set(node.parent, [node]);
233
+ }
234
+ }
235
+
236
+ groups.forEach((list) => {
237
+ // 槽位 = 这批节点当前的 siblingIndex(升序),重排只发生在这些槽位之间
238
+ const slots = list.map(node => node.getSiblingIndex()).sort((a, b) => a - b);
239
+ // 排序键升序:键越小 index 越小(越靠后绘制)
240
+ list.sort((a, b) => order(a) - order(b));
241
+ // 按槽位从小到大写入,避免先写大下标导致后续位置错乱
242
+ for (let i = 0; i < list.length; i++) {
243
+ if (list[i].getSiblingIndex() !== slots[i]) {
244
+ list[i].setSiblingIndex(slots[i]);
245
+ }
246
+ }
247
+ });
248
+ }
249
+
200
250
  /** 是否需要在 tween 上挂每帧回调(外部监听 或 深度排序) */
201
251
  private needsFrameUpdate(): boolean {
202
252
  return this.movementUpdateHandler !== null
@@ -66,6 +66,17 @@ export class PathfindingModule {
66
66
  this.movementController?.setMovementUpdateHandler(handler);
67
67
  }
68
68
 
69
+ /**
70
+ * 一次性给一批节点设置层级(初始化、批量改完位置后调用一次即可)。
71
+ * 按父节点分组,只在这些节点当前占据的槽位之间按排序键重排,
72
+ * 不会打乱父节点下其它子节点(比如地图格子)的顺序。
73
+ * @param getOrder 排序键,键越大越靠前显示;不传则用 SetDepthSort 设过的键,
74
+ * 都没设过默认按世界坐标 y(y 越小越靠前)
75
+ */
76
+ static SetNodesLayer(nodes: Node[], getOrder?: (node: Node) => number): void {
77
+ this.movementController?.setNodesLayer(nodes, getOrder);
78
+ }
79
+
69
80
  /**
70
81
  * 开启 / 关闭深度排序(三种用法):
71
82
  * 1. SetDepthSort(true) → 内置插入式排序,默认按世界坐标 y(y 越小越靠前)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cc-component/cc-pathfinding",
3
- "version": "1.1.5",
3
+ "version": "1.1.6",
4
4
  "engine": ">=3.8.6",
5
5
  "description": "系统组件添加常用扩展方法",
6
6
  "main": "index.ts",