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; }
// 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; } } }
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; }
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); }
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()); }
private void GoIdle() { m_nextState = sm_states["Idle"]; print("I am transitioning to Idle!!"); }
private void GoEat() { m_nextState = sm_states["Eat"]; print("I am transitioning to Eat!!"); }
private void GoDrink() { m_nextState = sm_states["Drink"]; print("I am transitioning to Drink!!"); }
public void SetUpStateMachine() { sm_currentState = sm_initialState; }