public Component ReadFromJson(IResMgr resmgr, GameObject node, MyJson.JsonNode_Object json, DelayProcess dp) { SkinnedMeshRenderer c = node.GetComponent(comptype) as SkinnedMeshRenderer; if (c == null)//这就可能了 c = node.AddComponent<SkinnedMeshRenderer>(); //mats var mats = json["mats"].AsList(); Material[] rmats = new Material[mats.Count]; for (int i = 0; i < mats.Count; i++) { string hashname = mats[i].AsString(); rmats[i] = resmgr.GetMat(hashname); } c.materials = rmats; //bound var center = StringHelper.ToVector3(json["center"].AsString()); var size = StringHelper.ToVector3(json["size"].AsString()); c.localBounds = new Bounds(center, size); //mesh var mesh = resmgr.GetMesh(json["mesh"].AsString()); c.sharedMesh = mesh; //延迟恢复 if (json.ContainsKey("rootboneobj")) { dp.delayCall += () => { c.rootBone = dp.mapObjs[json["rootboneobj"].AsInt()].transform; }; } if (json.ContainsKey("boneobjs")) { dp.delayCall += () => { var array = json["boneobjs"] as MyJson.JsonNode_Array; List<Transform> bones = new List<Transform>(); foreach (var b in array) { bones.Add(dp.mapObjs[b.AsInt()].transform); } c.bones = bones.ToArray(); }; } return c; }
void Json2Obj(MyJson.JsonNode_Object _json, GameObject _obj, DelayProcess dp) { _obj.name = _json["name"].AsString(); var comps = _json["components"].AsList(); if (_json.ContainsKey("id")) { var id = _json["id"].AsInt(); dp.mapObjs[id] = _obj; } //遍历填充组件 foreach (MyJson.JsonNode_Object c in comps) { string type = c["type"].AsString(); this.componentParsers[type].ReadFromJson(resmgr, _obj, c, dp); } //遍历填充树 if (_json.ContainsKey("children")) { var children = _json["children"].AsList(); foreach (MyJson.JsonNode_Object subjson in children) { GameObject subobj = new GameObject(); subobj.transform.SetParent(_obj.transform); Json2Obj(subjson, subobj, dp); } } }
public static object FromJson(string ScriptTypeName, MyJson.JsonNode_Object data) { var type = env.GetTypeByKeywordQuiet(ScriptTypeName); CSLE.SType stype = type.function as CSLE.SType; CSLE.SInstance s = new CSLE.SInstance(); s.type = stype; foreach (var m in stype.members) { if (m.Value.bStatic) continue; s.member[m.Key] = new CSLE.CLS_Content.Value(); s.member[m.Key].type = m.Value.type.type; s.member[m.Key].value = m.Value.type.DefValue;//先填默认值 if (data.ContainsKey(m.Key) == false)//json中没有的部分填默认值 continue; if (data[m.Key].IsNull())//json中没有的部分填默认值 continue; { if ((Type)m.Value.type.type == typeof(int)) { s.member[m.Key].value = data[m.Key].AsInt(); } else if ((Type)m.Value.type.type == typeof(float)) { s.member[m.Key].value = (float)data[m.Key].AsDouble(); } else if ((Type)m.Value.type.type == typeof(double)) { s.member[m.Key].value = data[m.Key].AsDouble(); } else if ((Type)m.Value.type.type == typeof(string)) { s.member[m.Key].value = data[m.Key].AsString(); } else if ((Type)m.Value.type.type == typeof(List<object>)) { //处理List List<object> list = new List<object>(); s.member[m.Key].value = list; int i = m.Value.type.keyword.IndexOf('<'); string subtype = m.Value.type.keyword.Substring(i + 1); subtype = subtype.Remove(subtype.Length - 1); foreach (MyJson.JsonNode_Object item in data[m.Key].AsList()) { list.Add(FromJson(subtype, item)); } } else if ((Type)m.Value.type.type == typeof(List<string>)) { List<string> list = new List<string>(); s.member[m.Key].value = list; foreach (MyJson.JsonNode_ValueString item in data[m.Key].AsList()) { list.Add(item); } } else if ((Type)m.Value.type.type == typeof(List<int>)) { List<int> list = new List<int>(); s.member[m.Key].value = list; foreach (MyJson.JsonNode_ValueNumber item in data[m.Key].AsList()) { list.Add(item); } } else if ((Type)m.Value.type.type == typeof(List<float>)) { List<float> list = new List<float>(); s.member[m.Key].value = list; foreach (MyJson.JsonNode_ValueNumber item in data[m.Key].AsList()) { list.Add(item); } } else if ((Type)m.Value.type.type == typeof(List<double>)) { List<double> list = new List<double>(); s.member[m.Key].value = list; foreach (MyJson.JsonNode_ValueNumber item in data[m.Key].AsList()) { list.Add(item); } } else if ((CSLE.SType)m.Value.type.type != null)//其他嵌套脚本类型 { CSLE.SType subtype = (CSLE.SType)m.Value.type.type; s.member[m.Key].value = FromJson(m.Value.type.keyword, data[m.Key] as MyJson.JsonNode_Object); } else { Debug.Log("发现不能处理的类型:" + ScriptTypeName + ":" + m.Key + ":" + m.Value.type.ToString()); } } } return s; }
public static object FromJson(object ScriptType, MyJson.JsonNode_Object data) { CLRSharp.ICLRType_Sharp type = ScriptType as CLRSharp.ICLRType_Sharp; CLRSharp.CLRSharp_Instance s = new CLRSharp.CLRSharp_Instance(type); type.GetMethod(".ctor", CLRSharp.MethodParamList.constEmpty()).Invoke(null, s, new object[] { }); foreach (var m in type.GetFieldNames()) { var field = type.GetField(m); if (field.isStatic) continue; //s.Fields[m] = field.DefValue; // s.member[m.Key] = new CSLE.CLS_Content.Value(); // s.member[m.Key].type = m.Value.type.type; // s.member[m.Key].value = m.Value.type.DefValue;//先填默认值 if (data.ContainsKey(m) == false)//json中没有的部分填默认值 continue; if (data[m].IsNull())//json中没有的部分填默认值 continue; { if ((Type)field.FieldType.TypeForSystem == typeof(int)) { s.Fields[m] = data[m].AsInt(); } else if ((Type)field.FieldType.TypeForSystem == typeof(float)) { s.Fields[m] = (float)data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(double)) { s.Fields[m] = data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(string)) { s.Fields[m] = data[m].AsString(); } else if ((Type)field.FieldType.TypeForSystem == typeof(List<CLRSharp.CLRSharp_Instance>)) { //处理List List<CLRSharp.CLRSharp_Instance> list = new List<CLRSharp.CLRSharp_Instance>(); s.Fields[m] = list; var subtype = field.FieldType.SubTypes[0]; foreach (MyJson.JsonNode_Object item in data[m].AsList()) { list.Add(FromJson(subtype, item) as CLRSharp.CLRSharp_Instance); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<string>)) { List<string> list = new List<string>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueString item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<int>)) { List<int> list = new List<int>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<float>)) { List<float> list = new List<float>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<double>)) { List<double> list = new List<double>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if (field.FieldType.TypeForSystem == typeof(CLRSharp.CLRSharp_Instance))//其他嵌套脚本类型 { s.Fields[m] = FromJson(field.FieldType, data[m] as MyJson.JsonNode_Object); } else { Logger.Log("发现不能处理的类型:" + type + ":" + m + ":" + type.GetField(m).FieldType); } } } return s; }