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; } }