using UnityEngine; using WI; using System; using System.Collections.Generic; using System.Linq; namespace CHN { public class CHNRaycaster : MonoBehaviour, ISingle { OrbitalController controller; public List machines = new List(); public Machine currentClickMachine; RaycastHit[] hitInfo = new RaycastHit[16]; RaycastHit hit; public event Action onLeftClickMachine; public event Action onClickThermostat; public LayerMask floorLayers; public int hitFloorIndex; public override void AfterAwake() { controller = FindSingle(); } public override void AfterStart() { var building = FindSingle(); machines = building.floors.SelectMany(f => f.machines).ToList(); } private void Update() { //RaycastOnClickThermostat(); RaycastOnClickMachine(); } private void RaycastOnClickMachine() { var floorMachines = FindSingle().currentFloor.machines; bool leftClick = Input.GetMouseButtonDown(0); if (!leftClick) { return; } if (controller.IsClickUI) return; LayerMask exceptionLayer = LayerMask.GetMask("Floor", "Floor Ground"); LayerMask layerMask = floorLayers & ~exceptionLayer; Ray ray = controller.camera.ScreenPointToRay(Input.mousePosition); hitInfo = Physics.RaycastAll(ray, Mathf.Infinity, layerMask); if (hitInfo.Length == 0) return; Array.Sort(hitInfo, (hit1, hit2) => hit1.distance.CompareTo(hit2.distance)); var hitColider = hitInfo[0].collider; hitColider.TryGetComponent(out var machine); foreach (var floorMachine in floorMachines) { if(floorMachine == machine) { if (leftClick) { onLeftClickMachine?.Invoke(machine); } } } } private void RaycastOnClickThermostat() { bool leftClick = Input.GetMouseButtonDown(0); if (!leftClick) { return; } if (controller.IsClickUI) { return; } var layerMask = LayerMask.GetMask("Thermostat"); var ray = controller.camera.ScreenPointToRay(Input.mousePosition); hitInfo = Physics.RaycastAll(ray, Mathf.Infinity, layerMask); if (hitInfo.Length == 0) return; Array.Sort(hitInfo, (hit1, hit2) => hit1.distance.CompareTo(hit2.distance)); var hitColider = hitInfo[0].collider; var board = hitColider.GetComponent(); if (leftClick) { onClickThermostat?.Invoke(); } } } }