Files
ChunilENG/Assets/Scripts/CHNRaycaster.cs

114 lines
3.1 KiB
C#
Raw Normal View History

2025-02-20 09:59:37 +09:00
using UnityEngine;
using WI;
using System;
using System.Collections.Generic;
using System.Linq;
2025-02-20 09:59:37 +09:00
namespace CHN
{
public class CHNRaycaster : MonoBehaviour, ISingle
{
OrbitalController controller;
public List<Machine> machines = new List<Machine>();
2025-04-03 11:53:25 +09:00
public Machine currentClickMachine;
2025-02-20 09:59:37 +09:00
RaycastHit[] hitInfo = new RaycastHit[16];
RaycastHit hit;
public event Action<Machine> onLeftClickMachine;
public event Action onClickThermostat;
2025-02-20 09:59:37 +09:00
public LayerMask floorLayers;
public int hitFloorIndex;
public override void AfterAwake()
{
controller = FindSingle<OrbitalController>();
}
public override void AfterStart()
{
var building = FindSingle<Building>();
machines = building.floors.SelectMany(f => f.machines).ToList();
}
2025-02-20 09:59:37 +09:00
private void Update()
{
//RaycastOnClickThermostat();
2025-02-20 09:59:37 +09:00
RaycastOnClickMachine();
}
private void RaycastOnClickMachine()
{
var floorMachines = FindSingle<Building>().currentFloor.machines;
2025-02-20 09:59:37 +09:00
bool leftClick = Input.GetMouseButtonDown(0);
if (!leftClick)
2025-02-20 09:59:37 +09:00
{
return;
}
if (controller.IsClickUI)
return;
LayerMask exceptionLayer = LayerMask.GetMask("Floor", "Floor Ground");
2025-02-20 09:59:37 +09:00
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;
2025-04-03 11:53:25 +09:00
hitColider.TryGetComponent<Machine>(out var machine);
2025-04-03 11:53:25 +09:00
foreach (var floorMachine in floorMachines)
2025-02-20 09:59:37 +09:00
{
if(floorMachine == machine)
{
if (leftClick)
{
onLeftClickMachine?.Invoke(machine);
}
}
2025-02-20 09:59:37 +09:00
}
}
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<Thermostat>();
if (leftClick)
{
onClickThermostat?.Invoke();
}
}
2025-02-20 09:59:37 +09:00
}
}