private static void Cache <T>(MonoBehaviour p) where T : SFHCall { var type = p.GetType(); // 不会重复调用父类的方法了。 var fields2 = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (var field in fields2) { AtrributeFlagFunction aff = new AtrributeFlagFunction(); var objs = field.GetCustomAttributes(typeof(T), false); if (objs.Length > 0) { aff.monob = p; aff.methodInfo = field; T attr = (T)objs[0]; int value = attr.GetLevel(); if (!myFuctionList.ContainsKey(value)) { { List <AtrributeFlagFunction> AttributeList = new List <AtrributeFlagFunction>(); AttributeList.Add(aff); myFuctionList.Add(value, AttributeList); } } else { List <AtrributeFlagFunction> mlist = (List <AtrributeFlagFunction>)myFuctionList[value]; mlist.Add(aff); } //Debug.Log(field.GetMethodBody().ToString() + "my levle is " + value); } } }
private static void InitialStart() { MonoBehaviour[] testMono = GetScriptAssetsOfType <MonoBehaviour>(); AttributeUtils.GetAllDestByProperties <SFHStartCall>(testMono); for (int i = 0; i < AttributeUtils.myFuctionList.Count; i++) { List <AtrributeFlagFunction> mlist = (List <AtrributeFlagFunction>)AttributeUtils.myFuctionList.GetByIndex(i); for (int j = 0; j < mlist.Count; j++) { AtrributeFlagFunction item = (AtrributeFlagFunction)mlist[j]; Debug.Log("order is " + AttributeUtils.myFuctionList.GetKey(i)); MonoBehaviour monob = (MonoBehaviour)item.monob; object result = item.methodInfo.Invoke((object)monob, new object[] { }); if (item.methodInfo.ReturnType == typeof(IEnumerator)) { monob.StartCoroutine((IEnumerator)result); } } } }