/// <summary> /// Get invoke node code. /// </summary> /// <param name="target"></param> /// <returns></returns> public static string GetInvokeNodeCode(StateEventNode target) { if (target == null) { throw new System.ArgumentNullException(nameof(target)); } if (!generatorData.ungroupedNode.Contains(target)) { throw new uNodeException($"Forbidden to generate state code because the node: {target.GetNodeName()} is not registered as State Node.\nEnsure to register it using {nameof(CodeGenerator)}.{nameof(CodeGenerator.RegisterAsStateNode)}", target); } return(RunEvent(target)); }
public override void OnInspectorGUI() { StateEventNode comp = target as StateEventNode; EditorGUI.BeginChangeCheck(); DrawDefaultInspector(); switch (comp.eventType) { case StateEventNode.EventType.OnAnimatorIK: uNodeGUIUtility.ShowField( new GUIContent("Store Parameter"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(int)) { SetMember = true } }, comp); break; case StateEventNode.EventType.OnApplicationFocus: case StateEventNode.EventType.OnApplicationPause: uNodeGUIUtility.ShowField( new GUIContent("Store Parameter"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(bool)) { SetMember = true } }, comp); break; case StateEventNode.EventType.OnCollisionEnter: case StateEventNode.EventType.OnCollisionExit: case StateEventNode.EventType.OnCollisionStay: uNodeGUIUtility.ShowField( new GUIContent("Store Collision"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(Collision)) { SetMember = true } }, comp); break; case StateEventNode.EventType.OnCollisionEnter2D: case StateEventNode.EventType.OnCollisionExit2D: case StateEventNode.EventType.OnCollisionStay2D: uNodeGUIUtility.ShowField( new GUIContent("Store Collision2D"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(Collision2D)) { SetMember = true } }, comp); break; case StateEventNode.EventType.OnTriggerEnter: case StateEventNode.EventType.OnTriggerExit: case StateEventNode.EventType.OnTriggerStay: uNodeGUIUtility.ShowField( new GUIContent("Store Collider"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(Collider)) { SetMember = true } }, comp); break; case StateEventNode.EventType.OnTriggerEnter2D: case StateEventNode.EventType.OnTriggerExit2D: case StateEventNode.EventType.OnTriggerStay2D: uNodeGUIUtility.ShowField( new GUIContent("Store Collider2D"), "storeParameter", comp, new object[] { new FilterAttribute(typeof(Collider2D)) { SetMember = true } }, comp); break; default: if (comp.storeParameter.isAssigned) { comp.storeParameter = MemberData.none; } break; } if (EditorGUI.EndChangeCheck()) { uNodeGUIUtility.GUIChanged(comp); } }
/// <summary> /// Generate code for target node /// </summary> /// <param name="target"></param> /// <returns></returns> public static string GenerateNode(StateEventNode target) { if (target) { if (generatorData.generatedData.ContainsKey(target)) { return(generatorData.generatedData[target]); } string data = null; try { string fName = target.eventType.ToString(); List <string> parameterType = new List <string>(); switch (target.eventType) { case StateEventNode.EventType.OnAnimatorIK: parameterType.Add(ParseType(typeof(int))); break; case StateEventNode.EventType.OnApplicationFocus: case StateEventNode.EventType.OnApplicationPause: parameterType.Add(ParseType(typeof(bool))); break; case StateEventNode.EventType.OnCollisionEnter: case StateEventNode.EventType.OnCollisionExit: case StateEventNode.EventType.OnCollisionStay: parameterType.Add(ParseType(typeof(Collision))); break; case StateEventNode.EventType.OnCollisionEnter2D: case StateEventNode.EventType.OnCollisionExit2D: case StateEventNode.EventType.OnCollisionStay2D: parameterType.Add(ParseType(typeof(Collision2D))); break; case StateEventNode.EventType.OnTriggerEnter: case StateEventNode.EventType.OnTriggerExit: case StateEventNode.EventType.OnTriggerStay: parameterType.Add(ParseType(typeof(Collider))); break; case StateEventNode.EventType.OnTriggerEnter2D: case StateEventNode.EventType.OnTriggerExit2D: case StateEventNode.EventType.OnTriggerStay2D: parameterType.Add(ParseType(typeof(Collider2D))); break; } MData mData = generatorData.GetMethodData(fName, parameterType); if (mData == null && target.eventType != StateEventNode.EventType.OnEnter && target.eventType != StateEventNode.EventType.OnExit) { var func = graph.GetFunction(fName); Type funcType = typeof(void); if (func != null) { funcType = func.ReturnType(); } mData = generatorData.AddMethod(fName, ParseType(funcType), parameterType); } string initStatement = null; switch (target.eventType) { case StateEventNode.EventType.OnAnimatorIK: case StateEventNode.EventType.OnApplicationFocus: case StateEventNode.EventType.OnApplicationPause: case StateEventNode.EventType.OnCollisionEnter: case StateEventNode.EventType.OnCollisionExit: case StateEventNode.EventType.OnCollisionStay: case StateEventNode.EventType.OnCollisionEnter2D: case StateEventNode.EventType.OnCollisionExit2D: case StateEventNode.EventType.OnCollisionStay2D: case StateEventNode.EventType.OnTriggerEnter: case StateEventNode.EventType.OnTriggerExit: case StateEventNode.EventType.OnTriggerStay: case StateEventNode.EventType.OnTriggerEnter2D: case StateEventNode.EventType.OnTriggerExit2D: case StateEventNode.EventType.OnTriggerStay2D: if (target.storeParameter.isAssigned) { initStatement = GenerateSetCode(ParseValue((object)target.storeParameter), mData.parameters[0].name); } break; } var flows = target.GetFlows(); if (flows != null && flows.Count > 0) { string contents = GenerateFlowCode(flows, target); if (debugScript) { contents += GenerateDebugCode(target, StateType.Success); } data = contents; if (!string.IsNullOrEmpty(data) && mData != null) { mData.AddCode(initStatement + GetInvokeNodeCode(target).AddLineInFirst(), -100); } } if (setting.fullComment && !string.IsNullOrEmpty(data)) { data = data.Insert(0, "//" + target.gameObject.name + " | Type:" + ParseType(target.GetType()).AddLineInEnd()); } data = data.AddLineInFirst(); } catch (Exception ex) { if (!generatorData.hasError) { if (setting != null && setting.isAsync) { generatorData.errors.Add(ex); //In case async return error commentaries. return("/*Error from node: " + target.gameObject.name + " */"); } Debug.LogError("Error from node:" + target.gameObject.name + " |Type:" + target.GetType() + "\nError:" + ex.ToString(), target); } generatorData.hasError = true; throw; } if (string.IsNullOrEmpty(data)) { Debug.Log("Node not generated data", target); } if (includeGraphInformation) { data = WrapWithInformation(data, target); } generatorData.generatedData.Add(target, data); return(data); } throw new System.Exception("Target node is null"); }