Beispiel #1
0
    private void SelectNodeType(out BrainNode t_node, string t_nodeName, string t_nodeType)
    {
        switch (t_nodeType)
        {
        case "Task":
            t_node = new BrainTask();
            MethodInfo method = typeof(Brain).GetMethod(t_nodeName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            ((BrainTask)t_node).taskAction = (BrainAction)Delegate.CreateDelegate(typeof(BrainAction), this, method);
            break;

        case "Sequence":
            t_node = new BrainSequence();
            break;

        case "Selector":
            t_node = new BrainSelector();
            method = typeof(Brain).GetMethod(t_nodeName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            ((BrainSelector)t_node).condition = (BrainSelectorCondition)Delegate.CreateDelegate(typeof(BrainSelectorCondition), this, method);
            break;

        case "State":
            t_node = new BrainState();
            break;

        default:
            t_node = new BrainNode();
            break;
        }

        t_node.nodeName = t_nodeName;
    }
Beispiel #2
0
    // Update is called once per frame
    private void Update()
    {
        BrainTransition triggeredTransition = null;

        foreach (KeyValuePair <string, BrainTransition> transition in sm_currentState.transitions)
        {
            if (transition.Value.isTriggered)
            {
                triggeredTransition          = transition.Value;
                transition.Value.isTriggered = false;
                break;
            }
        }

        if (triggeredTransition != null)
        {
            BrainNode targetState = triggeredTransition.targetState;

            triggeredTransition.ExecuteTransition();

            sm_currentState = targetState;
        }
        else
        {
            sm_currentState.Execute();
            if (m_nextState != null)
            {
                sm_currentState = m_nextState;
                m_nextState     = null;
            }
        }
    }
Beispiel #3
0
    private void LoadBeaviorTree(BrainState t_state)
    {
        // Read JSON...
        string jsonPath   = Application.persistentDataPath + "/" + t_state.nodeName + ".json";
        string jsonString = File.ReadAllText(jsonPath);

        JSONObject SMJson = (JSONObject)JSON.Parse(jsonString);

        BehaviorTree bt = new BehaviorTree
        {
            btName = t_state.nodeName
        };

        bt.bt_initialNode = new BrainNode();
        SelectNodeType(out bt.bt_initialNode, SMJson["entryNode"]["nodeName"], SMJson["entryNode"]["nodeType"]);

        if (!bt_nodes.ContainsKey(bt.bt_initialNode.nodeName))
        {
            bt_nodes.Add(bt.bt_initialNode.nodeName, bt.bt_initialNode);
        }

        // Rest of the states
        foreach (JSONObject btNode in SMJson["nodes"])
        {
            BrainNode newNode = new BrainNode();
            SelectNodeType(out newNode, btNode["nodeName"], btNode["nodeType"]);

            if (!bt_nodes.ContainsKey(newNode.nodeName))
            {
                bt_nodes.Add(newNode.nodeName, newNode);
            }
        }

        // Entry point transitions
        foreach (JSONArray jsonTransition in SMJson["entryNode"]["outputs"])
        {
            BrainTransition transition = new BrainTransition
            {
                targetState = bt_nodes[jsonTransition[1]]
            };

            bt.bt_initialNode.transitions.Add(jsonTransition[1], transition);
        }

        // Rest of the transitions
        foreach (JSONObject state in SMJson["nodes"])
        {
            foreach (JSONArray jsonTransition in state["outputs"])
            {
                BrainTransition transition = new BrainTransition
                {
                    targetState = bt_nodes[jsonTransition[1]]
                };

                bt_nodes[jsonTransition[0]].transitions.Add(jsonTransition[1], transition);
            }
        }

        t_state.behavior = bt;
    }
Beispiel #4
0
    private void LoadBrain()
    {
        // Read JSON...
        string jsonPath   = Application.persistentDataPath + "/StateMachine.json";
        string jsonString = File.ReadAllText(jsonPath);

        JSONObject SMJson = (JSONObject)JSON.Parse(jsonString);

        // Entry point
        BrainState sm_entryState = new BrainState
        {
            nodeName = SMJson["entryNode"]["nodeName"]
        };

        sm_states.Add(sm_entryState.nodeName, sm_entryState);

        sm_initialState = sm_entryState;

        LoadBeaviorTree(sm_entryState);

        // Rest of the states

        foreach (JSONObject state in SMJson["nodes"])
        {
            BrainState newState = new BrainState
            {
                nodeName = state["nodeName"]
            };

            sm_states.Add(newState.nodeName, newState);

            LoadBeaviorTree(newState);
        }

        // Entry point transitions
        foreach (JSONArray jsonTransition in SMJson["entryNode"]["outputs"])
        {
            BrainTransition transition = new BrainTransition
            {
                targetState = sm_states[jsonTransition[1]]
            };

            sm_entryState.transitions.Add(jsonTransition[1], transition);
        }

        // Rest of the transitions
        foreach (JSONObject state in SMJson["nodes"])
        {
            foreach (JSONArray jsonTransition in state["outputs"])
            {
                BrainTransition transition = new BrainTransition
                {
                    targetState = sm_states[jsonTransition[1]]
                };

                sm_states[jsonTransition[0]].transitions.Add(jsonTransition[1], transition);
            }
        }
    }
    //public BrainNode(int inIndex, Vector3 loc, string inRegion, string inDescription)
    //{
    //    node = Instantiate(node, loc, Quaternion.identity);
    //    index = inIndex;
    //    node.name = "RollerBall" + index;
    //    region = inRegion;
    //    desc = inDescription;
    //}

    public static BrainNode CreateBrainNode(GameObject node, int ind, string inRegion, string inDescription)
    {
        BrainNode myBrainNode = node.AddComponent <BrainNode>();

        myBrainNode.index  = ind;
        myBrainNode.region = inRegion;
        myBrainNode.desc   = inDescription;
        node.name          = inRegion;
        return(myBrainNode);
    }
Beispiel #6
0
        public CharacterBrain(BaseCharacter character, BrainNode brainNode)
        {
            this.character = character;
            this.brainNode = brainNode;
            this.brainNode.SetCharacter(character);
            this.currentTask = null;

/*			this.taskRunner.onEndTask = delegate {
 *                              if (this.taskRunner.task.taskStatus == TaskStatus.Success) {
 *                                      ///Debug.Log("Clearing task (success)");
 *                                      this.currentTaskData = null;
 *                              } else if (this.taskRunner.task.taskStatus ==  TaskStatus.Failed) {
 *                                      //Debug.Log("Clearing task (failed)");
 *                                      this.currentTaskData = null;
 *                              }
 *                      };
 */
        }
    //public GameObject[] child = new GameObject[96];

    private void Start()
    {
        brain = new GameObject[96];
        float[][] positions = ReadCSVFile();
        string[]  regions   = ReadRegions();
        SetFrameData();

        for (int i = 0; i < 96; i++)
        {
            Vector3 loc = new Vector3(positions[i][0], positions[i][1], positions[i][2]);
            brain[i] = Instantiate(visualizer, loc, Quaternion.identity);
            //placeholder sphere object
            GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            sphere.transform.position = loc;
            //make sphere child component of brain node, with no particular use by now...
            //comment it bacuase rollerball prefab moves ...? comment it out if rollerball works fine
            //sphere.transform.parent = brain[i].transform;

            BrainNode.CreateBrainNode(brain[i], i, "a" + i, "a" + i);
            if (brain[i].GetComponent <LineRenderer>() == null)
            {
                brain[i].AddComponent <LineRenderer>();
            }
            //assign text
            MeshFilter meshFilter = brain[i].GetComponent <MeshFilter>();
            DestroyImmediate(meshFilter);
            brain[i].AddComponent <TextMesh>();
            brain[i].GetComponent <TextMesh>().text = regions[i];
            //make text invisible for now; text will be visible in laser script
            //brain[i].GetComponent<MeshRenderer>().enabled = false;
        }

        /**for (int i = 0; i < NUM_FRAMES; ++i)
         * {
         *  //RenderAllLines(GetFrameData(i));
         *  //StartCoroutine(ClearChords());
         * }**/

        //RenderAllLines(GetFrameData(0));
        StartCoroutine(ClearChords());
        //RenderAllLines(GetFrameData(20));
        //StartCoroutine(ClearChords());
    }
Beispiel #8
0
 private void GoIdle()
 {
     m_nextState = sm_states["Idle"];
     print("I am transitioning to Idle!!");
 }
Beispiel #9
0
 private void GoEat()
 {
     m_nextState = sm_states["Eat"];
     print("I am transitioning to Eat!!");
 }
Beispiel #10
0
 private void GoDrink()
 {
     m_nextState = sm_states["Drink"];
     print("I am transitioning to Drink!!");
 }
Beispiel #11
0
 public void SetUpStateMachine()
 {
     sm_currentState = sm_initialState;
 }