Created
February 15, 2018 00:58
-
-
Save baba-s/6a8e9956afea8b7d97c6e973529141ab to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Author: Melang http://forum.unity3d.com/members/melang.593409/ | |
using System; | |
using System.Collections.Generic; | |
namespace UnityEngine.UI | |
{ | |
//An outline that looks a bit nicer than the default one. It has less "holes" in the outline by drawing more copies of the effect | |
[AddComponentMenu( "UI/Effects/NicerOutline", 15 )] | |
public class NicerOutline : BaseMeshEffect | |
{ | |
[SerializeField] | |
private Color m_EffectColor = new Color( 0f, 0f, 0f, 0.5f ); | |
[SerializeField] | |
private Vector2 m_EffectDistance = new Vector2( 1f, -1f ); | |
[SerializeField] | |
private bool m_UseGraphicAlpha = true; | |
// | |
// Properties | |
// | |
public Color effectColor | |
{ | |
get | |
{ | |
return this.m_EffectColor; | |
} | |
set | |
{ | |
this.m_EffectColor = value; | |
if ( base.graphic != null ) | |
{ | |
base.graphic.SetVerticesDirty(); | |
} | |
} | |
} | |
public Vector2 effectDistance | |
{ | |
get | |
{ | |
return this.m_EffectDistance; | |
} | |
set | |
{ | |
if ( value.x > 600f ) | |
{ | |
value.x = 600f; | |
} | |
if ( value.x < -600f ) | |
{ | |
value.x = -600f; | |
} | |
if ( value.y > 600f ) | |
{ | |
value.y = 600f; | |
} | |
if ( value.y < -600f ) | |
{ | |
value.y = -600f; | |
} | |
if ( this.m_EffectDistance == value ) | |
{ | |
return; | |
} | |
this.m_EffectDistance = value; | |
if ( base.graphic != null ) | |
{ | |
base.graphic.SetVerticesDirty(); | |
} | |
} | |
} | |
public bool useGraphicAlpha | |
{ | |
get | |
{ | |
return this.m_UseGraphicAlpha; | |
} | |
set | |
{ | |
this.m_UseGraphicAlpha = value; | |
if ( base.graphic != null ) | |
{ | |
base.graphic.SetVerticesDirty(); | |
} | |
} | |
} | |
// | |
// Methods | |
// | |
protected void ApplyShadow( List<UIVertex> verts, Color32 color, int start, int end, float x, float y ) | |
{ | |
//Debug.Log("verts count: "+verts.Count); | |
int num = verts.Count * 2; | |
if ( verts.Capacity < num ) | |
{ | |
verts.Capacity = num; | |
} | |
for ( int i = start; i < end; i++ ) | |
{ | |
UIVertex uIVertex = verts[ i ]; | |
verts.Add( uIVertex ); | |
Vector3 position = uIVertex.position; | |
//Debug.Log("vertex pos: "+position); | |
position.x += x; | |
position.y += y; | |
uIVertex.position = position; | |
Color32 color2 = color; | |
if ( this.m_UseGraphicAlpha ) | |
{ | |
color2.a = ( byte )( color2.a * verts[ i ].color.a / 255 ); | |
} | |
uIVertex.color = color2; | |
//uIVertex.color = (Color32)Color.blue; | |
verts[ i ] = uIVertex; | |
} | |
} | |
public override void ModifyMesh( VertexHelper vh ) | |
{ | |
if ( !this.IsActive() ) | |
{ | |
return; | |
} | |
Text foundtext = GetComponent<Text>(); | |
float best_fit_adjustment = 1f; | |
if ( foundtext && foundtext.resizeTextForBestFit ) | |
{ | |
best_fit_adjustment = ( float )foundtext.cachedTextGenerator.fontSizeUsedForBestFit / ( foundtext.resizeTextMaxSize - 1 ); //max size seems to be exclusive | |
} | |
float distanceX = this.effectDistance.x * best_fit_adjustment; | |
float distanceY = this.effectDistance.y * best_fit_adjustment; | |
var verts = new List<UIVertex>(); | |
vh.GetUIVertexStream( verts ); | |
int start = 0; | |
int count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, distanceX, distanceY ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, distanceX, -distanceY ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, -distanceX, distanceY ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, -distanceX, -distanceY ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, distanceX, 0 ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, -distanceX, 0 ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, 0, distanceY ); | |
start = count; | |
count = verts.Count; | |
this.ApplyShadow( verts, this.effectColor, start, verts.Count, 0, -distanceY ); | |
vh.Clear(); | |
vh.AddUIVertexTriangleStream( verts ); | |
} | |
protected override void OnValidate() | |
{ | |
this.effectDistance = this.m_EffectDistance; | |
base.OnValidate(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment