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);
        }
    }
Example #3
0
        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);
        }