public void AddGroup(Transform tran) { PrefabObjInfo info = new PrefabObjInfo(); info.group_name = tran.name; if (tran.childCount > 0) { //查询对应的预设源文件. Transform first = tran.GetChild(0); GameObject source = (GameObject)PrefabUtility.GetPrefabParent(first.gameObject); string path = AssetDatabase.GetAssetPath(source); info.prefab_path = path; for (int i = 0; i < tran.childCount; i++) { Transform child = tran.GetChild(i); //计算原始位置(0,0)起 Vector3 child_pos = child.position - offset; //计算位置 int z = (int)(child_pos.x / column_length); int x = (int)(child_pos.z / row_width); if (x > -1 && x < row_count && z > -1 && z < column_count) { info.AddGObj(x, z, child); } else { Debug.Log("Not In:"+info.group_name + " index:"+ i); } } objs.Add(info); } #endif }
public void LoadHashTable(Hashtable table) { string[] vec3 = table["offset"].ToString().Split("|"[0]); this.offset = new Vector3(float.Parse(vec3[0]), float.Parse(vec3[1]), float.Parse(vec3[2])); this.row_count = System.Convert.ToInt32(table["row_count"]); this.column_count = System.Convert.ToInt32(table["column_count"]); this.row_width = System.Convert.ToInt32(table["row_width"]); this.column_length = System.Convert.ToInt32(table["column_length"]); ArrayList arr = (ArrayList)(table["objs"]); this.objs = new List<PrefabObjInfo>(); for (int i = 0; i < arr.Count; i++) { Hashtable arr_table = (Hashtable)arr[i]; PrefabObjInfo info = new PrefabObjInfo(); info.LoadHashTable(arr_table); this.objs.Add(info); } }
public static GameObject LoadPrefabInfo(out PrefabInstanceInfo pi_info) { GameObject result = null; pi_info = null; string path = EditorUtility.OpenFilePanel("植被数据读取", Application.dataPath, "json"); if (string.IsNullOrEmpty(path)) { return(null); } string content = System.IO.File.ReadAllText(path); if (content != null) { Hashtable info = (Hashtable)SimpleJsonUtil.jsonDecode(content); pi_info = new PrefabInstanceInfo(); pi_info.LoadHashTable(info); GameObject land = new GameObject("land"); result = land; Transform land_tran = land.transform; land_tran.position = Vector3.zero; for (int i = 0; i < pi_info.objs.Count; i++) { PrefabObjInfo po_info = pi_info.objs[i]; GameObject group = new GameObject(po_info.group_name); Transform group_tran = group.transform; group_tran.parent = land_tran; group_tran.position = Vector3.zero; group_tran.rotation = Quaternion.identity; group_tran.localScale = Vector3.one; GameObject src_obj = AssetDatabase.LoadAssetAtPath <GameObject>(po_info.prefab_path); Dictionary <int, List <int[]> > .Enumerator iter = po_info.objs_dic.GetEnumerator(); while (iter.MoveNext()) { List <int[]> value = iter.Current.Value; for (int j = 0; j < value.Count; j++) { int[] tran_arr = value[j]; GameObject dst = (GameObject)PrefabUtility.InstantiatePrefab(src_obj); dst.name = src_obj.name; dst.transform.parent = group_tran; Vector3 position = new Vector3( IntToFloat(tran_arr[0]), IntToFloat(tran_arr[1]), IntToFloat(tran_arr[2])); Quaternion rotation = Quaternion.Euler( IntToFloat(tran_arr[3]), IntToFloat(tran_arr[4]), IntToFloat(tran_arr[5])); Vector3 scale = new Vector3( IntToFloat(tran_arr[6]), IntToFloat(tran_arr[7]), IntToFloat(tran_arr[8])); dst.transform.position = position; dst.transform.rotation = rotation; dst.transform.localScale = scale; } } } EditorUtility.DisplayDialog("提示", "读取成功,已经初始化到场景内!", "确定"); } return(result); }