using System.Linq; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.AI; public class CastingToObject : MonoBehaviour { [Header("Set Camera Perspective (cam1) and TopDown (cam2)")] public Camera cam1; public Camera cam2; [Header("Set Layer Mask")] public LayerMask layer; [Header("Set Materials")] public Material defaultMaterial; public Material materialMost; public Material materialLow; public Material materialHigh; [Header("Intersection between Most (1), Low (2), High (3)")] public Material material12; public Material material13; public Material material23; public Material material123; [Header("GameObject with MarketStall Childs")] public GameObject marketStalls; private Camera currentCam; private RaycastHit theObject; private RaycastHit oldObject1; private RaycastHit oldObject2; private RaycastHit oldObject3; private int selectedToggle = 3; // 3-Nothing; 0-Most; 1-Low, 2-High // To have access to the final Objects public static string[] marketStallNames; public static List[][] selectedMarketStalls; public static List[][] selectedMarketStallsTimes; // Messure time needed to select the market stalls private float time0 = 0.0f; private float time1 = 0.0f; private float time2 = 0.0f; private NavMeshModifier[] childs; private void Start() { currentCam = cam1; oldObject1 = new RaycastHit(); oldObject2 = new RaycastHit(); oldObject3 = new RaycastHit(); childs = marketStalls.GetComponentsInChildren(); selectedMarketStalls = new List[childs.Length][]; selectedMarketStallsTimes = new List[childs.Length][]; marketStallNames = new string[childs.Length]; for (int i = 0; i < childs.Length; i++) { selectedMarketStalls[i] = new List[3]; selectedMarketStallsTimes[i] = new List[3]; marketStallNames[i] = childs[i].transform.name; for (int j = 0; j < selectedMarketStalls[i].Length; j++) { selectedMarketStalls[i][j] = new List(); selectedMarketStalls[i][j].Add(0); selectedMarketStallsTimes[i][j] = new List(1); selectedMarketStallsTimes[i][j].Add(0); } } } public void OnChangeViewClicked() { if(currentCam == cam1) currentCam = cam2; else currentCam = cam1; } public void OnMostVisitedToggled(bool isOn) { if (isOn) selectedToggle = 0; else selectedToggle = 3; } public void OnLowWaitingTimeToggled(bool isOn) { if (isOn) selectedToggle = 1; else selectedToggle = 3; } public void OnHighWaitingTimeToggled(bool isOn) { if (isOn) selectedToggle = 2; else selectedToggle = 3; } public void OnSubmitClicked() { selectedMarketStalls = new List[childs.Length][]; selectedMarketStallsTimes = new List[childs.Length][]; marketStallNames = new string[childs.Length]; for (int i = 0; i < childs.Length; i++) { selectedMarketStalls[i] = new List[3]; selectedMarketStallsTimes[i] = new List[3]; marketStallNames[i] = childs[i].transform.name; for (int j = 0; j < selectedMarketStalls[i].Length; j++) { selectedMarketStalls[i][j] = new List(); selectedMarketStalls[i][j].Add(0); selectedMarketStallsTimes[i][j] = new List(1); selectedMarketStallsTimes[i][j].Add(0); } } } private void HighlightMarketStalls() { for (int i = 0; i < selectedMarketStalls.Length; i++) { var theStall = marketStalls.transform.Find(marketStallNames[i]); if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 0) { theStall.transform.GetComponent().material = defaultMaterial; } else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 0) { theStall.transform.GetComponent().material = materialMost; } else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 0) { theStall.transform.GetComponent().material = materialLow; } else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 1) { theStall.transform.GetComponent().material = materialHigh; } else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 0) { theStall.transform.GetComponent().material = material12; } else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 0 && selectedMarketStalls[i][2].LastOrDefault() == 1) { theStall.transform.GetComponent().material = material13; } else if (selectedMarketStalls[i][0].LastOrDefault() == 0 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 1) { theStall.transform.GetComponent().material = material23; } else if (selectedMarketStalls[i][0].LastOrDefault() == 1 && selectedMarketStalls[i][1].LastOrDefault() == 1 && selectedMarketStalls[i][2].LastOrDefault() == 1) { theStall.transform.GetComponent().material = material123; } } } private bool isMouseOverUI() { return EventSystem.current.IsPointerOverGameObject(); } // Update is called once per frame void FixedUpdate() { if (Input.GetMouseButtonDown(0) && !isMouseOverUI()) { var ray = currentCam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out theObject, float.MaxValue, layer)) { int index = System.Array.IndexOf(marketStallNames, theObject.transform.name); if (selectedToggle == 0) { if (!theObject.Equals(oldObject1)) { selectedMarketStalls[index][selectedToggle].Add(1); selectedMarketStallsTimes[index][selectedToggle].Add(time0); if (oldObject1.transform != null) { selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0); selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject1.transform.name)][selectedToggle].Add(0); } oldObject1 = theObject; } else { selectedMarketStalls[index][selectedToggle].Add(0); selectedMarketStallsTimes[index][selectedToggle].Add(0); oldObject1 = new RaycastHit(); } } else if (selectedToggle == 1) { if (!theObject.Equals(oldObject2)) { selectedMarketStalls[index][selectedToggle].Add(1); selectedMarketStallsTimes[index][selectedToggle].Add(time1); if (oldObject2.transform != null) { selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0); selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject2.transform.name)][selectedToggle].Add(0); } oldObject2 = theObject; } else { selectedMarketStalls[index][selectedToggle].Add(0); selectedMarketStallsTimes[index][selectedToggle].Add(0); oldObject2 = new RaycastHit(); } } else if (selectedToggle == 2) { if (!theObject.Equals(oldObject3)) { selectedMarketStalls[index][selectedToggle].Add(1); selectedMarketStallsTimes[index][selectedToggle].Add(time2); if (oldObject3.transform != null) { selectedMarketStalls[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0); selectedMarketStallsTimes[System.Array.IndexOf(marketStallNames, oldObject3.transform.name)][selectedToggle].Add(0); } oldObject3 = theObject; } else { selectedMarketStalls[index][selectedToggle].Add(0); selectedMarketStallsTimes[index][selectedToggle].Add(0); oldObject3 = new RaycastHit(); } } } } HighlightMarketStalls(); time0 += Time.deltaTime; time1 += Time.deltaTime; time2 += Time.deltaTime; } }