FairyGUI 투사 이미지, 텍스트 구성 요소

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/wangjiangrong/article/details/95341797

FairyGUI, 프로젝터 기능이 있습니다 텍스트 컨트롤에서, 우리는 예상 오프셋 및 색상 설정을 설정할 수 있습니다. 그러나 우리는 또한 효과 투영을 추가 UI 사진의 학생들을주고 싶어, 성취 될 수 없다. 그런 다음 우리는 =를 해결하는 데 도움이 될 수있는 프로그램을 던졌다. =

수요

당신은 투사로 구성 요소를 추가 할 수 있습니다, 사진, 텍스트 투사 투명성 (존재하지 않는)을 설정해야 할 수도 있습니다.

 

생각

모들이 가서 FairyGUI 에디터 레벨 에디터를 변경하는 모든의 첫 번째, 그것은 통일 그에서 시작해야합니다. 우리가 어떻게 프로젝터를 설치하려는 구성 요소 화합의 노하우를 만들고, 투사의 관련 매개 변수를 얻을 수있다. 에서 설정 각각의 제어, 데이터 세트 정의가 있음을 관찰, 우리는 사용자 정의 데이터에 몇 가지 키워드를 입력 할 수 있으며, 다음 유니티 구문 분석, 처리, 따라서 알아야 할 때 여부를 제어 및 프로젝션 관련 매개 변수.

그런 다음 매개 변수를 알고, 투영 된 결과를 달성하는 방법, 각 프로젝션 G 객체의 UnityEngine.UI.Shadow 게임 오브젝트의 요구에 구성 요소를 추가하기 시작하고, 부드러운 아무것도 찾지 못했습니다. 그것은 원래의 텍스트 프로젝션을 통해 제공, 그의 방법의 실현을보고 다음과 같이 관련 코드가 발견했다 :

//TextField.cs
public void OnPopulateMesh(VertexBuffer vb)
{
	....

	bool hasShadow = _shadowOffset.x != 0 || _shadowOffset.y != 0;
	......

	if (allocCount != count)
	{
		VertexBuffer vb2 = VertexBuffer.Begin();
		List<Vector3> vertList2 = vb2.vertices;
Y_5_2 || UNITY_5_3_OR_NEWER
		List<Vector4> uvList2 = vb2.uv0;

		List<Vector2> uvList2 = vb2.uv0;

		List<Color32> colList2 = vb2.colors;

		Color32 strokeColor = _strokeColor;
		......

		if (hasShadow)
		{
			for (int i = 0; i < count; i++)
			{
				Vector3 vert = vertList[i];
				Vector4 u = uvList[i];

				uvList2.Add(u);
				vertList2.Add(new Vector3(vert.x + _shadowOffset.x, vert.y - _shadowOffset.y, 0));
				colList2.Add(strokeColor);
			}
		}

		vb.Insert(vb2);
		vb2.End();
	}

	vb.AddTriangles();
    ......
}

실질적 양복을 수행하고, 원래의 정점 일본어 텍스트 (투영 오프셋) 오프셋, 및 텍스트 색상을 투영 끌어하고 원래 텍스트를 투영을 달성하기 위해, 그 위에 중첩되는 그릴. 그 중 우리가 부울 값은, strokeColor을 수정할 때 오버 헤드 투명 효과에 도달 할 수 있습니다.

 

실현

아이디어는 텍스트 필드에 텍스트 필드 예상 구현, 우리는 이미지의 GImage에 대한 strokeColor.a의 값을 수정해야, 우리는 유사한 도면 투영을 달성하기 위해 자신의 코드를 추가해야합니다.

오, GComponent, GImage, G 객체, GTextField 편집 파일 , NGraphics을. 이후 이들은 쉽게 업데이트 커버 될 경우 FairyGUI 파일을 직접 단어를 변경할 수 있습니다, 그래서 우리는 이러한 클래스가 변경 넣을 수 있습니다 부분 클래스 다음 로직 코드의 대부분은 외부에 기록 보냈다.

우선, 나는 우리의 사용자 정의 데이터 집합을 해결하고자, 나는 다음과 같은 규칙이 설정 0.5 |와 shadowColor : 00FF00 | shadowAlpha 5,5 : ShadowOffset , | 분할 쌍을. GObject.cs는, 새로운 파일을 생성 데이터 분석을 사용자 정의

using UnityEngine;
using System;

namespace FairyGUI
{
    public partial class GObject : EventDispatcher
	{
        bool mIsCustomShadowOffset = false;
        Vector2 mCustomShadowOffset = Vector2.zero;
        public bool IsCustomShadowOffset
        {
            get { return mIsCustomShadowOffset; }
        }
        public Vector2 CustomShadowOffset
        {
            get { return mCustomShadowOffset; }
        }

        bool mIsCustomShadowColor = false;
        Color mCustomShadowColor = Color.black;
        public bool IsCustomShadowColor
        {
            get { return mIsCustomShadowColor; }
        }
        public Color CustomShadowColor
        {
            get { return mCustomShadowColor; }
        }

        bool mIsCustomShadowAlpha = false;
        float mCustomShadowAlpha = 1f;
        public bool IsCustomShadowAlpha
        {
            get { return mIsCustomShadowAlpha; }
        }
        public float CustomShadowAlpha
        {
            get { return mCustomShadowAlpha; }
        }

        //call in AnalyUserDefineData
        public virtual void CustomAction()
        {

        }

        //call in Setup_AfterAdd
        public void AnalyUserDefineData(object data)
        {
            if (data != null && !"".Equals(data.ToString()))
            {
                string[] args = data.ToString().Split('|');
                foreach(string arg in args)
                {
                    string[] keyvalue = arg.Split(':');
                    if (keyvalue.Length != 2)
                    {
                        continue;
                    }
                    if (keyvalue[0].Equals("ShadowOffset"))
                    {
                        mIsCustomShadowOffset = true;
                        string[] array = keyvalue[1].Split(',');
                        mCustomShadowOffset = new Vector2(float.Parse(array[0]), float.Parse(array[1]));
                    }
                    if (keyvalue[0].Equals("ShadowColor"))
                    {
                        mIsCustomShadowColor = true;
                        mCustomShadowColor = GetColorByHex(keyvalue[1]);
                    }
                    if (keyvalue[0].Equals("ShadowAlpha"))
                    {
                        mIsCustomShadowAlpha = true;
                        mCustomShadowAlpha = float.Parse(keyvalue[1]);
                    }
                }

                if (mIsCustomShadowAlpha && mIsCustomShadowColor)
                {
                    mCustomShadowColor.a = mCustomShadowAlpha;
                }

                CustomAction();
            }
        }

        //format:FF000
        Color GetColorByHex(string v)
        {
            if(v.Length == 6)
            {
                try
                {
                    float r = Convert.ToInt32($"{v[0]}{v[1]}", 16) / 255.0f;
                    float g = Convert.ToInt32($"{v[2]}{v[3]}", 16) / 255.0f;
                    float b = Convert.ToInt32($"{v[4]}{v[5]}", 16) / 255.0f;
                    return new Color(r, g, b);
                }
                catch
                {
                    return Color.black;
                }
            }
            return Color.black;
        }
    }
}

이 데이터에서 CustomAction 동작을 파싱 한 후, 나중에 특정 구현 및 GTextField GImage 구현 될있어서, 주 정보는, 다른 데이터 서브 클래스에 재 할당 파싱된다.

G 객체 FairyGUI를 호출 그런 다음 마지막으로 Setup_AfterAdd 방법

AnalyUserDefineData(this.data);

그래야 당신은 G 객체 각각에 대한 투영 정보를 얻을 수 있습니다. 투사 정보를 얻을, 우리는 먼저 메시지를 시작 가장 간단한 텍스트에서 그림자의 투명도를 추가, 그리기 프로세스 구성 요소를 변경하는 것입니다.

GTextField.cs 새 파일을 작성, 당신은 다음 GTextField.strokeColor을 수정할 수 있습니다. 다음과 같습니다 :

using UnityEngine;

namespace FairyGUI
{
    public partial class GTextField : GObject, ITextColorGear
    {
        //call in CustomAction
        void InitCustomSetting()
        {
            if (IsCustomShadowOffset)
            {
                
                this.shadowOffset = CustomShadowOffset;
            }
            if (IsCustomShadowColor)
            {
                this.strokeColor = CustomShadowColor;
            }
            else
            {
                if (IsCustomShadowAlpha)
                {
                    Color c = this.strokeColor;
                    c.a = CustomShadowAlpha;
                    this.strokeColor = c;
                }
            }
        }

        public override void CustomAction()
        {
            InitCustomSetting();
        }
    }
}

결과는 다음과 같다 있습니다

우리 FairyGUI 텍스트, 제 투영 녹색, 적색 제 2 돌출부의 두 돌출부, 상기 제 2 사용자 데이터 ShadowAlpha 구비 0.5 |와 shadowColor : 00FF00

다음 결과 릴리즈 후에 유니티 (색상 및 알파 유효하다)이고

이제 제곱지도와 일반 프로젝션 사진 처리, 더 복잡한 사진 투사 과정 다음에, 우리 모두는 코드 변경에 따라 여기에 게시 특정 코드를 찾습니다.

첫 번째 레코드 투영 정보에 대한 NGraphics.cs 파일을 만듭니다 (예 : GTextField.shadowOffset 및 GTextField.strokeColor 이러한 필드의 텍스트), 우리는 당신의 자신의 사진을 만들 필요가

using System.Collections.Generic;
using UnityEngine;

namespace FairyGUI
{
    public partial class NGraphics : IMeshFactory
    {
        bool mIsCustomShadowOffset = false;
        Vector2 mCustomShadowOffset = Vector2.zero;
        Color mCustomShadowColor = Color.black;

        //call in GImage CustomAction
        public void InitCustomShadow(Vector2 offset, Color c)
        {
            mIsCustomShadowOffset = true;
            mCustomShadowOffset = offset;
            mCustomShadowColor = c;
        }

        //call in NGraphics OnPopulateMesh
        //call in Image SliceFill
        public bool AddCustomShadow(VertexBuffer vb)
        {
            if (mIsCustomShadowOffset)
            {
                VertexBuffer vb2 = VertexBuffer.Begin();
                List<Vector3> vertList2 = vb2.vertices;
#if UNITY_5_2 || UNITY_5_3_OR_NEWER
                List<Vector4> uvList2 = vb2.uv0;
#else
                List<Vector2> uvList2 = vb2.uv0;
#endif
                List<Color32> colList2 = vb2.colors;

                for (int i = 0; i < vb.vertices.Count; i++)
                {
                    Vector3 vert = vb.vertices[i];
                    Vector4 u = vb.uv0[i];

                    uvList2.Add(u);
                    vertList2.Add(new Vector3(vert.x + mCustomShadowOffset.x, vert.y - mCustomShadowOffset.y, 0));
                    colList2.Add(mCustomShadowColor);
                }
                vb.Insert(vb2);
                vb2.End();
                return true;
            }
            return false;
        }
    }
}

이어서 InitCustomShadow 위의 메소드를 호출하는 것이, NGraphics G 객체 정보를 전달하기 위해, GImage.cs를 생성한다.

namespace FairyGUI
{
    public partial class GImage : GObject, IColorGear
    {
        public override void CustomAction()
        {
            if (IsCustomShadowOffset)
            {
                _content.graphics.InitCustomShadow(CustomShadowOffset, CustomShadowColor);
            }
        }
    }
}

그리고 우리는이 곳에서 예상 논리를 추가, 즉 NGraphics의 방법을 AddCustomShadow 호출해야합니다. NGraphics의 OnPopulateMesh 방법이라고 보통 사진

public partial class NGraphics : IMeshFactory
{
    ...

    public void OnPopulateMesh(VertexBuffer vb)
    {
        Rect rect = texture.GetDrawRect(vb.contentRect);

        vb.AddQuad(rect, vb.vertexColor, vb.uvRect);

        AddCustomShadow(vb);

        vb.AddTriangles();
        vb._isArbitraryQuad = vertexMatrix != null;
    }
}

SliceFill의 이미지라는 사진 제곱 방법

public class Image : DisplayObject, IMeshFactory
{
		public void SliceFill(VertexBuffer vb)
		{
				for (int pi = 0; pi < 9; pi++)
				{
					...
				}

                if (graphics.AddCustomShadow(vb))
                {
                    vb.AddTriangles(TRIANGLES_9_GRID);
                    vb.AddTriangles(TRIANGLES_9_GRID, 16);
                }
                else
                {
                    vb.AddTriangles(TRIANGLES_9_GRID);
                }

                vb.AddTriangles();
		}
}

다음으로도 효과 (퍼플 ShadowAlpha 투영 첨가하여 배치 0.5 |와 shadowColor : 00FF00 | ShadowOffset을 : 5,5)을

마지막으로, 그림과 텍스트뿐만 아니라, 우리가 투사를 필요로 일부 사용자 지정 구성 요소가 될 수 있지만, 내부 구성 요소 요소를 많이, 하나 하나가 너무 많은 문제가있을 수 있습니다 추가, 그래서 우리가 할 수 GComponent, 부모 구성 요소가 프로젝터 정보를 설정 한 경우, 서브 어셈블리 후 자동으로 상속하지.

(GComponent 하위 GComponent가있다) 재귀 상속 사용자 데이터를위한 수단을 추가 새 문서를 GComponent.cs

using System;
#if FAIRYGUI_TOLUA
using LuaInterface;
#endif

namespace FairyGUI
{
    /// <summary>
    /// Component
    /// </summary>
    public partial class GComponent : GObject
    {
        //call in ConstructFromResource, after child.Setup_BeforeAdd(buffer, curPos);
        void AnalyUserDefineDataToChild(GObject obj)
        {
            if (obj.data != null)
            {
                GComponent com = obj as GComponent;
                if (com != null)
                {
                    GObject[] array = com.GetChildren();
                    for (int j = 0; j < array.Length; j++)
                    {
                        if (array[j].data == null)
                        {
                            GComponent childCom = array[j] as GComponent;
                            if (childCom != null)
                            {
                                array[j].data = obj.data;
                                //if child is GComponent,for example GList, recursion 
                                AnalyUserDefineDataToChild(array[j]);
                            }
                            else
                            {
                                array[j].AnalyUserDefineData(obj.data);
                            }
                        }
                    }
                }
            }
        }
    }
}

마지막으로, 우리는에서 ConstructFromResource 방법 GComponent에서 호출 할 수 있습니다.

public partial class GComponent : GObject
{
	.....

	internal void ConstructFromResource(List<GObject> objectPool, int poolIndex)
	{
		......

		child.underConstruct = true;
		child.Setup_BeforeAdd(buffer, curPos);

        AnalyUserDefineDataToChild(child);

        child.InternalSetParent(this);
		_children.Add(child);

		buffer.position = curPos + dataLen;

		......
    }

	......
}

 

추천

출처blog.csdn.net/wangjiangrong/article/details/95341797