diff --git a/assets/Script/example/SyncExmaple.ts b/assets/Script/example/SyncExmaple.ts index d1cb0c5..fe05501 100644 --- a/assets/Script/example/SyncExmaple.ts +++ b/assets/Script/example/SyncExmaple.ts @@ -1,5 +1,5 @@ import { Component, Label, _decorator, view, director, Node, RichText, tween, Tween, math, randomRange, Vec3, Quat, ModelComponent, Color } from "cc"; -import { TestArrayReplicator, TestSimpleArrayReplicator, TestSimpleArrayReplicatorVersion } from "../sync/ArrayReplicator"; +import { TestArrayLinkReplicator, TestArrayReplicator, TestSimpleArrayReplicator, TestSimpleArrayReplicatorVersion } from "../sync/ArrayReplicator"; import { getReplicateMark, ReplicatedOption } from "../sync/ReplicateMark"; import { getReplicator, replicated, replicatedClass } from "../sync/SyncUtil"; @@ -47,6 +47,8 @@ export default class SyncExample extends Component { TestSimpleArrayReplicatorVersion(); console.log("=============="); TestArrayReplicator(); + console.log("=============="); + TestArrayLinkReplicator(); /*let vec = new Vec3(Vec3.ZERO); makeObjectReplicated(vec); vec.x = 123; diff --git a/assets/Script/sync/ArrayReplicator.ts b/assets/Script/sync/ArrayReplicator.ts index 9c988c1..d22c19f 100644 --- a/assets/Script/sync/ArrayReplicator.ts +++ b/assets/Script/sync/ArrayReplicator.ts @@ -438,7 +438,7 @@ function fillSwapInfo(map: Map, source: any, target: any, sourceD } } -export class ArrayLinkReplicator> implements IReplicator { +export class ArrayLinkReplicator implements IReplicator { private data: Array; private dataIndexMap: Map; private target: Array; @@ -453,11 +453,12 @@ export class ArrayLinkReplicator> implements IReplicato this.ctor = objMark?.Constructor; } else { // 如果没有指定Constructor,则target数组不得为空 - this.ctor = target[0].__proto__.constructor; + this.ctor = getConsturctor(target[0]); } this.target = target; this.data = []; this.dataIndexMap = new Map(); + this.makeUpDataArray(target, mark); } getTarget() { @@ -726,7 +727,7 @@ export class ArrayLinkReplicator> implements IReplicato let fromIndex = this.getActionIndex(fromVersion); let toIndex = this.actionSequence.length; let ret = []; - for (let i = fromIndex; i <= toIndex; ++i) { + for (let i = fromIndex; i < toIndex; ++i) { ret.push(this.actionSequence[i].actions); } @@ -782,4 +783,46 @@ export class ArrayLinkReplicator> implements IReplicato getVersion(): number { return this.lastVersion; } +} + +export function TestArrayLinkReplicator() { + class Point { + @replicated() + x: number = 0; + @replicated() + y: number = 0; + constructor(x: any = 0, y: any = 0) { + this.x = x; + this.y = y; + } + } + + let source: Array = [new Point(1, 2), new Point(3, 4)]; + let replicator = new ArrayLinkReplicator(source); + let target: Array = [new Point(1, 2), new Point(3, 4)]; + let targetReplicator = new ArrayLinkReplicator(target); + source.push(new Point(5, 6)); + source.push(new Point(7, 8)); + source[0].x = 10; + source[1].y = 20; + console.log(source); + let diff = replicator.genDiff(0, 1); + console.log(diff); + targetReplicator.applyDiff(diff); + console.log(target); + + source.splice(1,2); + diff = replicator.genDiff(1, 2); + console.log(diff); + targetReplicator.applyDiff(diff); + console.log(source); + console.log(target); + + let target2: Array = [new Point(1, 2), new Point(3, 4)]; + let targetReplicator2 = new ArrayLinkReplicator(target2); + diff = replicator.genDiff(0, 2); + console.log(diff); + targetReplicator2.applyDiff(diff); + console.log(source); + console.log(target2); } \ No newline at end of file diff --git a/profiles/v2/packages/scene.json b/profiles/v2/packages/scene.json index ac1056a..0ef9e27 100644 --- a/profiles/v2/packages/scene.json +++ b/profiles/v2/packages/scene.json @@ -127,7 +127,7 @@ } }, "camera-uuids": [ - "f46876e4-e81b-4931-b493-6d367be385e7" + "d8be8bee-362a-494a-9643-8e52af4c0c15" ], "float-window": { "position": {