public static void BakeGrassData()
    {
        var ters = FindObjectsOfType <Terrain>();

        var list = new List <TreeInfos>();

        foreach (var terrain in ters)
        {
            List <TreeObjectInstance> treeObjectInstances = new List <TreeObjectInstance>();
            var trees = terrain.terrainData.treeInstances;
            foreach (var treeInstance in trees)
            {
                var pos = terrain.transform.TransformPoint(new Vector3(
                                                               treeInstance.position.x * terrain.terrainData.size.x,
                                                               treeInstance.position.y * terrain.terrainData.size.y,
                                                               treeInstance.position.z * terrain.terrainData.size.z));
                var data = new TreeObjectInstance(pos,
                                                  new Vector3(0, treeInstance.rotation, 0),
                                                  new Vector3(treeInstance.widthScale, treeInstance.heightScale, treeInstance.widthScale), treeInstance.prototypeIndex);
                treeObjectInstances.Add(data);
            }

            TreeInfos ti = new TreeInfos(terrain.name, treeObjectInstances);
            list.Add(ti);
        }


        Stream          fStream = new FileStream(DrawGrass.fileName, FileMode.Create, FileAccess.ReadWrite);
        BinaryFormatter bf      = new BinaryFormatter();
        MemoryStream    ms      = new MemoryStream();

        bf.Serialize(fStream, list);
        fStream.Close();
    }
    public static void BakeGrassData()
    {
        try
        {
            var ters = FindObjectsOfType <Terrain>();

            if (!CheckFBXSingleMesh(ters))
            {
                return;
            }

            var list = new List <TerrainTreeInfos>();
            foreach (var terrain in ters)
            {
                List <TreeObjectInstance> treeObjectInstances = new List <TreeObjectInstance>();

                var trees = terrain.terrainData.treeInstances;
                foreach (var treeInstance in trees)
                {
                    var pos = terrain.transform.TransformPoint(new Vector3(
                                                                   treeInstance.position.x * terrain.terrainData.size.x,
                                                                   treeInstance.position.y * terrain.terrainData.size.y,
                                                                   treeInstance.position.z * terrain.terrainData.size.z));
                    var data = new TreeObjectInstance(pos,
                                                      new Vector3(0, treeInstance.rotation, 0),
                                                      new Vector3(treeInstance.widthScale, treeInstance.heightScale, treeInstance.widthScale), treeInstance.prototypeIndex);
                    treeObjectInstances.Add(data);
                }

                // var meshPaths = terrain.terrainData.treePrototypes.Select(m=>Path.GetFileNameWithoutExtension((AssetDatabase.GetAssetPath(m.prefab.GetComponent<MeshFilter>().sharedMesh)))).ToList();
                var meshPaths       = terrain.terrainData.treePrototypes.Select(m => m.prefab.name).ToList();
                TerrainTreeInfos ti = new TerrainTreeInfos(terrain.name, treeObjectInstances, meshPaths);
                list.Add(ti);
            }


            Stream          fStream = new FileStream("Assets/Res/Resources/ConceptDemo/Grass/Resources/GrassTransforms.bytes", FileMode.Create, FileAccess.ReadWrite);
            BinaryFormatter bf      = new BinaryFormatter();
            MemoryStream    ms      = new MemoryStream();
            bf.Serialize(fStream, list);
            fStream.Close();

            Debug.Log("缓存草信息完成");
            AssetDatabase.Refresh();
        }
        catch (Exception e)
        {
            Debug.LogError("缓存草信息发生错误");
            throw;
        }
    }