예제 #1
0
        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);
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        static void Stop(ObjectStateProcessData stateProcessData)
        {
            var currentState = stateProcessData.currentState;

            currentState.stateTypeProperty.Value = ObjectStateType.Stop;

            stateProcessData.currentState = null;
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
                }
            }
        }
예제 #6
0
        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);
            }
        }
예제 #7
0
 public virtual bool CanFinish(GUnit unit, ObjectStateProcessData processData, ObjectStateData stateData)
 {
     return(true);
 }
예제 #8
0
 public virtual bool CanUpdate(GUnit unit, ObjectStateProcessData processData, ObjectStateData stateData, Vector3 param)
 {
     return(true);
 }
예제 #9
0
 public ValueTuple <bool, Vector3> CheckControl(GUnit unit, ObjectControlData controlData,
                                                ObjectStateProcessData stateProcessData)
 {
     return(OnCheckControl(unit, controlData, stateProcessData.currentState?.id));
 }