// 调用功能 protected bool doFunction(XMLFunctionStruct f) { if (f == null) { return(false); } // 遍历该功能绑定的条件检查 foreach (XMLConditionStruct c in f.mConditions) { if (mSceneInterfaceMap.ContainsKey(c.mType)) { // 调用场景提供的功能接口 SceneFunctionInterface funcCondition = mSceneInterfaceMap[c.mType]; if (!funcCondition(c.mParams)) { return(false); } } } // 检查成功 调用功能函数 if (mSceneInterfaceMap.ContainsKey(f.mType)) { SceneFunctionInterface funcInterface = mSceneInterfaceMap[f.mType]; funcInterface(f.mParams); } return(true); }
// 解析Functions private void ParseFunctions(XmlNode node) { if (!mEventsInited) { GameDebug.LogError("ScriptXML Error : Events 需要位于 Functions 之前!"); return; } XmlNodeList nodeList = node.ChildNodes; for (int i = 0; i < nodeList.Count; ++i) { XmlNode childNode = nodeList[i]; if (childNode != null && childNode.Name == "Function") { string type = childNode.Attributes["type"].Value; if (type == null || type.Length < 1) { continue; } XMLFunctionStruct xmlFunction = new XMLFunctionStruct(); xmlFunction.mName = childNode.Attributes["name"].Value; xmlFunction.mType = childNode.Attributes["type"].Value; int index = 1; XmlAttribute attrib = null; while ((attrib = childNode.Attributes["param" + index.ToString()]) != null) { xmlFunction.mParams.Add(attrib.Value); index++; } //mFunctionsList.Add(xmlFunction); if (mFunctionsNameMap.ContainsKey(xmlFunction.mName)) { GameDebug.LogError("ScriptXML Error : Function自命名重复!name:" + xmlFunction.mName); } mFunctionsNameMap.Add(xmlFunction.mName, xmlFunction); XmlAttribute evtattrib = childNode.Attributes["event"]; if (evtattrib != null) { string eventName = evtattrib.Value; if (mEventsNameMap.ContainsKey(eventName)) { mEventsNameMap[eventName].mFunctions.Add(xmlFunction); } // GameDebug.Log("mEventsNameMap.mFunctions.Count:" + mEventsNameMap[eventName].mFunctions.Count.ToString() + // " mEventTypeMap.mFunctions.Count:" + (mEventsTypeMap[mEventsNameMap[eventName].mType][0] as XMLEventStruct).mFunctions.Count.ToString()); } } } mFunctionsInited = true; }
// 外部调用功能 public bool InvokeFunction(string name) { if (string.IsNullOrEmpty(name)) { return(false); } if (!mFunctionsNameMap.ContainsKey(name)) { return(false); } XMLFunctionStruct xmlfunc = mFunctionsNameMap[name]; return(doFunction(xmlfunc)); }