peon125

Region2D

Sep 2nd, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.16 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using UnityEngine;
  6. using Newtonsoft.Json;
  7.  
  8. namespace Movement2D
  9. {
  10.     public delegate void Triggering(Region2D other);
  11.  
  12.     public class Region2D : MonoBehaviour
  13.     {
  14.         public static string[] Tags
  15.         {
  16.             get
  17.             {
  18.                 return Region2DSerialization.Tags;
  19.             }
  20.  
  21.             set
  22.             {
  23.                 TagsArray ta = new TagsArray()
  24.                 {
  25.                     tags = value
  26.                 };
  27.  
  28.                 Region2DSerialization.SerializeArray(ta, "tags");
  29.                 Region2DSerialization.Tags = null;
  30.             }
  31.         }
  32.  
  33.         public static bool[][] Collisions
  34.         {
  35.             get
  36.             {
  37.                 return Region2DSerialization.Collisions;
  38.             }
  39.  
  40.             set
  41.             {
  42.                 string[][] arr = new string[value.Length][];
  43.  
  44.                 for (int i = 0; i < arr.Length; i++)
  45.                 {
  46.                     arr[i] = new string[arr.Length];
  47.                     for (int j = 0; j < arr[i].Length; j++)
  48.                     {
  49.                         arr[i][j] = value[i][j].ToString();
  50.                     }
  51.                 }
  52.  
  53.                 CollisionsArray ca = new CollisionsArray()
  54.                 {
  55.                     collisions = arr
  56.                 };
  57.  
  58.                 Region2DSerialization.SerializeArray(ca, "collisions");
  59.                 Region2DSerialization.Collisions = null;
  60.             }
  61.         }
  62.  
  63.         public bool isStatic = true;
  64.         public bool isTrigger = false;
  65.         public int regionTag;
  66.         public Vector2Int size = Vector2Int.one;
  67.         public bool respectScale;
  68.         public bool showWhenNotSelected = true;
  69.  
  70.         public event Triggering TriggerEnter;
  71.         public event Triggering TriggerExit;
  72.         public event Triggering TriggerStay;
  73.  
  74.         private Vector2Int Size
  75.         {
  76.             get
  77.             {
  78.                 return size * (respectScale ? Vector2Int.RoundToInt(transform.localScale) : Vector2Int.one);
  79.             }
  80.         }
  81.  
  82.         private Vector3 prevPos;
  83.         private Vector3 prevScale;
  84.         private List<Tile> tilesOccupied;
  85.         private List<Region2D> regions_lastFrame = new List<Region2D>();
  86.  
  87.         private void OnDrawGizmosSelected()
  88.         {
  89.             float i = isStatic ? 160f : 230f;
  90.             Gizmos.color = isTrigger ? new Color(0, 0, i / 255f) : new Color(0, i / 255f, 0);
  91.             Gizmos.DrawLine(transform.position, transform.position + Size.y * Vector3.up);
  92.             Gizmos.DrawLine(transform.position, transform.position + Size.x * Vector3.right);
  93.             Gizmos.DrawLine(transform.position + Size.y * Vector3.up, transform.position + Size.y * Vector3.up + Size.x * Vector3.right);
  94.             Gizmos.DrawLine(transform.position + Size.x * Vector3.right, transform.position + Size.x * Vector3.right + Size.y * Vector3.up);
  95.         }
  96.  
  97.         private void OnDrawGizmos()
  98.         {
  99.             if (!showWhenNotSelected) return;
  100.  
  101.             float i = isStatic ? 160f : 230f;
  102.             Gizmos.color = isTrigger ? new Color(0, 0, i / 255f, 0.2f) : new Color(0, i / 255f, 0, 0.2f);
  103.             Gizmos.DrawLine(transform.position, transform.position + Size.y * Vector3.up);
  104.             Gizmos.DrawLine(transform.position, transform.position + Size.x * Vector3.right);
  105.             Gizmos.DrawLine(transform.position + Size.y * Vector3.up, transform.position + Size.y * Vector3.up + Size.x * Vector3.right);
  106.             Gizmos.DrawLine(transform.position + Size.x * Vector3.right, transform.position + Size.x * Vector3.right + Size.y * Vector3.up);
  107.         }
  108.  
  109.         private void Start()
  110.         {
  111.             prevPos = transform.position;
  112.             prevScale = transform.lossyScale;
  113.             tilesOccupied = new List<Tile>();
  114.  
  115.             OccupyTiles();
  116.         }
  117.  
  118.         private void Update()
  119.         {
  120.             if (prevPos != transform.position || prevScale != transform.lossyScale)
  121.             {
  122.                 if (!isStatic) OccupyTiles();
  123.                 else Debug.LogWarning(String.Format("Static Region2D moved ({0}).", name));
  124.             }
  125.  
  126.             prevPos = transform.position;
  127.             prevScale = transform.lossyScale;
  128.         }
  129.  
  130.         private void FixedUpdate()
  131.         {
  132.             UpdateRegions();
  133.         }
  134.  
  135.         private void UpdateRegions()
  136.         {
  137.             List<Region2D> regions_current = new List<Region2D>();
  138.  
  139.             for (int i = 0; i < tilesOccupied.Count; i++)
  140.                 for (int j = 0; j < tilesOccupied[i].regionsInMe.Count; j++)
  141.                     if (tilesOccupied[i].regionsInMe[j] != this && !regions_current.Contains(tilesOccupied[i].regionsInMe[j]))
  142.                         regions_current.Add(tilesOccupied[i].regionsInMe[j]);
  143.  
  144.             List<Region2D> commons;
  145.             List<Region2D> differences;
  146.             GetCommonsAndDifferences(regions_current, regions_lastFrame, out commons, out differences);
  147.  
  148.             if (differences.Count > 0)
  149.             {
  150.                 if (regions_lastFrame.Count < regions_current.Count)
  151.                 {
  152.                     foreach (Region2D region in differences)
  153.                         if (TriggerEnter != null) TriggerEnter(region);
  154.                 }
  155.                 else if (regions_lastFrame.Count > regions_current.Count)
  156.                 {
  157.                     foreach (Region2D region in differences)
  158.                         if (TriggerExit != null) TriggerExit(region);
  159.                 }
  160.             }
  161.             else if (differences.Count == 0 && regions_lastFrame.Count != 0 && regions_current.Count != 0)
  162.             {
  163.                 foreach (Region2D region in regions_current)
  164.                     if (TriggerStay != null) TriggerStay(region);
  165.             }
  166.  
  167.             regions_lastFrame = regions_current;
  168.         }
  169.  
  170.         private Tile[] OccupyTiles()
  171.         {
  172.             Vector2 pos = transform.localPosition;
  173.  
  174.             UnoccupyTiles();
  175.  
  176.             for (int i = 0; i < Size.x; i++)
  177.                 for (int j = 0; j < Size.y; j++)
  178.                 {
  179.                     Tile occupied = World2D.ciop.GetTile((int)pos.x + i, (int)pos.y + j);
  180.  
  181.                     occupied.TileEntered(this);
  182.  
  183.                     tilesOccupied.Add(occupied);
  184.                 }
  185.  
  186.             return tilesOccupied.ToArray();
  187.         }
  188.  
  189.         private void UnoccupyTiles()
  190.         {
  191.             if (tilesOccupied.Count == 0) return;
  192.  
  193.             foreach (Tile tile in tilesOccupied)
  194.                 tile.TileExited(this);
  195.  
  196.             tilesOccupied.Clear();
  197.         }
  198.  
  199.         public static void GetCommonsAndDifferences(List<Region2D> regions1, List<Region2D> regions2, out List<Region2D> commons, out List<Region2D> differences)
  200.         {
  201.             commons = new List<Region2D>();
  202.  
  203.             for (int i = 0; i < regions1.Count; i++)
  204.                 for (int j = 0; j < regions2.Count; j++)
  205.                     if (regions1[i] == regions2[j]) commons.Add(regions1[i]);
  206.  
  207.             differences = new List<Region2D>();
  208.  
  209.             for (int i = 0; i < regions1.Count; i++)
  210.                 if (!differences.Contains(regions1[i]) && !commons.Contains(regions1[i])) differences.Add(regions1[i]);
  211.  
  212.             for (int i = 0; i < regions2.Count; i++)
  213.                 if (!differences.Contains(regions2[i]) && !commons.Contains(regions2[i])) differences.Add(regions2[i]);
  214.         }
  215.     }
  216.  
  217.     public static class Region2DSerialization
  218.     {
  219.         private static string[] tags;
  220.         public static string[] Tags
  221.         {
  222.             get
  223.             {
  224.                 if (tags == null)
  225.                 {
  226.                     tags = (GetArray<TagsArray>("tags")).tags;
  227.                 }
  228.  
  229.                 return tags;
  230.             }
  231.  
  232.             set
  233.             {
  234.                 tags = value;
  235.             }
  236.         }
  237.  
  238.         private static string[][] collisions;
  239.         public static bool[][] Collisions
  240.         {
  241.             get
  242.             {
  243.                 bool[][] arr = null;
  244.                 if (collisions == null)
  245.                 {
  246.                     collisions = (GetArray<CollisionsArray>("collisions")).collisions;
  247.                 }
  248.  
  249.                 arr = new bool[collisions.Length][];
  250.  
  251.                 for (int i = 0; i < arr.Length; i++)
  252.                 {
  253.                     arr[i] = new bool[arr.Length];
  254.                     for (int j = 0; j < arr[i].Length; j++)
  255.                     {
  256.                         arr[i][j] =
  257.                             collisions[i][j] == "True";
  258.                     }
  259.                 }
  260.  
  261.                 return arr;
  262.             }
  263.  
  264.             set
  265.             {
  266.                 if (value == null)
  267.                 {
  268.                     collisions = null;
  269.                     return;
  270.                 }
  271.  
  272.                 string[][] arr = new string[value.Length][];
  273.  
  274.                 for (int i = 0; i < arr.Length; i++)
  275.                 {
  276.                     arr[i] = new string[arr.Length];
  277.                     for (int j = 0; j < arr[i].Length; j++)
  278.                     {
  279.                         arr[i][j] = value[i][j].ToString();
  280.                     }
  281.                 }
  282.  
  283.                 collisions = arr;
  284.             }
  285.         }
  286.  
  287.         private static T GetArray<T>(string jsonFileName)
  288.         {
  289.             string json = File.ReadAllText(String.Format("Assets/Plugins/Movement2D/JSONs/{0}.txt", jsonFileName));
  290.             T t = JsonConvert.DeserializeObject<T>(json);
  291.  
  292.             return t;
  293.         }
  294.  
  295.         public static void SerializeArray(object arrayObject, string jsonFileName)
  296.         {
  297.             string json = JsonConvert.SerializeObject(arrayObject);
  298.             File.WriteAllText(String.Format("Assets/Plugins/Movement2D/JSONs/{0}.txt", jsonFileName), json);
  299.         }
  300.     }
  301.  
  302.     [Serializable]
  303.     public class TagsArray
  304.     {
  305.         public string[] tags;
  306.     }
  307.  
  308.     [Serializable]
  309.     public class CollisionsArray
  310.     {
  311.         public string[][] collisions;
  312.     }
  313.  
  314.     [Serializable]
  315.     public class CollisionsArray2
  316.     {
  317.         public string[][] collisions;
  318.     }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment