public void SetTrueState(vFSMState node) { if (node.canTranstTo) { trueState = node; } }
public void SetFalseState(vFSMState node) { if (node.canTranstTo) { falseState = node; } }
public void SelectState(vFSMState state) { if (onSelectState != null) { onSelectState.Invoke(state); } }
public void ConnectToState(vFSMState state) { if (wantConnection) { transitionPreview.onValidate.Invoke(state); } wantConnection = false; }
public vFSMState TransitTo(vIFSMBehaviourController fsmBehaviour) { var val = true; vFSMState returState = null; for (int i = 0; i < decisions.Count; i++) { bool value = decisions[i].Validate(fsmBehaviour); if (!value) { val = false; } } if (val && trueState) { returState = useTruState && !muteTrue ? trueState : null; } else if (!val && falseState) { returState = useFalseState && !muteFalse ? falseState : null; } if (transitionTimers == null) { transitionTimers = new Dictionary <vIFSMBehaviourController, float>(); } if (!transitionTimers.ContainsKey(fsmBehaviour)) { transitionTimers.Add(fsmBehaviour, 0f); } if (transitionTimers[fsmBehaviour] < transitionDelay && returState) { transitionTimers[fsmBehaviour] += Time.deltaTime; if (fsmBehaviour.debugMode) { fsmBehaviour.SendDebug("<color=green>" + parentState.name + " Delay " + (transitionDelay - transitionTimers[fsmBehaviour]).ToString("00") + " To Enter in " + returState.Name + "</color>", parentState); } return(null); } else { transitionTimers[fsmBehaviour] = 0; if (fsmBehaviour.debugMode && returState) { fsmBehaviour.SendDebug("<color=yellow>" + parentState.name + " Transited to " + returState.name + "</color>", parentState); } } return(returState); }
public vFSMState TransitTo(vIFSMBehaviourController fsmBehaviour) { vFSMState node = defaultTransition; for (int i = 0; i < transitions.Count; i++) { node = transitions[i].TransitTo(fsmBehaviour); if (node) { break; } } return(node); }
public static void DeleteNode(int id, vFSMBehaviour curGraph) { if (curGraph) { if (id >= 0 && id < curGraph.states.Count) { vFSMState deleteNode = curGraph.states[id]; if (deleteNode) { curGraph.selectedNode = null; curGraph.overNode = false; curGraph.states.RemoveAt(id); for (int i = 0; i < deleteNode.actions.Count; i++) { if (deleteNode.actions[i]) { var o = new SerializedObject(deleteNode.actions[i]); o.ApplyModifiedProperties(); } } for (int i = 0; i < deleteNode.transitions.Count; i++) { if (deleteNode.transitions[i].decisions != null) { for (int a = 0; a < deleteNode.transitions[i].decisions.Count; a++) { if (deleteNode.transitions[i].decisions[i].decision) { var o = new SerializedObject(deleteNode.transitions[i].decisions[i].decision); o.ApplyModifiedProperties(); } } } } if (curGraph.states.Count > 2 && curGraph.states[0].defaultTransition == deleteNode) { curGraph.states[0].defaultTransition = curGraph.states[2] as vFSMState; } Undo.DestroyObjectImmediate(deleteNode); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } } }
public virtual void ChangeState(vFSMState state) { if (state && state != currentState && !inChangeState) { inChangeState = true; _lastState = currentState; currentState = null; if (_lastState) { if (debugMode) { SendDebug("<color=red>EXIT:" + _lastState.name + "</color>" + " " + "<color=yellow> ENTER :" + state.Name + " </color> ", gameObject); } _lastState.OnStateExit(this); } currentState = state; state.OnStateEnter(this); inChangeState = false; } }
void OnSelectState(vFSMState state) { Event e = Event.current; if (!e.shift && !inDrawRect) { state.parentGraph.DeselectAll(); } if (!state.isSelected) { state.isSelected = true; } if (Selection.activeObject != state) { Selection.activeObject = state; } if (!selectedStates.Contains(state)) { selectedStates.Add(state); } }
public static void CreateNode(vFSMBehaviour curGraph, Vector2 mousePos) { if (curGraph != null) { vFSMState curState = null; Undo.RecordObject(curGraph, "New Node"); curState = ScriptableObject.CreateInstance <vFSMState>(); curState.Name = "State " + (curGraph.states.Count > 1 ? (curGraph.states.Count - 2).ToString() : ""); if (curGraph.states.Count > 0) { if (curGraph.states[0].defaultTransition == null) { curGraph.states[0].defaultTransition = curState; } } curState.nodeColor = Color.white; if (curState != null) { curState.InitNode(); curState.nodeRect.x = mousePos.x; curState.nodeRect.y = mousePos.y; curState.parentGraph = curGraph; curState.hideFlags = HideFlags.HideInHierarchy; curGraph.states.Add(curState); AssetDatabase.AddObjectToAsset(curState, curGraph); var count = curState.GetSameComponentNameCount <vFSMState>(); if (count > 0) { curState.Name += " " + (count - 1).ToString(); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }
void DrawState(vIFSMBehaviourController target, vFSMState state, GUIStyle style, Color color, GUISkin skin, string label = "") { if (state) { GUILayout.BeginVertical(style, GUILayout.MaxWidth(200)); { if (!string.IsNullOrEmpty(label)) { GUILayout.Box(label, style, GUILayout.Height(30)); } GUILayout.Box(state.name, style, GUILayout.Height(30)); GUI.color = color; GUILayout.BeginVertical(skin.box); { GUILayout.BeginHorizontal(GUILayout.MaxWidth(200)); { GUILayout.Space(5); GUILayout.BeginVertical(GUILayout.Width(200)); { var fontTransitionStyle = new GUIStyle(EditorStyles.whiteMiniLabel); fontTransitionStyle.alignment = TextAnchor.MiddleCenter; fontTransitionStyle.stretchWidth = true; // fontTransitionStyle.wordWrap = true; if (state.transitions.Count > 0) { GUILayout.Label("Transitions", fontTransitionStyle); for (int i = 0; i < state.transitions.Count; i++) { var transition = state.transitions[i]; GUILayout.BeginVertical(skin.GetStyle("BoxLarge")); { if (transition.useTruState) { GUILayout.Label((transition.transitionType == vTransitionOutputType.TrueFalse? "Output True:":"Output Default") + " >>> " + (transition.trueState && !transition.muteTrue ? transition.trueState.name : "None"), fontTransitionStyle); } if (transition.useFalseState && transition.transitionType == vTransitionOutputType.TrueFalse) { GUILayout.Label((transition.transitionType == vTransitionOutputType.TrueFalse ? "Output False:" : "Output Default") + " >>> " + (transition.falseState && !transition.muteFalse ? transition.falseState.name : "None"), fontTransitionStyle); } GUILayout.BeginHorizontal(); { if (transition.decisions.Count > 0) { GUILayout.Space(5); GUILayout.BeginVertical(); for (int a = 0; a < transition.decisions.Count; a++) { // fontTransitionStyle.fontSize = 10; GUILayout.BeginHorizontal(skin.box, GUILayout.Height(20)); { var decision = transition.decisions[a]; if (decision.decision) { var valid = false; if (decision.validationByController != null && decision.validationByController.ContainsKey(target)) { valid = decision.validationByController[target]; } validationStyle = new GUIStyle(skin.box); GUILayout.Label(decision.decision.Name + " = " + decision.trueValue, fontTransitionStyle, GUILayout.Height(15)); //vcolor = valid ? Color.green : Color.red; validationStyle.fontSize = 12; validationStyle.fontStyle = FontStyle.Bold; validationStyle.normal.textColor = valid ? Color.green : Color.red; GUILayout.FlexibleSpace(); GUILayout.Box(valid ? "YES" : "NO", validationStyle, GUILayout.Width(30), GUILayout.ExpandHeight(true)); GUI.color = color; } } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUILayout.Space(5); } } GUILayout.EndHorizontal(); GUILayout.Space(5); } GUILayout.EndVertical(); } } else if (state.defaultTransition) { GUILayout.Label("Output Direct >>> " + state.defaultTransition.name, fontTransitionStyle); } else { GUILayout.Label("Without Transition", fontTransitionStyle); } } GUILayout.EndVertical(); GUILayout.Space(5); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } GUILayout.EndVertical(); GUILayout.Space(5); } }