public static void ShowVarAcc(object o, VarHandleTemplate vh, FieldInfo fi) { if (!(fi.FieldType.IsGenericType && fi.FieldType.GetGenericTypeDefinition() == typeof(VarAccesser <>))) { return; } List <Variable> var = vh.Variables; List <Variable> u = var.Where(x => fi.FieldType.GenericTypeArguments[0].IsAssignableFrom(x.GetVarType())).ToList(); if (u.Count <= 0) { EditorGUILayout.LabelField($"{fi.Name}: No variables of type {fi.FieldType.GenericTypeArguments[0].Name} found"); return; } object va = fi.GetValue(o); FieldInfo idxF = fi.FieldType.GetField("idx"); int varIdx = (int)idxF.GetValue(va); int uIdx = varIdx >= 0 && varIdx < var.Count ? u.IndexOf(var[varIdx]) : 0; uIdx = EditorGUILayout.Popup(fi.Name, uIdx >= 0 && uIdx < u.Count ? uIdx : 0, u.Select(x => x.name).ToArray()); //idxF.SetValue(va, var.IndexOf(u[uIdx])); object r = System.Activator.CreateInstance(fi.FieldType, var.IndexOf(u[uIdx])); fi.SetValue(o, r); }
public static void ShowVars(object o, VarHandleTemplate vh) { foreach (FieldInfo fi in o.GetType().GetFields()) { ShowVarAcc(o, vh, fi); ShowVarAtt(o, vh, fi); } }
public VarHandle(VarHandleTemplate template, object varHolder) { variables = new List <Variable>(); foreach (Variable v in template) { Variable x = v.Duplicate(varHolder); variables.Add(x); } }
public static VarHandleTemplateEditor GetCreateEditor(VarHandleTemplate vh) { VarHandleTemplateEditor vhe = SODatabase.GetSubObjectOfType <VarHandleTemplateEditor>(vh); if (vhe) { return(vhe); } vhe = CreateInstance <VarHandleTemplateEditor>(); vhe.varHandle = vh; vhe.name = vh.name + "Editor"; AssetDatabase.AddObjectToAsset(vhe, vh); return(vhe); }
public static void ShowVarAtt(object o, VarHandleTemplate vh, FieldInfo fi) { VarIdxAttribute a = fi.GetCustomAttribute <VarIdxAttribute>(); if (typeof(int) != fi.FieldType || a == null) { return; } List <Variable> var = vh.Variables; List <Variable> u = var.Where(x => a.t.IsAssignableFrom(x.GetVarType())).ToList(); int varIdx = (int)fi.GetValue(o); int uIdx = varIdx >= 0 && varIdx < var.Count ? u.IndexOf(var[varIdx]) : 0; uIdx = EditorGUILayout.Popup(fi.Name, uIdx >= 0 && uIdx < u.Count ? uIdx : 0, u.Select(x => x.name).ToArray()); fi.SetValue(o, var.IndexOf(u[uIdx])); }