Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections.Generic;
- public class HitGlowEffect : MonoBehaviour {
- [SerializeField]
- MeshFilter[] _meshFilters;
- [SerializeField]
- List<HitPosition> _hitPositions = new List<HitPosition>();
- void Update() {
- if(_hitPositions.Count > 0) {
- UpdateHits();
- UpdateVertexColors();
- }
- }
- void UpdateHits() {
- for(int i = _hitPositions.Count - 1; i > -1; i--) {
- HitPosition hitPosition = _hitPositions[i];
- if(hitPosition.Time > 0)
- hitPosition.Time = Mathf.Max(hitPosition.Time - Time.deltaTime, 0);
- if(hitPosition.Time == 0)
- _hitPositions.RemoveAt(i);
- else
- _hitPositions[i] = hitPosition;
- }
- }
- void UpdateVertexColors() {
- for(int m = 0; m < _meshFilters.Length; m++) {
- MeshFilter _meshFilter = _meshFilters[m];
- Vector3[] vertices = _meshFilter.mesh.vertices;
- Color[] colors = new Color[vertices.Length];
- //_meshFilter.transform.world
- for(int i = 0; i < vertices.Length; i++) {
- Vector3 position = _meshFilter.transform.TransformPoint(vertices[i]);
- position = transform.InverseTransformPoint(position);
- colors[i] = CalculateColor(position);
- }
- _meshFilter.mesh.vertices = vertices;
- _meshFilter.mesh.colors = colors;
- }
- }
- Color CalculateColor(Vector3 position) {
- Color color = Color.clear;
- float alpha = 0;
- for(int i = 0; i < _hitPositions.Count; i++) {
- HitPosition hitPosition = _hitPositions[i];
- if(hitPosition.Distance <= 0) continue;
- float distance = (position - hitPosition.Position).sqrMagnitude;
- if(distance < hitPosition.Distance * hitPosition.Distance) {
- float finalDistance = 1 - (Mathf.Sqrt(distance) / hitPosition.Distance);
- //color += (hitPosition.Color * finalDistance * Mathf.Min(hitPosition.Time, 1));
- color = AddColors((hitPosition.Color * finalDistance * Mathf.Min(hitPosition.Time, 1)), color);
- alpha = Mathf.Max(alpha, finalDistance);
- }
- }
- color.a *= alpha;
- return color;
- }
- Color AddColors(Color colorA, Color colorB) {
- //float a = colorA.a + colorB.a * (1 - colorA.a);
- float a = colorA.a + colorB.a * (1 - colorA.a);
- if(a < 1.0e-6) return Color.clear;
- return new Color(
- (colorA.r * colorA.a + colorB.r * colorB.a * (1 - colorA.a)) / a,
- (colorA.g * colorA.a + colorB.g * colorB.a * (1 - colorA.a)) / a,
- (colorA.b * colorA.a + colorB.b * colorB.a * (1 - colorA.a)) / a,
- a
- );
- }
- Color BlendColors(Color colorA, Color colorB) {
- Color color = new Color();
- color.a = 1 - (1 - colorA.a) * (1 - colorB.a);
- if(color.a < 1.0e-6) return color;
- color.r = colorA.r * colorA.a / color.a + colorB.r * colorB.a * (1 - colorA.a) / color.a;
- color.g = colorA.r * colorA.a / color.a + colorB.g * colorB.a * (1 - colorA.a) / color.a;
- color.b = colorA.b * colorA.a / color.a + colorB.b * colorB.a * (1 - colorA.a) / color.a;
- return color;
- }
- public void AddHit(HitPosition hitPosition) {
- hitPosition.Position = transform.InverseTransformPoint(hitPosition.Position);
- _hitPositions.Add(hitPosition);
- }
- public void Reset() {
- _hitPositions.Clear();
- UpdateVertexColors();
- }
- [System.Serializable]
- public struct HitPosition {
- [SerializeField]
- Vector3 _position;
- [SerializeField]
- float _distance;
- [SerializeField, ColorUsage(true, true, 0, 10, .125f, 3)]
- Color _color;
- [SerializeField]
- float _time;
- #region Properties
- public Color Color {
- get { return _color; }
- set { _color = value; }
- }
- public float Distance {
- get { return _distance; }
- set { _distance = value; }
- }
- public Vector3 Position {
- get { return _position; }
- set { _position = value; }
- }
- public float Time {
- get { return _time; }
- set { _time = value; }
- }
- #endregion
- public HitPosition(Vector3 position, Color color, float distance, float time) {
- _position = position;
- _color = color;
- _distance = distance;
- _time = time;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment