raphael76280

Sunstealer DynamicLight 2

Jan 22nd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.27 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5.  
  6. public class DynamicLight : MonoBehaviour
  7. {
  8.     [Header("Generation")]
  9.     public int precision = 720;
  10.     public bool rotationOffset;
  11.     public enum Shapes // your custom enumeration
  12.     {
  13.         Linear,
  14.         Circle
  15.     };
  16.  
  17.     public Shapes shape = Shapes.Circle;
  18.  
  19.     public float angle = 360;
  20.     public float width = 1;
  21.  
  22.     /* Dégradé intégré
  23.     public Gradient colors = new Gradient();
  24.     public float colorsLoopInSeconds = 0;
  25.     private float colorTime;
  26.     */
  27.  
  28.  
  29.     //public float distanceMin = 1;
  30.     //public float distanceMax = 1;
  31.     public float distance;
  32.  
  33.     [Header("Render")]
  34.     public Color color;
  35.     public float intensity = 0.1f;
  36.     public Texture texture;
  37.  
  38.     public LayerMask LightLayer;
  39.     public LayerMask colliderLayer;
  40.     public LayerMask lighttest;
  41.  
  42.  
  43.  
  44.     [Header("Variables")]
  45.     Vector2 velocity;
  46.     private List<Vector2> points;
  47.     private List<Vector3> vertices;
  48.     private int[] triangles;
  49.     private int uid;
  50.     private Vector3 rotOffset;
  51.     Light objLight;
  52.     Camera objCam;
  53.  
  54.  
  55.  
  56.     //[ConditionalField("orientation", Shape.Circular)] public float angle = 2;
  57.     //public float length;
  58.  
  59.     float DegToPi(float deg)
  60.     {
  61.         return deg * 1 / 180;
  62.     }
  63.  
  64.     float PiToDeg(float pi)
  65.     {
  66.         return pi * 180;
  67.     }
  68.  
  69.     private void Awake()
  70.     {
  71.         //We check if the setup is good
  72.         if (LightLayer == 0)
  73.             Debug.LogError("Please assign a layer for the light");
  74.         if (colliderLayer== 0)
  75.             Debug.LogError("Please assign a layer for the obstacles");
  76.  
  77.         if (LightLayer != (LightLayer | (1 << gameObject.layer)))
  78.             Debug.LogError("Please the layer of light's gameObject must be the same of the LightLayer variable");
  79.  
  80.         if (precision <= 0)
  81.             precision = 1;
  82.     }
  83.  
  84.  
  85.     private void Start()
  86.     {
  87.         Debug.LogWarning("Corrigé lighttest !");
  88.         Debug.LogWarning("Editeur!");
  89.         Debug.LogWarning("Material !");
  90.         uid = Random.Range(0, 1000);
  91.         //shootRay(precision);
  92.  
  93.         //We set the offset
  94.         if (rotationOffset)
  95.             rotOffset = transform.eulerAngles;
  96.         else
  97.             rotOffset = Vector3.zero;
  98.  
  99.         //We add the needed components
  100.         if (!transform.GetComponent<MeshFilter>())
  101.             gameObject.AddComponent<MeshFilter>();
  102.         if (!transform.GetComponent<MeshRenderer>())
  103.             gameObject.AddComponent<MeshRenderer>();
  104.  
  105.         //colorTime = colorsLoopInSeconds; Dégradé
  106.  
  107.         //We create the render object
  108.         CreateRenderer();
  109.     }
  110.  
  111.     private void Update()
  112.     {
  113.        // Debug.Log(transform.parent.transform.eulerAngles.z);
  114.        // Debug.Log("cos: " + Mathf.Cos(DegToPi(transform.parent.transform.eulerAngles.z)) + " sin: " + Mathf.Sin(DegToPi(transform.parent.transform.eulerAngles.z)));
  115.        
  116.         //We avoid some errors
  117.         if (angle > 360)
  118.             angle = angle - 360;
  119.         if (angle < 0)
  120.             angle = 0;
  121.  
  122.         //We start the calculation of collision
  123.         if (shape == Shapes.Circle)
  124.             shootRayCircle((int)(precision*angle));
  125.         else
  126.             shootRayLine(precision);
  127.  
  128.  
  129.         /* Dégradé intégré
  130.         if (colorTime <= 0)
  131.             colorTime = colorsLoopInSeconds;
  132.         else
  133.         {
  134.             colorTime -= Time.deltaTime;
  135.         }
  136.  
  137.         float timeStop = colorsLoopInSeconds - colorTime;
  138.         float timeStopCoord =  timeStop / colorsLoopInSeconds;
  139.         color = colors.Evaluate(timeStopCoord);
  140.         */
  141.        
  142.     }
  143.  
  144.     private void LateUpdate()
  145.     {
  146.         //We update the light with the parent
  147.         transform.localPosition = new Vector3(0, 0, 0 + uid);
  148.         transform.localEulerAngles = new Vector3(transform.parent.transform.eulerAngles.x, transform.parent.transform.eulerAngles.y, -transform.parent.transform.eulerAngles.z);
  149.  
  150.         //We update the renderer (in case of color change or others variables)
  151.         updateRenderer();
  152.     }
  153.  
  154.  
  155.  
  156.  
  157.     void OnDrawGizmosSelected()
  158.     {
  159.         // Draw a yellow sphere at the transform's position
  160.         Gizmos.color = Color.blue;
  161.         Gizmos.DrawSphere(transform.position, 0.1f);
  162.  
  163.  
  164.         Gizmos.color = Color.yellow;
  165.         if (EditorApplication.isPlaying)
  166.         {
  167.             for (int i = 0; i < vertices.Count; i++)
  168.             {
  169.  
  170.                 Gizmos.DrawSphere(transform.TransformPoint(new Vector3(vertices[i].x, vertices[i].y, 0)), 0.05f);
  171.                 if(i < vertices.Count-1)
  172.                     Gizmos.DrawLine(vertices[i], vertices[i + 1]);
  173.                 Handles.color = Color.yellow;
  174.                 Handles.Label(new Vector3(vertices[i].x, vertices[i].y, 0), "{"+i.ToString()+"]");
  175.             }
  176.  
  177.  
  178.             Gizmos.color = new Color(0.9f, 0.4f, 0.55f);
  179.             for (int i = 0; i < points.Count; i++)
  180.             {
  181.                 Gizmos.DrawSphere(transform.TransformPoint(new Vector3(points[i].x, points[i].y, 0)), 0.03f);
  182.                
  183.             }
  184.         }
  185.     }
  186.  
  187.  
  188.     void shootRayCircle(int n)
  189.     {
  190.         /* Variation distance
  191.         if (distanceMax - distanceMin > 0)
  192.         {
  193.             distance = distanceMin + (Mathf.PingPong(Time.time * 0.5f, distanceMax - distanceMin));
  194.         }
  195.         else
  196.         {
  197.             distance = distanceMin;
  198.         }
  199.         */
  200.         points = new List<Vector2>();
  201.        
  202.         for (int i = 0; i <= n; i++)
  203.         {
  204.             float a = transform.parent.transform.eulerAngles.z + rotOffset.z;
  205.             float offset = (DegToPi(-a)* Mathf.PI) - DegToPi(1.5f * angle);
  206.             //DegToPi(-transform.eulerAngles.z * Mathf.PI)
  207.            
  208.  
  209.             float x = Mathf.Sin(((DegToPi(angle) * Mathf.PI * i) / n) + offset) * distance;
  210.             float y = Mathf.Cos(((DegToPi(angle) * Mathf.PI * i) / n) + offset) * distance;
  211.             RaycastHit2D hit = Physics2D.Linecast(transform.position, new Vector2(transform.position.x + x, transform.position.y + y), colliderLayer);
  212.            // Debug.DrawLine(transform.position, new Vector2(transform.position.x + x, transform.position.y + y), new Color(0.8f, 0,0));
  213.            Vector2 obj = new Vector2(x,y);
  214.             if (hit.collider != null)
  215.             {
  216.  
  217.                 if (Vector2.Distance(transform.position, hit.transform.position) < distance * Mathf.PI)
  218.                 {
  219.                     obj = transform.InverseTransformPoint(new Vector2(hit.point.x, hit.point.y));
  220.                 }
  221.             }
  222.  
  223.             points.Add(obj);
  224.  
  225.         }
  226.        
  227.         GenerateMeshCircle();
  228.  
  229.     }
  230.  
  231.     void shootRayLine(int precision)
  232.     {
  233.         points = new List<Vector2>();
  234.         /*
  235.         for (float y = 0; y < distance; y += (float)distance / (10f * (float)precision))
  236.         {
  237.             float x = distance;
  238.             RaycastHit2D hit = Physics2D.Linecast(new Vector2(transform.position.x, transform.position.y+y), new Vector2(transform.position.x + x, transform.position.y + y), colliderLayer);
  239.             Debug.DrawLine(new Vector2(transform.position.x, transform.position.y+y), new Vector2(transform.position.x + x, transform.position.y + y), new Color(0.8f, 0, 0));
  240.             Vector2 obj = new Vector2(x, y);
  241.             if (hit.collider != null)
  242.             {
  243.  
  244.                 if (Vector2.Distance(transform.position, hit.transform.position) < distance * Mathf.PI)
  245.                 {
  246.                     obj = transform.InverseTransformPoint(new Vector2(hit.point.x, hit.point.y));
  247.                 }
  248.             }
  249.  
  250.             points.Add(obj);
  251.         }*/
  252.  
  253.        // points.Add(new Vector2(transform.position.x + width, transform.position.y));
  254.        // points.Add(new Vector2(transform.position.x - width, transform.position.y));
  255.         for (float x = -width; x < width; x+=(float)width/(10f*(float)precision))
  256.         {
  257.             float y = distance;
  258.             RaycastHit2D hit = Physics2D.Linecast(new Vector2(transform.position.x+x, transform.position.y), new Vector2(transform.position.x + x, transform.position.y + y), colliderLayer);
  259.            // Debug.DrawLine(new Vector2(transform.position.x+x, transform.position.y), new Vector2(transform.position.x + x, transform.position.y + y), new Color(0.8f, 0, 0));
  260.             Vector2 obj = new Vector2(x, y);
  261.            
  262.             if (hit.collider != null)
  263.             {
  264.  
  265.                 if (Vector2.Distance(transform.position, hit.transform.position) < distance * Mathf.PI)
  266.                 {
  267.                     obj = transform.InverseTransformPoint(new Vector2(hit.point.x, hit.point.y));
  268.                 }
  269.             }
  270.  
  271.             points.Add(obj);
  272.             points.Add(new Vector2(x, 0));
  273.             //points.Add(new Vector2(x + (float)width / (10f * (float)precision), 0));
  274.         }
  275.        
  276.         /*
  277.         for (float y = distance; y > 0; y -= (float)distance / (10f * (float)precision))
  278.         {
  279.             float x = -distance;
  280.             RaycastHit2D hit = Physics2D.Linecast(new Vector2(transform.position.x, transform.position.y + y), new Vector2(transform.position.x + x, transform.position.y + y), colliderLayer);
  281.             Debug.DrawLine(new Vector2(transform.position.x, transform.position.y + y), new Vector2(transform.position.x + x, transform.position.y + y), new Color(0.8f, 0, 0));
  282.             Vector2 obj = new Vector2(x, y);
  283.             if (hit.collider != null)
  284.             {
  285.  
  286.                 if (Vector2.Distance(transform.position, hit.transform.position) < distance * Mathf.PI)
  287.                 {
  288.                     obj = transform.InverseTransformPoint(new Vector2(hit.point.x, hit.point.y));
  289.                 }
  290.             }
  291.  
  292.             points.Add(obj);
  293.         }*/
  294.  
  295.         GenerateMeshLinear();
  296.     }
  297.  
  298.     void GenerateMeshCircle()
  299.     {
  300.         Mesh mesh = new Mesh();
  301.         //mesh.c
  302.         vertices = new List<Vector3>();
  303.  
  304.             vertices.Add(transform.InverseTransformPoint(transform.position));
  305.  
  306.         //vertices.Add(new Vector3(transform.position.x, transform.position.y, transform.position.z +uid));
  307.         for (int i = 1; i < points.Count + 1; i++)
  308.         {
  309.              
  310.             if (i > 1 && i < points.Count + 2)
  311.             {
  312.              
  313.                 if (new Vector2(Mathf.Round(points[i-2].x *10), Mathf.Round(points[i - 2].y * 10)) != new Vector2(Mathf.Round(vertices[vertices.Count -1].x*10), Mathf.Round(vertices[vertices.Count - 1].y * 10)))
  314.                 {
  315.                     vertices.Add(new Vector3(points[i - 1].x, points[i - 1].y, 0));
  316.                 }
  317.             }else
  318.             {
  319.                 vertices.Add(new Vector3(points[i - 1].x, points[i - 1].y, 0));
  320.             }
  321.         }
  322.  
  323.         if (angle == 360 )
  324.         vertices.Add(new Vector3(points[0].x, points[0].y, 0));
  325.  
  326.         //Debug.Log(points.Count);
  327.         //Debug.Log(vertices.Count);
  328.  
  329.  
  330.         mesh.vertices = vertices.ToArray();
  331.  
  332.         // int[] triangles = new int[9] { 0, 1, 1, 2, 2, 3, 3, 4, 4};
  333.         //mesh.triangles = triangles;
  334.  
  335.         triangles = new int[vertices.Count * 3 - 3];
  336.         for (int i = 0; i < vertices.Count - 2; i++)
  337.         {
  338.             // Debug.Log(i + "|" + vertices.Count);
  339.             if (i == 0)
  340.             {
  341.  
  342.                 triangles[i * 3] = 0;
  343.                 triangles[i * 3 + 1] = 1;
  344.                 triangles[i * 3 + 2] = 2;
  345.             }
  346.             else
  347.             {
  348.                 triangles[i * 3] = 0;
  349.                 triangles[i * 3 + 1] = i + 1;
  350.                 triangles[i * 3 + 2] = i + 2;
  351.             }
  352.         }
  353.        // triangles[(vertices.Count - 1) * 3 - 3] = vertices.Count - 2;
  354.         //triangles[(vertices.Count - 1) * 3 - 2] = vertices.Count - 1;
  355.         //triangles[(vertices.Count - 1) * 3 - 1] = 0;
  356.         mesh.triangles = triangles;
  357.         //this is also acceptable!
  358.         //mesh.SetTriangles(new int[9]{0,1,2,3,4,3,2,1,0}, 0);
  359.  
  360.         Vector2[] uvs = new Vector2[vertices.Count];
  361.         for (int i = 0; i < vertices.Count; i++)
  362.         {
  363.             //uvs[i] = new Vector2(vertices[i].x - transform.position.x, vertices[i].y - transform.position.y);
  364.             uvs[i] = vertices[i];
  365.         }
  366.  
  367.  
  368.         mesh.uv = uvs;
  369.  
  370.         Vector3[] normals = new Vector3[vertices.Count];
  371.         for (int i = 0; i < vertices.Count; i++)
  372.         {
  373.             normals[i] = Vector3.back;
  374.         }
  375.         mesh.normals = normals;
  376.  
  377.         //you could also call this instead...
  378.         //mesh.RecalculateNormals();
  379.  
  380.  
  381.         //grab our filter.. set the mesh
  382.         mesh.name = transform.parent.name;
  383.         MeshFilter filter = GetComponent<MeshFilter>();
  384.         filter.mesh = mesh;
  385.         //filter.sharedMesh.
  386.  
  387.         //you can do your material stuff here...
  388.         MeshRenderer r = GetComponent<MeshRenderer>();
  389.         Material m = r.material;
  390.         float scale = 0.5f / distance;
  391.         m.mainTextureScale = new Vector2(scale, scale);
  392.         m.mainTexture = texture;
  393.     }
  394.  
  395.     void GenerateMeshLinear()
  396.     {
  397.         Mesh mesh = new Mesh();
  398.         //mesh.c
  399.         vertices = new List<Vector3>();
  400.  
  401.         // vertices.Add(transform.position);
  402.  
  403.         //vertices.Add(new Vector3(transform.position.x, transform.position.y, transform.position.z +uid));
  404.         for (int i = 0; i < points.Count; i++)
  405.         {
  406.             vertices.Add(points[i]);
  407.         }
  408.  
  409.         if (angle == 360)
  410.             vertices.Add(new Vector3(points[0].x, points[0].y, 0));
  411.  
  412.         //Debug.Log(points.Count);
  413.         //Debug.Log(vertices.Count);
  414.  
  415.  
  416.         mesh.vertices = vertices.ToArray();
  417.  
  418.         // int[] triangles = new int[9] { 0, 1, 1, 2, 2, 3, 3, 4, 4};
  419.         //mesh.triangles = triangles;
  420.  
  421.         triangles = new int[vertices.Count * 3];
  422.         bool odd = false;
  423.         for (int i = 0; i < vertices.Count - 2; i++)
  424.         {
  425.             // Debug.Log(i + "|" + vertices.Count);
  426.             if (true)
  427.             {
  428.                 triangles[i * 3] = i+1;
  429.                 triangles[i * 3 + 1] = i+2;
  430.                 triangles[i * 3 + 2] = i + 3;
  431.                 odd = true;
  432.             }
  433.             else if (i>3)
  434.             {
  435.                
  436.                 triangles[(i) * 3] = i-3;
  437.                 triangles[(i) * 3 + 1] = i-2;
  438.                 triangles[(i) * 3 + 2] = i-1;
  439.                 odd = false;
  440.             }
  441.            
  442.            
  443.         }
  444.         // triangles[(vertices.Count - 1) * 3 - 3] = vertices.Count - 2;
  445.         //triangles[(vertices.Count - 1) * 3 - 2] = vertices.Count - 1;
  446.         //triangles[(vertices.Count - 1) * 3 - 1] = 0;
  447.         mesh.triangles = triangles;
  448.         //this is also acceptable!
  449.         //mesh.SetTriangles(new int[9]{0,1,2,3,4,3,2,1,0}, 0);
  450.  
  451.         Vector2[] uvs = new Vector2[vertices.Count];
  452.         for (int i = 0; i < vertices.Count; i++)
  453.         {
  454.             //uvs[i] = new Vector2(vertices[i].x - transform.position.x, vertices[i].y - transform.position.y);
  455.             uvs[i] = vertices[i];
  456.         }
  457.  
  458.  
  459.         mesh.uv = uvs;
  460.  
  461.         Vector3[] normals = new Vector3[vertices.Count];
  462.         for (int i = 0; i < vertices.Count; i++)
  463.         {
  464.             normals[i] = Vector3.back;
  465.         }
  466.         mesh.normals = normals;
  467.  
  468.         //you could also call this instead...
  469.         //mesh.RecalculateNormals();
  470.  
  471.  
  472.         //grab our filter.. set the mesh
  473.         mesh.name = transform.parent.name;
  474.         MeshFilter filter = GetComponent<MeshFilter>();
  475.         filter.mesh = mesh;
  476.         //filter.sharedMesh.
  477.  
  478.         //you can do your material stuff here...
  479.         MeshRenderer r = GetComponent<MeshRenderer>();
  480.         Material m = r.material;
  481.         float scale = 0.5f / distance;
  482.         m.mainTextureScale = new Vector2(scale, scale);
  483.         m.mainTexture = texture;
  484.     }
  485.  
  486.  
  487.     void CreateRenderer()
  488.     {
  489.         // GameObject objPrefab = new GameObject();
  490.         GameObject obj = new GameObject();
  491.         obj.transform.parent = transform.parent;
  492.         obj.name = transform.parent.name + "LightRenderer";
  493.         obj.transform.localPosition = new Vector3(0, 0, uid - 1);
  494.         objCam = obj.AddComponent<Camera>();
  495.         objCam.clearFlags = CameraClearFlags.SolidColor;
  496.         objCam.nearClipPlane = 0;
  497.         objCam.farClipPlane = 1;
  498.         objCam.backgroundColor = new Color(0,0,0,0);
  499.         objCam.cullingMask = LightLayer;
  500.         objCam.orthographic = true;
  501.         //objCam.fieldOfView = 60;
  502.         objCam.orthographicSize = distance + 1;
  503.  
  504.         RenderTexture lightRenderTexture = new RenderTexture(4000, 4000, 0, RenderTextureFormat.ARGB32);
  505.         lightRenderTexture.Create();
  506.         lightRenderTexture.name = transform.parent.name + "Light";
  507.         objCam.targetTexture = lightRenderTexture;
  508.  
  509.         objLight = obj.AddComponent<Light>();
  510.         objLight.type = LightType.Directional;
  511.         objLight.range = 11;
  512.         objLight.intensity = intensity;
  513.         objLight.cookie = lightRenderTexture;
  514.         objLight.cookieSize = (distance+1)*2;
  515.  
  516.  
  517.        
  518.         objLight.color = color;
  519.         Debug.LogError("Ici le lightest");
  520.         //objLight.cullingMask = 311;
  521.  
  522.     }
  523.  
  524.     void updateRenderer()
  525.     {
  526.         objCam.orthographicSize = distance + 1;
  527.         objLight.intensity = intensity;
  528.         objLight.color = color;
  529.     }
  530.  
  531.  
  532. }
Add Comment
Please, Sign In to add comment