using System; using System.Collections; using System.Collections.Generic; using PixelCrushers; using Sirenix.OdinInspector; using UnityEngine; namespace Beyond { public class Scannable : Saver, IScannable { private Renderer[] m_renderers; private List m_materials; [ColorUsageAttribute(true,true,0f,8f,0.125f,3f)] //[OnValueChanged("SetFresnelColor")] public Color m_fresnelColor = new Color(.5f, .5f, 2f); public enum CompassSetting { ADD, ADD_AFTER_SCAN, DONT_ADD } public CompassSetting m_addToCompass = CompassSetting.ADD_AFTER_SCAN; public float m_removeFromCompassAfter = 15f; public float m_minCompassDistance = 0f; public float m_fresnelTime = 1f; public float m_fresnelPower = 2f; private int m_FresnelColorID = Shader.PropertyToID("_FresnelColor"); private int m_FresnelPowerID = Shader.PropertyToID("FresnelPower"); private CompassMarker m_compassMarker; private bool m_compassAdded; public void Awake() { m_renderers = GetComponentsInChildren(); m_materials = new List(); foreach (var r in m_renderers) { for (int i=0; i(s); if (m_compassAdded) { AddToCompass(); } } void SetValues(float fresnelPower, Color fresnelColor) { foreach (var m in m_materials) { m.SetColor(m_FresnelColorID, fresnelColor); m.SetFloat(m_FresnelPowerID, fresnelPower); } } void AddToCompass() { m_compassMarker = GetComponent(); if (m_compassMarker == null) { m_compassMarker = gameObject.AddComponent(); } m_compassMarker.MinDistance = m_minCompassDistance; if (m_removeFromCompassAfter > 0f) { m_compassMarker.RemoveAfterTime(m_removeFromCompassAfter); } m_compassAdded = true; } IEnumerator SetFresnel() { var m = m_materials[0]; Color startColor = m.GetColor(m_FresnelColorID); float startPower = m.GetFloat(m_FresnelPowerID); float timer = 0f; while (timer < m_fresnelTime) { float a = timer / m_fresnelTime; var color = Color.Lerp(startColor, m_fresnelColor,a); var power = Mathf.Lerp(startPower, m_fresnelPower, a); SetValues(power, color); timer += Time.deltaTime; yield return null; } SetValues(m_fresnelPower, m_fresnelColor); if (m_addToCompass == CompassSetting.ADD_AFTER_SCAN) { AddToCompass(); } yield return new WaitForSeconds(3f); timer = 0f; while (timer < m_fresnelTime) { float a = 1f - timer / m_fresnelTime; var color = Color.Lerp(startColor, m_fresnelColor,a); var power = Mathf.Lerp(startPower, m_fresnelPower, a); SetValues(power, color); timer += Time.deltaTime; yield return null; } yield return null; } public virtual void OnScanned() { if (m_materials.Count == 0) return; StartCoroutine(SetFresnel()); } } }