CastingToObject.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. // Update is called once per frame
  151. void FixedUpdate()
  152. {
  153. if (Input.GetMouseButtonDown(0))
  154. {
  155. if (EventSystem.current.currentSelectedGameObject != null)
  156. return;
  157. var ray = currentCam.ScreenPointToRay(Input.mousePosition);
  158. if (Physics.Raycast(ray, out theObject, float.MaxValue, layer))
  159. {
  160. int index = System.Array.IndexOf(marketStallNames, theObject.transform.name);
  161. if (selectedToggle == 0)
  162. {
  163. if (!theObject.Equals(oldObject1))
  164. {
  165. selectedMarketStalls[index][selectedToggle].Add(1);
  166. selectedMarketStallsTimes[index][selectedToggle].Add(time0);
  167. if (oldObject1.transform != null)
  168. {
  169. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0);
  170. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0);
  171. }
  172. oldObject1 = theObject;
  173. }
  174. else
  175. {
  176. selectedMarketStalls[index][selectedToggle].Add(0);
  177. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  178. oldObject1 = new RaycastHit();
  179. }
  180. }
  181. else if (selectedToggle == 1)
  182. {
  183. if (!theObject.Equals(oldObject2))
  184. {
  185. selectedMarketStalls[index][selectedToggle].Add(1);
  186. selectedMarketStallsTimes[index][selectedToggle].Add(time1);
  187. if (oldObject2.transform != null)
  188. {
  189. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0);
  190. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0);
  191. }
  192. oldObject2 = theObject;
  193. }
  194. else
  195. {
  196. selectedMarketStalls[index][selectedToggle].Add(0);
  197. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  198. oldObject2 = new RaycastHit();
  199. }
  200. }
  201. else if (selectedToggle == 2)
  202. {
  203. if (!theObject.Equals(oldObject3))
  204. {
  205. selectedMarketStalls[index][selectedToggle].Add(1);
  206. selectedMarketStallsTimes[index][selectedToggle].Add(time2);
  207. if (oldObject3.transform != null)
  208. {
  209. selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0);
  210. selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0);
  211. }
  212. oldObject3 = theObject;
  213. }
  214. else
  215. {
  216. selectedMarketStalls[index][selectedToggle].Add(0);
  217. selectedMarketStallsTimes[index][selectedToggle].Add(0);
  218. oldObject3 = new RaycastHit();
  219. }
  220. }
  221. }
  222. }
  223. HighlightMarketStalls();
  224. time0 += Time.deltaTime;
  225. time1 += Time.deltaTime;
  226. time2 += Time.deltaTime;
  227. }
  228. }