cwisbg

UnityCirclePacking

Dec 31st, 2018
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.55 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5.  
  6. public class CirclePacking : MonoBehaviour {
  7.  
  8.     //public enum ScatterType { "Cat", "Sat", "Bat" }
  9.     //public ScatterType ScatType = ScatterType.;
  10.     //public enum Axis { X, Y }
  11.     //public Axis axis = Axis.Y;
  12.     public bool DoRadial = true;
  13.     public float PopulationRadiusX = 20;
  14.     public float PopulationRadiusZ = 10;
  15.     //public Vector3 BoundEdges = new Vector3(10, 0, 20);
  16.     public int CircleEmitAmnt = 100;
  17.     public float MinCircleSize = 1f;
  18.     public float SearchShrinkAmnt = 0.1f;
  19.     public float MaxItterations = 1000;
  20.     public float SearchRadiusOffset = 10;
  21.     public LayerMask SceneCollisionLayer;
  22.     public GameObject CircleObj;
  23.     public bool DoDrawMesh = true;
  24.     public Mesh TheDrawMeshBig;
  25.     public Material DrawMeshMatBig;
  26.     public Mesh TheDrawMeshMed;
  27.     public Material DrawMeshMatMed;
  28.     public Mesh TheDrawMeshSmall;
  29.     public Material DrawMeshMatSmall;
  30.  
  31.     public int ItterationTrack = 0; // Tracks itterations when placing objects
  32.     public bool DoGroundCollide = false;
  33.     private List<CircleObject> CircleList = new List<CircleObject>();
  34.     private Matrix4x4 MeshMatrix;
  35.     class CircleObject
  36.     {
  37.         public CircleObject(GameObject CircleObjectObjInsert,  Vector3 PositionInsert)
  38.         {
  39.             //CircleObjectObj = CircleObjectObjInsert;
  40.             //DrawMeshMesh = DrawMeshMeshInsert;
  41.             Position = PositionInsert;
  42.             StartPositoin = PositionInsert;
  43.             //CircleObjectObj = (GameObject)Instantiate(CircleObjectObjInsert, Position, Quaternion.identity);// copy object
  44.             //CircleObjectObj.transform.localScale = new Vector3(Radius, Radius, Radius); // Set start scale
  45.             //CircleSprite = CircleObjectObj.GetComponentInChildren<SpriteRenderer>();
  46.             //CircleSprite.color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
  47.         }
  48.         public GameObject CircleObjectObj;
  49.         //public SpriteRenderer CircleSprite;
  50.         public Vector3 Position = Vector3.zero;
  51.         public Vector3 StartPositoin = Vector3.zero;
  52.         public float Radius = 0.05f;
  53.         public float GrowSpeed = Random.Range(0.7f, 1.2f);
  54.         public bool IsGrowing = true;
  55.         public int NeiborCount = 0;
  56.         public int RotationY = Random.Range(0, 360);
  57.         //public Mesh DrawMeshMesh;
  58.  
  59.         public void DoGrow()
  60.         {
  61.             if (this.IsGrowing)
  62.             {
  63.                 this.Radius += this.GrowSpeed * Time.deltaTime;
  64.                 //this.CircleObjectObj.transform.localScale = new Vector3(this.Radius*2f, this.Radius*2f, this.Radius*2f);
  65.                 //this.CircleObjectObj.transform.position = this.Position;
  66.             }
  67.         }
  68.  
  69.     }
  70.  
  71.     void NewCircle(Vector3 SpawnPos)
  72.     {
  73.         bool IsValid = true;
  74.         //for(int i = 0; i < CircleList.Count; i ++)
  75.         foreach (CircleObject circle in CircleList)
  76.         {
  77.             float Dist = Vector3.Distance(SpawnPos, circle.Position);
  78.             if(Dist < circle.Radius + SearchRadiusOffset)
  79.             {
  80.                 IsValid = false;
  81.                 ItterationTrack += 1;
  82.             }
  83.         }
  84.         if (IsValid)
  85.         {
  86.             CircleObject NewCircle = new CircleObject(CircleObj, SpawnPos);
  87.             //NewCircle.CircleObjectObj.transform.parent = transform;
  88.             CircleList.Insert(0, NewCircle);
  89.             ItterationTrack = 0;
  90.         }
  91.  
  92.     }
  93.  
  94.  
  95.  
  96.     void NewRandomCircleRadial()
  97.     {
  98.         Vector3 SpawnPosition = Random.insideUnitSphere * PopulationRadiusX;
  99.         SpawnPosition.x += transform.position.x;
  100.         SpawnPosition.y = transform.position.y;
  101.         SpawnPosition.z += transform.position.z;
  102.         if (DoGroundCollide == true)
  103.         {
  104.             Vector3 HitPoint = RaySearcher(SpawnPosition);
  105.             NewCircle(HitPoint);
  106.         }
  107.         else
  108.         {
  109.             NewCircle(SpawnPosition);
  110.         }
  111.        
  112.  
  113.     }
  114.     void NewRandomCircle()
  115.     {
  116.  
  117.         float RandomX = Random.Range(-PopulationRadiusX, PopulationRadiusX);
  118.         float RandomZ = Random.Range(-PopulationRadiusZ, PopulationRadiusZ);
  119.         RandomX += transform.position.x;
  120.         RandomZ += transform.position.z;
  121.         Vector3 SpawnPosition = new Vector3(RandomX, transform.position.y, RandomZ);
  122.  
  123.         if (DoGroundCollide == true)
  124.         {
  125.             Vector3 HitPoint = RaySearcher(SpawnPosition);
  126.             NewCircle(HitPoint);
  127.         }
  128.         else
  129.         {
  130.             NewCircle(SpawnPosition);
  131.         }
  132.             //Vector3 GroundPos = new Vector3(circle.CircleObjectObj.transform.position.x, HitPoint.y - circle.Radius, circle.CircleObjectObj.transform.position.z);
  133.            
  134.     }
  135.     void DoShow(CircleObject DrawCircle)
  136.     {
  137.         //CircleMat.SetPass(0);
  138.         //Graphics.DrawMeshNow(TheDrawMesh, DrawCircle.Position, Quaternion.identity);
  139.         //new Vector3(this.Radius*2f, this.Radius*2f, this.Radius*2f);
  140.         Vector3 CircleScale = new Vector3(DrawCircle.Radius * 2f, DrawCircle.Radius * 2f, DrawCircle.Radius * 2f);
  141.         //float OffsetYAmnt = new float();
  142.  
  143.         if (DoDrawMesh)
  144.         {
  145.             MeshMatrix = Matrix4x4.TRS(DrawCircle.Position, Quaternion.Euler(0,DrawCircle.RotationY,0), CircleScale);
  146.             if (DrawCircle.Radius > 2)
  147.             {
  148.                 Graphics.DrawMesh(TheDrawMeshBig, MeshMatrix, DrawMeshMatBig, 0);
  149.             }
  150.  
  151.             else if (DrawCircle.Radius < 1)
  152.             {
  153.                 Graphics.DrawMesh(TheDrawMeshSmall, MeshMatrix, DrawMeshMatMed, 0);
  154.             }
  155.             else
  156.             {
  157.                 Graphics.DrawMesh(TheDrawMeshMed, MeshMatrix, DrawMeshMatSmall, 0);
  158.             }
  159.         }
  160.         else
  161.         {
  162.             if(DrawCircle.CircleObjectObj == null)
  163.             {
  164.                 DrawCircle.CircleObjectObj = (GameObject)Instantiate(CircleObj, DrawCircle.Position, Quaternion.identity, transform);// copy object
  165.                 DrawCircle.CircleObjectObj.transform.localScale = new Vector3(DrawCircle.Radius, DrawCircle.Radius, DrawCircle.Radius); // Set start scale
  166.             }
  167.             else
  168.             {
  169.                 DrawCircle.CircleObjectObj.transform.localScale = new Vector3(DrawCircle.Radius*2f, DrawCircle.Radius*2f, DrawCircle.Radius*2f);
  170.                 //OffsetYAmnt = DrawCircle.StartPositoin.y + DrawCircle.Radius;
  171.                 //DrawCircle.Position.y = OffsetYAmnt;
  172.                 DrawCircle.CircleObjectObj.transform.position = DrawCircle.Position;
  173.                
  174.             }
  175.  
  176.         }
  177.  
  178.     }
  179.     void GrowCircles()
  180.     {
  181.         foreach(CircleObject circle in CircleList)
  182.         {
  183.  
  184.             DoShow(circle);
  185.             if (circle.IsGrowing == true)
  186.             {
  187.                 if (DoGroundCollide == true)
  188.                 {
  189.                     /*
  190.                     Vector3 HitPoint = RaySearcher(circle.Position);
  191.                     Vector3 GroundPos = new Vector3(circle.CircleObjectObj.transform.position.x, HitPoint.y - circle.Radius, circle.CircleObjectObj.transform.position.z);
  192.                     circle.CircleObjectObj.transform.position = GroundPos;
  193.                     circle.Position = GroundPos;
  194.                     */
  195.                 }
  196.                 foreach (CircleObject OtherCircle in CircleList)
  197.                 {
  198.                     if(circle != OtherCircle)
  199.                     {
  200.                         float Dist = Vector3.Distance(circle.Position, OtherCircle.Position);
  201.                         float RCheck = circle.Radius + OtherCircle.Radius;
  202.                         if(Dist < RCheck)
  203.                         {
  204.                             circle.IsGrowing = false;
  205.                         }
  206.                     }
  207.                 }
  208.             }
  209.             circle.DoGrow();
  210.         }
  211.  
  212.     }
  213.    
  214.     public Vector3 RaySearcher(Vector3 Pos)
  215.     {
  216.         Vector3 RayHitPoint= Vector3.zero;
  217.         Vector3 rayDirection = new Vector3(0,-1,0);
  218.  
  219.         RaycastHit hit;
  220.         //RaycastHit2D hit = Physics2D.Raycast(boid.position, Vector3.up, SearchCollisionDistance, SceneCollisionLayer);
  221.  
  222.         if (Physics.Raycast(Pos, rayDirection, out hit, 100f, SceneCollisionLayer))
  223.         {
  224.             RayHitPoint = hit.point;
  225.             //Debug.DrawLine(hit.point, Pos, Color.red);
  226.         }
  227.         return RayHitPoint;
  228.     }
  229.    
  230.  
  231.     public Vector3 GetMouseForce()
  232.     {
  233.         Vector3 MouseHit = Vector3.zero;
  234.         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  235.         RaycastHit hit;
  236.         if (Physics.Raycast(ray, out hit))
  237.         {
  238.             //hit.collider.GetComponent<Renderer>().material.color = Color.red;
  239.             MouseHit = hit.point;
  240.         }
  241.         return MouseHit;
  242.     }
  243.  
  244.  
  245.     void Start () {
  246.        
  247.  
  248.     }
  249.    
  250.     // Update is called once per frame
  251.     void Update () {
  252.         if (SearchRadiusOffset > MinCircleSize)
  253.         {
  254.             if (ItterationTrack < MaxItterations)
  255.             {
  256.                 for (int i = 0; i < CircleEmitAmnt; i++)
  257.                 {
  258.                     if (DoRadial)
  259.                     {
  260.                         NewRandomCircleRadial();
  261.                     }
  262.                     else
  263.                     {
  264.                         NewRandomCircle();
  265.                     }
  266.                 }
  267.             }
  268.             else
  269.             {
  270.                 SearchRadiusOffset -= SearchShrinkAmnt;
  271.                 ItterationTrack = 0;
  272.             }
  273.            
  274.         }
  275.         GrowCircles();
  276.     }
  277. }
Advertisement
Add Comment
Please, Sign In to add comment