Files
ChunilENG/Assets/Scripts/CHNRaycaster.cs

163 lines
4.9 KiB
C#

using UnityEngine;
using WI;
using System;
using System.Collections.Generic;
using System.Linq;
namespace CHN
{
public class CHNRaycaster : MonoBehaviour, ISingle
{
OrbitalController controller;
public List<Machine> machines = new List<Machine>();
RaycastHit[] hitInfo = new RaycastHit[16];
Canvas_Popup popupCanvas;
RaycastHit hit;
Canvas_Top topCanvas;
public event Action<Machine> onLeftClickMachine;
public event Action<Machine> onRightClickMachine;
public event Action onRightClick;
public event Action<BoardType> onClickProductionBoard;
public LayerMask floorLayers;
public int hitFloorIndex;
public override void AfterAwake()
{
controller = FindSingle<OrbitalController>();
popupCanvas = FindSingle<Canvas_Popup>();
topCanvas = FindSingle<Canvas_Top>();
}
public override void AfterStart()
{
var building = FindSingle<Building>();
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<Floor>().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<Building>().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<Machine>();
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<ProductionStatusBoard>();
if (leftClick)
{
onClickProductionBoard?.Invoke(board.boardType);
}
}
}
}