Files
beyond/Assets/Scripts/Powers/Scannable.cs
2024-11-20 15:21:28 +01:00

148 lines
4.4 KiB
C#

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<Material> 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<Renderer>();
m_materials = new List<Material>();
foreach (var r in m_renderers)
{
for (int i=0; i<r.materials.Length; i++)
m_materials.Add(r.materials[i]);
}
}
public virtual void OnEnable()
{
if (m_addToCompass == CompassSetting.ADD)
{
AddToCompass();
}
}
public void RemoveFromCompass()
{
if (m_compassMarker != null)
{
Destroy(m_compassMarker);
m_compassMarker = null;
}
m_compassAdded = false;
}
public override string RecordData()
{
return SaveSystem.Serialize(m_compassAdded);
}
public override void ApplyData(string s)
{
m_compassAdded = SaveSystem.Deserialize<bool>(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<CompassMarker>();
if (m_compassMarker == null)
{
m_compassMarker = gameObject.AddComponent<CompassMarker>();
}
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());
}
}
}