[unity] Update SkeletonGhostRenderer implementation.

This commit is contained in:
pharan 2018-08-15 00:00:43 +08:00
parent 70448abcdc
commit 56566fb774

View File

@ -35,17 +35,23 @@ using System.Collections;
namespace Spine.Unity.Modules { namespace Spine.Unity.Modules {
public class SkeletonGhostRenderer : MonoBehaviour { public class SkeletonGhostRenderer : MonoBehaviour {
static readonly Color32 TransparentBlack = new Color32(0, 0, 0, 0);
const string colorPropertyName = "_Color";
public float fadeSpeed = 10; float fadeSpeed = 10;
Color32 startColor;
Color32[] colors;
Color32 black = new Color32(0, 0, 0, 0);
MeshFilter meshFilter; MeshFilter meshFilter;
MeshRenderer meshRenderer; MeshRenderer meshRenderer;
MaterialPropertyBlock mpb;
int colorId;
void Awake () { void Awake () {
meshRenderer = gameObject.AddComponent<MeshRenderer>(); meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshFilter = gameObject.AddComponent<MeshFilter>(); meshFilter = gameObject.AddComponent<MeshFilter>();
colorId = Shader.PropertyToID(colorPropertyName);
mpb = new MaterialPropertyBlock();
} }
public void Initialize (Mesh mesh, Material[] materials, Color32 color, bool additive, float speed, int sortingLayerID, int sortingOrder) { public void Initialize (Mesh mesh, Material[] materials, Color32 color, bool additive, float speed, int sortingLayerID, int sortingOrder) {
@ -56,12 +62,9 @@ namespace Spine.Unity.Modules {
meshRenderer.sortingLayerID = sortingLayerID; meshRenderer.sortingLayerID = sortingLayerID;
meshRenderer.sortingOrder = sortingOrder; meshRenderer.sortingOrder = sortingOrder;
meshFilter.sharedMesh = Instantiate(mesh); meshFilter.sharedMesh = Instantiate(mesh);
colors = meshFilter.sharedMesh.colors32; startColor = color;
mpb.SetColor(colorId, color);
if ((color.a + color.r + color.g + color.b) > 0) { meshRenderer.SetPropertyBlock(mpb);
for (int i = 0; i < colors.Length; i++)
colors[i] = color;
}
fadeSpeed = speed; fadeSpeed = speed;
@ -72,19 +75,17 @@ namespace Spine.Unity.Modules {
} }
IEnumerator Fade () { IEnumerator Fade () {
Color32 c; Color32 c = startColor;
for (int t = 0; t < 500; t++) { Color32 black = SkeletonGhostRenderer.TransparentBlack;
bool breakout = true;
for (int i = 0; i < colors.Length; i++) {
c = colors[i];
if (c.a > 0)
breakout = false;
colors[i] = Color32.Lerp(c, black, Time.deltaTime * fadeSpeed); float t = 1f;
} for (float hardTimeLimit = 5f; hardTimeLimit > 0; hardTimeLimit -= Time.deltaTime) {
meshFilter.sharedMesh.colors32 = colors; c = Color32.Lerp(black, startColor, t);
mpb.SetColor(colorId, c);
meshRenderer.SetPropertyBlock(mpb);
if (breakout) t = Mathf.Lerp(t, 0, Time.deltaTime * fadeSpeed);
if (t <= 0)
break; break;
yield return null; yield return null;
@ -95,25 +96,20 @@ namespace Spine.Unity.Modules {
} }
IEnumerator FadeAdditive () { IEnumerator FadeAdditive () {
Color32 c; Color32 c = startColor;
Color32 black = this.black; Color32 black = SkeletonGhostRenderer.TransparentBlack;
for (int t = 0; t < 500; t++) { float t = 1f;
for (float hardTimeLimit = 5f; hardTimeLimit > 0; hardTimeLimit -= Time.deltaTime) {
c = Color32.Lerp(black, startColor, t);
mpb.SetColor(colorId, c);
meshRenderer.SetPropertyBlock(mpb);
bool breakout = true; t = Mathf.Lerp(t, 0, Time.deltaTime * fadeSpeed);
for (int i = 0; i < colors.Length; i++) { if (t <= 0)
c = colors[i];
black.a = c.a;
if (c.r > 0 || c.g > 0 || c.b > 0)
breakout = false;
colors[i] = Color32.Lerp(c, black, Time.deltaTime * fadeSpeed);
}
meshFilter.sharedMesh.colors32 = colors;
if (breakout)
break; break;
yield return null; yield return null;
} }