private void DoImportGrasses() { if (!ImportGrassInstancesOnly) { GGrassPrototypeGroup grassesGroup = DesData.Foliage.Grasses; if (grassesGroup == null || grassesGroup == GRuntimeSettings.Instance.foliageDefault.grasses) { CreateNewGrassPrototypesGroup = true; } if (CreateNewGrassPrototypesGroup) { grassesGroup = ScriptableObject.CreateInstance <GGrassPrototypeGroup>(); #if UNITY_EDITOR if (!Application.isPlaying) { string path = AssetDatabase.GetAssetPath(DesData); string directory = Path.GetDirectoryName(path); string filePath = Path.Combine(directory, string.Format("Grasses_{0}_{1}.asset", DesData.Id, System.DateTime.Now.Ticks)); AssetDatabase.CreateAsset(grassesGroup, filePath); } #endif DesData.Foliage.Grasses = grassesGroup; } grassesGroup.Prototypes.Clear(); DetailPrototype[] detailPrototypes = SrcData.detailPrototypes; for (int i = 0; i < detailPrototypes.Length; ++i) { GGrassPrototype proto = (GGrassPrototype)detailPrototypes[i]; grassesGroup.Prototypes.Add(proto); } GCommon.SetDirty(grassesGroup); } List <GGrassInstance> grasses = new List <GGrassInstance>(); int detailResolution = SrcData.detailResolution; int detailLayerCount = SrcData.detailPrototypes.Length; for (int layer = 0; layer < detailLayerCount; ++layer) { int[,] density = SrcData.GetDetailLayer(0, 0, detailResolution, detailResolution, layer); DoImportDetailLayer(layer, density, grasses); } DesData.Foliage.ClearGrassInstances(); DesData.Foliage.AddGrassInstances(grasses); if (DesTerrain != null) { DesData.Foliage.SetGrassRegionDirty(GCommon.UnitRect); DesTerrain.UpdateGrassPatches(-1, true); DesData.Foliage.ClearGrassDirtyRegions(); } DesData.SetDirty(GTerrainData.DirtyFlags.Foliage); //GC.Collect(); }
private void CreateSharedGrasses() { GrassGroups.Clear(); GrassGroupIndices.Clear(); for (int i = 0; i < Terrains.Count; ++i) { Terrain t = Terrains[i]; DetailPrototype[] detailPrototypes = t.terrainData.detailPrototypes; int grassGroupIndex = -1; for (int j = 0; j < GrassGroups.Count; ++j) { if (GrassGroups[j].Equals(detailPrototypes)) { grassGroupIndex = j; break; } } if (grassGroupIndex >= 0) { GrassGroupIndices.Add(grassGroupIndex); } else { GGrassPrototypeGroup group = GGrassPrototypeGroup.Create(detailPrototypes); GrassGroups.Add(group); GrassGroupIndices.Add(GrassGroups.Count - 1); } } #if UNITY_EDITOR if (!Application.isPlaying) { GUtilities.EnsureDirectoryExists(DataDirectory); for (int i = 0; i < GrassGroups.Count; ++i) { GGrassPrototypeGroup group = GrassGroups[i]; group.name = string.Format("{0}{1}_{2}", "SharedGrasses", i.ToString(), ConversionName); string assetPath = string.Format("{0}.asset", Path.Combine(DataDirectory, group.name)); AssetDatabase.CreateAsset(group, assetPath); } } #endif }
private void ConvertToGrassPrototypeGroup() { GGrassPrototypeGroup group = ScriptableObject.CreateInstance <GGrassPrototypeGroup>(); for (int i = 0; i < instance.Prototypes.Count; ++i) { GameObject prefab = instance.Prototypes[i]; if (prefab != null) { group.Prototypes.Add(GGrassPrototype.Create(prefab)); } } string path = AssetDatabase.GetAssetPath(instance); string directory = Path.GetDirectoryName(path); string filePath = Path.Combine(directory, string.Format("{0}_{1}_{2}.asset", instance.name, "DetailObjects", GCommon.GetUniqueID())); AssetDatabase.CreateAsset(group, filePath); Selection.activeObject = group; }