Files
modular-vr/Assets/Station46/Modules/Laser/Scripts/Laser.cs
2023-04-25 19:42:08 +02:00

86 lines
2.5 KiB
C#

using NaughtyAttributes;
using Station46.Scripts;
using UnityEngine;
namespace Station46.Modules.Laser.Scripts
{
[RequireComponent(typeof(Emission))]
public class Laser : MonoBehaviour
{
private const float MaxDistance = 1000;
public bool firing;
[BoxGroup("Internal")] [SerializeField] private Transform laserStart;
[BoxGroup("Internal")] [SerializeField] private Emission emission;
[BoxGroup("Internal")] [SerializeField] private LineRenderer laserLineRenderer;
private LaserReceiver CurrentReceiver
{
get => _currentReceiver;
set
{
if (value == null)
{
if (_currentReceiver)
{
_currentReceiver.Leave();
}
_currentReceiver = null;
}
else
{
if (_currentReceiver)
{
_currentReceiver.Leave();
}
_currentReceiver = value;
_currentReceiver.Hit();
}
}
}
private LaserReceiver _currentReceiver;
protected virtual void Start()
{
SetHitPosition();
}
protected virtual void Update()
{
laserLineRenderer.enabled = firing;
emission.active = firing;
if (firing && Physics.Raycast(
laserStart.position,
transform.TransformDirection(Vector3.forward),
out var hit,
MaxDistance,
~0,
QueryTriggerInteraction.Ignore
))
{
SetHitPosition(hit.distance);
// check whether a receiver has been hit
var receiver = hit.transform.GetComponent<LaserReceiver>(); // may be null
if (receiver != CurrentReceiver)
{
CurrentReceiver = receiver;
}
}
else
{
SetHitPosition();
// hitting nothing
CurrentReceiver = null;
}
}
private void SetHitPosition(float distance = MaxDistance)
{
laserLineRenderer.SetPosition(1, Vector3.forward * distance);
}
}
}