static IndependentObjectStateData GetHighestPriorityState(GUnit unit, ObjectStateProcessData stateProcessData) { var stateDataList = ObjectStateDataDict.Get(unit).Where(_ => _ is IndependentObjectStateData); var minPriority = 0; IndependentObjectStateData result = null; foreach (var stateData in stateDataList) { if (stateData.stateTypeProperty.Value != ObjectStateType.Stop) { continue; } if (!stateData.objectState.CanStart(unit, stateProcessData, stateData, Vector3.zero)) { continue; } var independentStateData = stateData as IndependentObjectStateData; if (independentStateData.priority >= minPriority) { minPriority = independentStateData.priority; result = independentStateData; } } return(result); }
static void Finish(GUnit unit, ObjectStateProcessData stateProcessData, ObjectStateData stateData = null) { var currentState = stateData == null ? stateProcessData.currentState : stateData; if (currentState == null) { return; } if (currentState is IndependentObjectStateData) { if (currentState.stateTypeProperty.Value == ObjectStateType.Start) { currentState.stateTypeProperty.Value = ObjectStateType.Finish; stateProcessData.currentState = null; var newStateData = GetHighestPriorityState(unit, stateProcessData); Start(stateProcessData, newStateData); } else if (currentState.stateTypeProperty.Value == ObjectStateType.Stop) { currentState.stateTypeProperty.Value = ObjectStateType.Finish; } } else { currentState.stateTypeProperty.Value = ObjectStateType.Finish; } }
static void Stop(ObjectStateProcessData stateProcessData) { var currentState = stateProcessData.currentState; currentState.stateTypeProperty.Value = ObjectStateType.Stop; stateProcessData.currentState = null; }
static void Start(ObjectStateProcessData stateProcessData, ObjectStateData stateData) { if (stateData is IndependentObjectStateData) { if (stateProcessData.currentState != null) { Stop(stateProcessData); } stateData.stateTypeProperty.Value = ObjectStateType.Start; stateProcessData.currentState = stateData as IndependentObjectStateData; } else { stateData.stateTypeProperty.SetValueAndForceNotify(ObjectStateType.Start); } }
public static void CheckAllControl(GUnit unit, int controlType, ObjectControlStateData controlStateData, ObjectStateProcessData stateProcessData) { var controlDataList = ObjectControlDataDict.Get(unit); foreach (var controlData in controlDataList) { if (!ContainsControlType(controlData.objectControl.ControlTypeList, controlType)) { continue; } var controlModule = controlData.objectControl; var result = controlModule.CheckControl(unit, controlData, stateProcessData); if (result.Item1) { DoState(unit, controlData, result.Item2); } } }
public virtual bool CanStart(GUnit unit, ObjectStateProcessData stateProcessData, ObjectStateData stateData, Vector3 param) { if (stateData is IndependentObjectStateData) { var currentState = stateProcessData.currentState; if (currentState == null) { return(true); } var independentState = stateData as IndependentObjectStateData; var isSameState = currentState == independentState; var containExcludeState = ContainExcludeState(currentState.objectState.ExcludeIdList, stateData.id); var higherPriority = independentState.priority >= currentState.priority; return(isSameState && independentState.param != param || !isSameState && !containExcludeState && higherPriority); } else { return(true); } }
public virtual bool CanFinish(GUnit unit, ObjectStateProcessData processData, ObjectStateData stateData) { return(true); }
public virtual bool CanUpdate(GUnit unit, ObjectStateProcessData processData, ObjectStateData stateData, Vector3 param) { return(true); }
public ValueTuple <bool, Vector3> CheckControl(GUnit unit, ObjectControlData controlData, ObjectStateProcessData stateProcessData) { return(OnCheckControl(unit, controlData, stateProcessData.currentState?.id)); }