using UnityEngine; using static UnityEngine.Rendering.DebugUI; public class TvHead : MonoBehaviour { [System.Serializable] public class References { public Renderer Head; public Renderer Ray; } [System.Serializable] public class Settings { public float OffMin = 5f; public float OffMax = 9f; public float OnMin = 4f; public float OnMax = 8f; } [System.Serializable] public class State { } [SerializeField] private References _references; [SerializeField] private Settings _settings; [SerializeField] private State _state; private float _value; private float _seed; private float _offDuration; private float _onDuration; private Vector4 _headColor; private Vector4 _screenColor; const string ColorAttribute = "_Color"; void Awake() { _seed = transform.GetSiblingIndex(); _offDuration = Mathf.Lerp(_settings.OffMin, _settings.OffMax, (_seed * 6.72f) % 1); _onDuration = Mathf.Lerp(_settings.OnMin, _settings.OnMax, (_seed * 4.56f) % 1); _headColor = _references.Ray.material.GetColor(ColorAttribute); _screenColor = _references.Head.materials[1].GetColor(ColorAttribute); //Off(); } void Update() { float t = Time.timeSinceLevelLoad + _seed * 13.23f; float totalDuration = _offDuration + _onDuration; float targetValue = (t / totalDuration) % 1; targetValue = targetValue * totalDuration < _offDuration ? 0 : 1; _value = Mathf.Lerp(_value, targetValue, Time.deltaTime * 10); float noisedValue = _value + Mathf.Cos(Time.timeSinceLevelLoad * 50) * (1 - Mathf.Abs(_value * 2 - 1)); noisedValue = Mathf.Clamp01(noisedValue); Vector3 lookDir = (Camera.main.transform.position - _references.Head.transform.position).normalized; Quaternion targetRot = Quaternion.Inverse(_references.Head.transform.parent.rotation); targetRot *= Quaternion.LookRotation(lookDir, Vector3.up); targetRot *= _references.Head.transform.parent.localRotation; targetRot = Quaternion.Lerp(Quaternion.Euler(0, 0, 0), targetRot, Mathf.Lerp(_value, noisedValue, .5f)); Color headColor = Color.Lerp(Color.black, _headColor , noisedValue); Color screenColor = Color.Lerp(Color.black, _screenColor, noisedValue); _references.Ray.material.SetColor(ColorAttribute, headColor); _references.Head.materials[1].SetColor(ColorAttribute, screenColor); _references.Head.transform.localRotation = targetRot; } }