protected override void OnAdd(GUnit unit) { _syncData = unit.GetData <ObjectSyncServerData>(); var systemData = unit.GetData <SystemData>(); var unitData = unit.GetData <UnitData>(); IDisposable preparedDispose = null; IDisposable updateDispose = null; _syncData.enable.Subscribe(_ => { if (_) { updateDispose = GameSystem.ObserveEveryUpdate().Subscribe(time => { var currentInternalFrame = _syncData.internalFrame + 1; if (currentInternalFrame >= _syncData.internalFrameSize) { currentInternalFrame = 0; _syncData.currentKeyFrame += _syncData.currentKeyFrame > _syncData.serverKeyFrame ? 0 : 1; } var currentFrame = _syncData.currentKeyFrame * _syncData.internalFrameSize + currentInternalFrame; if (currentFrame > systemData.serverFrame) { systemData.serverFrame = currentFrame; _syncData.syncSubject.OnNext(ValueTuple.Create(_syncData.currentKeyFrame, currentInternalFrame)); _syncData.internalFrame = currentInternalFrame; } }); preparedDispose = _syncData.preparedSyncInfoList.ObserveAdd().Subscribe(stateInfo => { SyncObjectState(); }); } else { updateDispose?.Dispose(); updateDispose = null; preparedDispose?.Dispose(); preparedDispose = null; } }).AddTo(unitData.disposable); }
protected override void OnAdd(GUnit unit) { var unitData = unit.GetData <UnitData>(); _syncData = unit.GetData <ObjectSyncServerData>(); IDisposable updateServerKeyFrameDispose = null; _syncData.enable.Subscribe(_ => { if (_) { updateServerKeyFrameDispose = Observable.Interval(TimeSpan.FromMilliseconds(100)).Subscribe(time => { _syncData.serverKeyFrame++; }); } else { updateServerKeyFrameDispose?.Dispose(); updateServerKeyFrameDispose = null; } }).AddTo(unitData.disposable); }
protected override void OnRemove(GUnit unit) { _syncData.enable.Value = false; _syncData = null; }