본문 바로가기
개발/Unity

Unity)GUILable(OutLine : 외곽선추가)

by 테샤르 2022. 11. 1.

GUILable(OutLine : 외곽선추가)

 

GUI를 표현하는 과정에서 단색으로 처리 하면 잘 보이지 않아서

Style을 추가해서 OutLine (Stroke)처리하는 코드이다.

#if UNITY_EDITOR
private GUIStyle customStyle = null;
 
void Initalize()
{
		if(customStyle == null)
        {
            customStyle= new GUIStyle(GUI.skin.box);
            customStyle.normal.textColor = Color.white;
            customStyle.fontSize=11;
        }
}



void OnDrawGizmos()
{
	Handles.BeginGUI();
    DrawOutline(rect, name, 1,customStyle);
    Handles.EndGUI();
}

 /// <summary>
    /// OutLine 생성
    /// </summary>
    /// <param name="r"></param>
    /// <param name="t"></param>
    /// <param name="strength"></param>
    /// <param name="style"></param>
 void DrawOutline(Rect r, string t, int strength, GUIStyle style)
    {
        GUI.color = new Color(0, 0, 0, 1);
        int i;
        for (i = -strength; i <= strength; i++)
        {
            GUI.Label(new Rect(r.x - strength, r.y + i, r.width, r.height), t, style);
            GUI.Label(new Rect(r.x + strength, r.y + i, r.width, r.height), t, style);
        }
        for (i = -strength + 1; i <= strength - 1; i++)
        {
            GUI.Label(new Rect(r.x + i, r.y - strength, r.width, r.height), t, style);
            GUI.Label(new Rect(r.x + i, r.y + strength, r.width, r.height), t, style);
        }
        GUI.color = new Color(1, 1, 1, 1);
        GUI.Label(r, t,style);
    }
    
#endif

 

DrawOutLine 코드는 간단하게 글자만큼 Loop를 돌면서

x-  ~  x+ 

y-  ~  y+ 

 

 OutLine 두께 만큼 처리하는 코드로 OutLine 을 표현했다.

 

        //OutLine 
        public static void DrawOutline(int outlineThickness, string labelText, GUIStyle textStyle)
        {
            Vector2 labelSize = textStyle.CalcSize(new GUIContent(labelText));
            Rect labelRect = GUILayoutUtility.GetRect(labelSize.x, labelSize.y);
            var outlineStyle = new GUIStyle(textStyle);
            outlineStyle.normal.textColor = Color.black;

            for (int x = -outlineThickness; x <= outlineThickness; x++)
            {
                for (int y = -outlineThickness; y <= outlineThickness; y++)
                {
                    if (x == 0 && y == 0)
                        continue;

                    Rect offsetRect = new Rect(labelRect.x + (x * 0.5f), labelRect.y + (y * 0.5f), labelRect.width, labelRect.height);
                    GUI.Label(offsetRect, labelText, outlineStyle);
                }
            }
            GUI.Label(labelRect, labelText, textStyle);
        }

 

 

반응형

 

인라인 코드로  코드지만 Loop를 돌지 않고 한 라인만 생성하는 코드이다.

        public static void DrawOutline(Rect _rect , string _text,  GUIStyle _style , Color _outColor, Color _inColor)
        {
            //Stroke
            _style.normal.textColor = _outColor;
            _rect.x--;
            GUI.Label(_rect, _text, _style);
            _rect.x += 2;
            GUI.Label(_rect, _text, _style);
            _rect.x--;
            _rect.y--;
            GUI.Label(_rect, _text, _style);
            _rect.y += 2;
            GUI.Label(_rect, _text, _style);
            _rect.y--;

            //Draw Label
            _style.normal.textColor = _inColor;
            GUI.Label(_rect, _text, _style);
        }

 

 

★☆☆☆☆

 

반응형

댓글