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>(); var controlStateData = unit.GetData <ObjectControlStateData>(); var controlProcessData = unit.GetData <ObjectKeyboardControlProcessData>(); var stateProcessData = unit.GetData <ObjectStateProcessData>(); controlStateData.stateType.Subscribe(controlStateType => { if (controlStateType == ObjectControlStateType.Start) { controlProcessData.checkDispose = GameSystem.ObserveEveryUpdate().Subscribe(_ => { foreach (var controlData in controlProcessData.controlDataList) { if (Input.GetKeyDown(controlData.key)) { ObjectControlStateTypeDict.Set(unit, controlData.controlType, KeyStateType.Down); ObjectControlState.CheckAllControl(unit, controlData.controlType, controlStateData, stateProcessData); } else if (Input.GetKeyUp(controlData.key)) { ObjectControlStateTypeDict.Set(unit, controlData.controlType, KeyStateType.Up); ObjectControlState.CheckAllControl(unit, controlData.controlType, controlStateData, stateProcessData); ObjectControlStateTypeDict.Set(unit, controlData.controlType, KeyStateType.None); } } }); } else if (controlStateType == ObjectControlStateType.Finish) { controlProcessData.checkDispose?.Dispose(); } }).AddTo(unitData.disposable); }