E_ElecCompetition/Electrical_inspectionCompet.../Assets/Plugins/HighlightingSystemDemo/Scripts/Service/RaycastController.cs

104 lines
1.8 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;
namespace HighlightingSystem.Demo
{
[Serializable]
public class RaycastEvent : UnityEvent<RaycastHit> { }
[RequireComponent(typeof(Camera))]
public class RaycastController : MonoBehaviour
{
public enum UpdateEvent
{
Update,
LateUpdate,
OnPreCull,
OnPreRender,
OnPostRender,
}
#region Inspector Fields
//
public UpdateEvent updateEvent = UpdateEvent.LateUpdate;
// Which layers targeting ray must hit (-1 = everything)
public LayerMask layerMask = -1;
// Targeting ray length (-1 = infinity)
public float rayLength = -1f;
// Events to trigger on hover
public RaycastEvent onHover;
#endregion
#region Private Fields
// Camera component reference
private Camera cam;
#endregion
#region MonoBehaviour
//
void Awake()
{
cam = GetComponent<Camera>();
}
//
void Update()
{
PerformRaycast(UpdateEvent.Update);
}
//
void LateUpdate()
{
PerformRaycast(UpdateEvent.LateUpdate);
}
//
void OnPreCull()
{
PerformRaycast(UpdateEvent.OnPreCull);
}
//
void OnPreRender()
{
PerformRaycast(UpdateEvent.OnPreRender);
}
//
void OnPostRender()
{
PerformRaycast(UpdateEvent.OnPostRender);
}
#endregion
#region Private Methods
//
private void PerformRaycast(UpdateEvent currentEvent)
{
if (currentEvent != updateEvent) { return; }
if (cam == null) { return; }
if (onHover == null) { return; }
RaycastHit hitInfo;
// Create a ray from mouse coords
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
// Targeting raycast
if (Physics.Raycast(ray, out hitInfo, rayLength >= 0f ? rayLength : Mathf.Infinity, layerMask.value))
{
onHover.Invoke(hitInfo);
}
}
#endregion
}
}