86 lines
2.0 KiB
C#
86 lines
2.0 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
namespace Ktyl.Util
|
|
{
|
|
public class UnseenEventTrigger : MonoBehaviour
|
|
{
|
|
[System.Serializable]
|
|
private struct Event
|
|
{
|
|
public GameEvent game;
|
|
public UnityEvent unity;
|
|
|
|
public void Raise()
|
|
{
|
|
if (game) game.Raise();
|
|
unity.Invoke();
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
private float _minDistance = 2f;
|
|
|
|
[SerializeField]
|
|
[Range(0f, 180f)]
|
|
private float _minAngle = 90.0f;
|
|
|
|
[SerializeField] private Event _onUnseen;
|
|
|
|
private bool _isArmed = false;
|
|
private Camera _camera;
|
|
|
|
public void Disarm()
|
|
{
|
|
_isArmed = false;
|
|
}
|
|
|
|
public void Arm()
|
|
{
|
|
_isArmed = true;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if ( !_isArmed )
|
|
return;
|
|
|
|
if ( !IsUnseen() )
|
|
return;
|
|
|
|
_onUnseen.Raise();
|
|
|
|
_isArmed = false;
|
|
}
|
|
|
|
private bool IsUnseen()
|
|
{
|
|
// lazy init camera
|
|
if ( _camera == null )
|
|
{
|
|
_camera = Camera.main;
|
|
}
|
|
|
|
var camDiff = transform.position - _camera.transform.position;
|
|
|
|
// distance check
|
|
if ( camDiff.sqrMagnitude < _minDistance * _minDistance )
|
|
{
|
|
// too close!
|
|
return false;
|
|
}
|
|
|
|
// angle check
|
|
float angleDiff = Vector3.Angle( camDiff.normalized, _camera.transform.forward );
|
|
if ( angleDiff < _minAngle )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|