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(); RaycastHit[] hitInfo = new RaycastHit[16]; Canvas_Popup popupCanvas; RaycastHit hit; Canvas_Top topCanvas; public event Action onLeftClickMachine; public event Action onRightClickMachine; public event Action onRightClick; public event Action onClickProductionBoard; public LayerMask floorLayers; public int hitFloorIndex; public override void AfterAwake() { controller = FindSingle(); popupCanvas = FindSingle(); topCanvas = FindSingle(); } public override void AfterStart() { var building = FindSingle(); machines = building.floors.SelectMany(f => f.machines).ToList(); } private void Update() { //RaycastChangeView(); RaycastOnClickMachine(); RaycastOnClickProductionStatusBoard(); } //private void RaycastChangeView() //{ // if (controller.viewMode != ViewMode.PerspectiveView) // return; // bool isChangeView = false; // Transform camera = controller.camera.transform; // LayerMask layerMask = LayerMask.GetMask("Floor Ground", "Floor Wall"); // if (Physics.Raycast(camera.position, camera.forward, out hit, Mathf.Infinity, layerMask)) // { // var hitLayer = hit.collider.gameObject.layer; // hitFloorIndex = hit.collider.gameObject.GetComponentInParent().floorIndex; // LayerMask wallMask = LayerMask.GetMask("Floor Wall"); // Collider[] wallOverlapCols = Physics.OverlapSphere(controller.option.target.position, controller.targetColliderRadius, wallMask); // if (wallOverlapCols.Length > 0) // { // isChangeView = false; // } // } // //topCanvas.panel_toptoolbar.SetChangeViewButtonState(isChangeView); //} 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; Machine machine = hitColider.GetComponent(); foreach(var floorMachine in floorMachines) { if(floorMachine == machine) { if (machine == null) return; if (leftClick) { onLeftClickMachine?.Invoke(machine); ActivateMachinesHighlight(machine); } } } } private void ActivateMachinesHighlight(Machine currentMachine) { foreach (var machine in machines) { machine.ResetTranslucent(); machine.StopFlash(); } currentMachine.DeactivateTranslucent(); currentMachine.StartOneFlash(); } private void RaycastOnClickProductionStatusBoard() { bool leftClick = Input.GetMouseButtonDown(0); if (!leftClick) { return; } if (controller.IsClickUI) { return; } var layerMask = LayerMask.GetMask("ProductionStatusBoard"); 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) { onClickProductionBoard?.Invoke(board.boardType); } } } }