Files
ChunilENG/Assets/Scripts/CHNRaycaster.cs
2025-11-21 13:07:13 +09:00

106 lines
2.8 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>();
public Machine currentClickMachine;
RaycastHit[] hitInfo = new RaycastHit[16];
RaycastHit hit;
public event Action<Machine> onLeftClickMachine;
public event Action onLeftClickArea;
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();
}
private void Update()
{
RaycastOnClickArea();
RaycastOnClickMachine();
}
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;
hitColider.TryGetComponent<Machine>(out var machine);
foreach (var floorMachine in floorMachines)
{
if(floorMachine == machine)
{
if (leftClick)
{
onLeftClickMachine?.Invoke(machine);
}
}
}
}
private void RaycastOnClickArea()
{
bool leftClick = Input.GetMouseButtonDown(0);
if (controller.IsClickUI)
{
return;
}
LayerMask exceptionLayer = LayerMask.GetMask("Machine");
LayerMask layerMask = floorLayers & ~exceptionLayer;
var ray = controller.camera.ScreenPointToRay(Input.mousePosition);
hitInfo = Physics.RaycastAll(ray, Mathf.Infinity, layerMask);
if (hitInfo.Length == 0)
return;
if (leftClick)
{
onLeftClickArea?.Invoke();
}
}
}
}