Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using UnityEngine;
- using UnityEngine.Events;
- public class RangeObserver : MonoBehaviour
- {
- [SerializeField] private Range _range;
- [SerializeField] private Transform _target;
- [SerializeField] private RangeBoundary _boundary;
- public float Distance => Vector3.Distance(transform.position, Target.position);
- public UnityEvent<bool> Changed;
- private bool _value;
- public bool Value
- {
- get => _value;
- set
- {
- if (value != _value)
- {
- _value = value;
- Changed.Invoke(value);
- }
- }
- }
- public Transform Target { get => _target; set => _target = value; }
- private void Start() =>
- ResolveValue();
- private void ResolveValue()
- {
- switch (_boundary)
- {
- case RangeBoundary.In:
- Value = Distance.In(_range);
- break;
- case RangeBoundary.Out:
- Value = Distance.Out(_range);
- break;
- }
- }
- private void Update() =>
- Value = Distance.In(_range);
- }
- public enum RangeBoundary
- {
- In,
- Out
- }
- [Serializable]
- public struct Range
- {
- [SerializeField] private float _min;
- [SerializeField] private float _max;
- public bool In(float value) =>
- _min <= value && value <= _max;
- public bool Out(float value) =>
- _min >= value || value >= _max;
- }
- public static class RangeExtensions
- {
- public static bool In(this float value, Range range)
- => range.In(value);
- public static bool Out(this float value, Range range)
- => range.Out(value);
- }
Add Comment
Please, Sign In to add comment