148 lines
4.4 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|