163 lines
4.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|