예제 #1
0
    private void CreateStateNode(VFSMState state)
    {
        if (state == null)
        {
            Debug.LogError("[VFSMGraphView] CreatePort : Node is null.");
            return;
        }

        var node = new BaseNode {
            title = state.StateName,
            GUID  = state.GUID
        };

        var port = CreatePort(node, "", Direction.Input, Port.Capacity.Multi);

        node.inputContainer.Add(port);

        var _transitions = Utility.GetField <List <VFSMState.Transition> >(state, "_transitions");

        for (int i = 0; i < _transitions.Count; i++)
        {
            port          = CreatePort(node, _transitions[i].EventName, Direction.Output, Port.Capacity.Single);
            port.portName = _transitions[i].EventName;
            node.outputContainer.Add(port);

            /*
             * var label = port.contentContainer.Q<Label>("type");
             * port.contentContainer.Remove(label);
             *
             * var textField = new TextField {
             *  name = string.Empty,
             *  value = _transitions[i].EventName
             * };
             *
             * textField.RegisterValueChangedCallback((e) => {
             *  ChangeEventName((port.node as BaseNode).GUID, port.portName, e.newValue);
             *  port.portName = e.newValue;
             * });
             * port.contentContainer.Add(textField);
             *
             * var deleteButton = new Button(() => Debug.Log("Wanna Delete !!!")) {
             *  text = "X"
             * };
             *
             * port.contentContainer.Add(deleteButton);
             */
        }

        node.SetPosition(new Rect(Vector2.zero, DEFAULT_NODE_SIZE));
        node.RefreshExpandedState();
        node.RefreshPorts();

        AddElement(node);
    }
예제 #2
0
    private void Awake()
    {
        for (int i = 0; i < _states.Count; i++)
        {
            _states[i].OnInitialize.Invoke(this);
            _stateTable.Add(_states[i].StateName, _states[i]);
        }

        if (_stateTable.ContainsKey(_firstState))
        {
            _current = _stateTable[_firstState];
        }
    }
예제 #3
0
    private void TransferState()
    {
        if (_next == null)
        {
            return;
        }

        var next = _next;

        _next = null;

        _current?.OnLeave.Invoke(this);
        _current = next;
        _current.OnEnter.Invoke(this);
    }
예제 #4
0
    public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
    {
        base.BuildContextualMenu(evt);

        if (evt.target is GraphView)
        {
            evt.menu.AppendAction("New State", (e) => {
                if (_states != null)
                {
                    var state = new VFSMState();
                    CreateStateNode(state);
                    _states.Add(state);
                }
            });
        }
    }
예제 #5
0
    public void TriggerEvent(string eventName, bool immediately = false)
    {
        if (_current == null)
        {
            Debug.LogErrorFormat("[VFSM-{0}] TriggerEvent : Current State is null.", name);
            return;
        }

        var nextStateName = _current[eventName];

        if (_stateTable.ContainsKey(nextStateName))
        {
            _next = _stateTable[nextStateName];
            if (immediately)
            {
                TransferState();
            }
        }
        else
        {
            Debug.LogErrorFormat("[VFSM-{0}] TriggerEvent : Event({1}) dosen't exist in the state({2})",
                                 name, eventName, _current.StateName);
        }
    }