CastingToObject.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using System.Linq;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.AI;
  6. public class CastingToObject : MonoBehaviour
  7. {
  8. [Header("Set Camera Perspective (cam1) and TopDown (cam2)")]
  9. public Camera cam1;
  10. public Camera cam2;
  11. [Header("Set Layer Mask")]
  12. public LayerMask layer;
  13. [Header("Set Materials")]
  14. public Material defaultMaterial;
  15. public Material materialMost;
  16. public Material materialLow;
  17. public Material materialHigh;
  18. [Header("Intersection between Most (1), Low (2), High (3)")]
  19. public Material material12;
  20. public Material material13;
  21. public Material material23;
  22. public Material material123;
  23. [Header("GameObject with MarketStall Childs")]
  24. public GameObject marketStalls;
  25. private Camera currentCam;
  26. private RaycastHit theObject;
  27. private RaycastHit oldObject1;
  28. private RaycastHit oldObject2;
  29. private RaycastHit oldObject3;
  30. private int selectedToggle = 3; // 3-Nothing; 0-Most; 1-Low, 2-High
  31. // To have access to the final Objects
  32. public static string[] marketStallNames;
  33. public static List<int>[][] selectedMarketStalls;
  34. public static List<float>[][] selectedMarketStallsTimes;
  35. // Messure time needed to select the market stalls
  36. private float time0 = 0.0f;
  37. private float time1 = 0.0f;
  38. private float time2 = 0.0f;
  39. private NavMeshModifier[] childs;
  40. private void Start()
  41. {
  42. currentCam = cam1;
  43. oldObject1 = new RaycastHit();
  44. oldObject2 = new RaycastHit();
  45. oldObject3 = new RaycastHit();
  46. childs = marketStalls.GetComponentsInChildren<NavMeshModifier>();
  47. selectedMarketStalls = new List<int>[childs.Length][];
  48. selectedMarketStallsTimes = new List<float>[childs.Length][];
  49. marketStallNames = new string[childs.Length];
  50. for (int i = 0; i < childs.Length; i++)
  51. {
  52. selectedMarketStalls[i] = new List<int>[3];
  53. selectedMarketStallsTimes[i] = new List<float>[3];
  54. marketStallNames[i] = childs[i].transform.name;
  55. for (int j = 0; j < selectedMarketStalls[i].Length; j++)
  56. {
  57. selectedMarketStalls[i][j] = new List<int>();
  58. selectedMarketStalls[i][j].Add(0);
  59. selectedMarketStallsTimes[i][j] = new List<float>(1);
  60. selectedMarketStallsTimes[i][j].Add(0);
  61. }
  62. }
  63. }
  64. public void OnChangeViewClicked()
  65. {
  66. if(currentCam == cam1)
  67. currentCam = cam2;
  68. else
  69. currentCam = cam1;
  70. }
  71. public void OnMostVisitedToggled(bool isOn)
  72. {
  73. if (isOn)
  74. selectedToggle = 0;
  75. else
  76. selectedToggle = 3;
  77. }
  78. public void OnLowWaitingTimeToggled(bool isOn)
  79. {
  80. if (isOn)
  81. selectedToggle = 1;
  82. else
  83. selectedToggle = 3;
  84. }
  85. public void OnHighWaitingTimeToggled(bool isOn)
  86. {
  87. if (isOn)
  88. selectedToggle = 2;
  89. else
  90. selectedToggle = 3;
  91. }
  92. public void OnSubmitClicked()
  93. {
  94. selectedMarketStalls = new List<int>[childs.Length][];
  95. selectedMarketStallsTimes = new List<float>[childs.Length][];
  96. marketStallNames = new string[childs.Length];
  97. for (int i = 0; i < childs.Length; i++)
  98. {
  99. selectedMarketStalls[i] = new List<int>[3];
  100. selectedMarketStallsTimes[i] = new List<float>[3];
  101. marketStallNames[i] = childs[i].transform.name;
  102. for (int j = 0; j < selectedMarketStalls[i].Length; j++)
  103. {
  104. selectedMarketStalls[i][j] = new List<int>();
  105. selectedMarketStalls[i][j].Add(0);
  106. selectedMarketStallsTimes[i][j] = new List<float>(1);
  107. selectedMarketStallsTimes[i][j].Add(0);
  108. }
  109. }
  110. }
  111. private void HighlightMarketStalls()
  112. {
  113. for (int i = 0; i < selectedMarketStalls.Length; i++)
  114. {
  115. var theStall = marketStalls.transform.Find(marketStallNames[i]);
  116. if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 0)
  117. {
  118. theStall.transform.GetComponent<Renderer>().material = defaultMaterial;
  119. }
  120. else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 0)
  121. {
  122. theStall.transform.GetComponent<Renderer>().material = materialMost;
  123. }
  124. else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 0)
  125. {
  126. theStall.transform.GetComponent<Renderer>().material = materialLow;
  127. }
  128. else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 1)
  129. {
  130. theStall.transform.GetComponent<Renderer>().material = materialHigh;
  131. }
  132. else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 0)
  133. {
  134. theStall.transform.GetComponent<Renderer>().material = material12;
  135. }
  136. else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 1)
  137. {
  138. theStall.transform.GetComponent<Renderer>().material = material13;
  139. }
  140. else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 1)
  141. {
  142. theStall.transform.GetComponent<Renderer>().material = material23;
  143. }
  144. else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 1)
  145. {
  146. theStall.transform.GetComponent<Renderer>().material = material123;
  147. }
  148. }
  149. }
  150. private bool isMouseOverUI()
  151. {
  152. return EventSystem.current.IsPointerOverGameObject();
  153. }
  154. // Update is called once per frame
  155. void FixedUpdate()
  156. {
  157. if (Input.GetMouseButtonDown(0) && !isMouseOverUI())
  158. {
  159. var ray = currentCam.ScreenPointToRay(Input.mousePosition);
  160. if (Physics.Raycast(ray, out theObject, float.MaxValue, layer))
  161. {
  162. int index = System.Array.IndexOf(marketStallNames, theObject.transform.name);
  163. if (selectedToggle == 0)
  164. {
  165. if (!theObject.Equals(oldObject1))
  166. {
  167. selectedMarketStalls[index][selectedToggle].Add(1);
  168. selectedMarketStallsTimes[index][selectedToggle].Add(time0);
  169. if (oldObject1.transform != null)
  170. {
  171. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0);
  172. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0);
  173. }
  174. oldObject1 = theObject;
  175. }
  176. else
  177. {
  178. selectedMarketStalls[index][selectedToggle].Add(0);
  179. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  180. oldObject1 = new RaycastHit();
  181. }
  182. }
  183. else if (selectedToggle == 1)
  184. {
  185. if (!theObject.Equals(oldObject2))
  186. {
  187. selectedMarketStalls[index][selectedToggle].Add(1);
  188. selectedMarketStallsTimes[index][selectedToggle].Add(time1);
  189. if (oldObject2.transform != null)
  190. {
  191. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0);
  192. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0);
  193. }
  194. oldObject2 = theObject;
  195. }
  196. else
  197. {
  198. selectedMarketStalls[index][selectedToggle].Add(0);
  199. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  200. oldObject2 = new RaycastHit();
  201. }
  202. }
  203. else if (selectedToggle == 2)
  204. {
  205. if (!theObject.Equals(oldObject3))
  206. {
  207. selectedMarketStalls[index][selectedToggle].Add(1);
  208. selectedMarketStallsTimes[index][selectedToggle].Add(time2);
  209. if (oldObject3.transform != null)
  210. {
  211. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0);
  212. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0);
  213. }
  214. oldObject3 = theObject;
  215. }
  216. else
  217. {
  218. selectedMarketStalls[index][selectedToggle].Add(0);
  219. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  220. oldObject3 = new RaycastHit();
  221. }
  222. }
  223. }
  224. }
  225. HighlightMarketStalls();
  226. time0 += Time.deltaTime;
  227. time1 += Time.deltaTime;
  228. time2 += Time.deltaTime;
  229. }
  230. }