Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- [ExecuteInEditMode]
- public class Poly_Clouds : MonoBehaviour {
- public bool Generate;
- [Range(1,500)]
- public int CloudDensity;
- [Range(1,30)]
- public int CloudPartCount;
- [Range(1,10000)]
- public float CloudSize;
- [Range(0,1)]
- public float CloudSizeVariation;
- [Range(1,10000)]
- public float CloudHeight;
- // Here u must Set a PrefabModel ( i use a basic Icosphere out of Blender )
- public GameObject CloudPrefab;
- private MeshFilter MF;
- private MeshRenderer MR;
- void Start () {
- enabled = false;
- }
- void Update () {
- if(Generate ){
- Generate = false;
- CreatePlanetClouds();
- }
- }
- public void CreatePlanetClouds() {
- if( !MR ) {
- MR = GetComponent<MeshRenderer>();
- if( !MR ) {
- MR = gameObject.AddComponent<MeshRenderer>();
- }
- }
- GameObject SenorCloud = CreateSingleCloud( transform.position, 1f );
- for( int i = 0; i < CloudDensity; i++ ) {
- SenorCloud.transform.rotation = Quaternion.Euler( Random.Range( 0, 360 ), Random.Range( 0, 360 ), Random.Range( 0, 360 ) );
- Vector3 Pos = transform.position + ( SenorCloud.transform.up * CloudHeight );
- GameObject Cloud = CreateCloud( Pos, CloudSize, CloudPartCount );
- Cloud.transform.rotation = SenorCloud.transform.rotation;
- Cloud.transform.parent = transform;
- }
- DestroyImmediate( SenorCloud );
- if( MF ) {
- if( MF.sharedMesh ) {
- MF.sharedMesh.Clear();
- }
- DestroyImmediate( MF );
- }
- MeshFilter[] Meshes = GetComponentsInChildren<MeshFilter>();
- CombineInstance[] combine = new CombineInstance[Meshes.Length];
- for( int i = 0; i < Meshes.Length; i++ ) {
- combine[i].mesh = Meshes[i].sharedMesh;
- combine[i].transform = Meshes[i].transform.localToWorldMatrix;
- }
- if( !MF ) {
- MF = GetComponent<MeshFilter>();
- if( !MF ) {
- MF = gameObject.AddComponent<MeshFilter>();
- }
- }
- MF.sharedMesh = new Mesh();
- MF.sharedMesh.name = "Poly_Cloud";
- MF.sharedMesh.CombineMeshes( combine );
- clean();
- }
- void clean() {
- foreach( MeshFilter MFilter in GetComponentsInChildren<MeshFilter>() ) {
- if( MFilter != GetComponent<MeshFilter>() && MFilter ) {
- DestroyImmediate( MFilter.gameObject );
- }
- }
- }
- GameObject CreateCloud( Vector3 Pos, float Size, int Count ) {
- float variSize = Size * Random.Range( 1f - CloudSizeVariation, 1f + CloudSizeVariation );
- GameObject Cloud = CreateSingleCloud( Pos, variSize );
- GameObject LastCloud = Cloud;
- for( int i = 0; i < Random.Range( 1, Count ); i++ ) {
- LastCloud.transform.localRotation = Quaternion.Euler( 0, Random.Range( 0, 360 ), 0 );
- float variSize2 = Size * Random.Range( 1f - CloudSizeVariation, 1f + CloudSizeVariation );
- GameObject SingleCloud = CreateSingleCloud( LastCloud.transform.position + ( LastCloud.transform.forward * ( variSize + 1f) / 7f ), variSize2 );
- SingleCloud.transform.parent = LastCloud.transform;
- LastCloud = SingleCloud;
- }
- return Cloud;
- }
- GameObject CreateSingleCloud( Vector3 Pos, float Size ) {
- GameObject SingleCloud = (GameObject)Instantiate( CloudPrefab , Pos, Quaternion.identity );
- SingleCloud.transform.localScale = Vector3.one * (Size) ;
- return SingleCloud;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement