FairyGUI 投影 图片,文本,组件

FairyGUI 中,文本控件自带了投影的功能,我们可以在设置中设置投影的偏移以及颜色。但是我们的UI同学想给图片等也添加投影的效果,就无从实现了。然后就丢给我们程序帮忙解决=。=

需求

可以给组件,图片等添加投影,文字投影需要可以设置透明度(目前不行)。

 

思路

首先自己莫得水平去改FairyGUI Editor编辑器,那就得从unity那下手。如何让unity知道哪些组件我们是想设置投影的,并且获得投影的相关参数。观察发现每个控件的设置中,都有一个自定义数据的设置,我们可以通过在自定义数据中输入一些关键字,然后在Unity解析的时候,进行处理,从而得知该控件是否需要投影以及相关参数。

接着,知道参数后,如何实现投影的效果,一开始给每个需要投影的GObject的GameObject添加一个UnityEngine.UI.Shadow的Component,发现并没什么软用。所以通过原本自带的文本投影的功能,去查看了下他的实现方法,找到相关代码如下:

//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的布尔值,就可以达到投影透明的效果。

 

实现

思路就是TextField的投影实现方式,对于TextField,我们只需要修改strokeColor.a的值即可,对于GImage的Image,我们需自己添加类似的代码实现投影的绘制。

需要修改的文件有五个,GComponent,GImage,GObject,GTextField,NGraphics。由于这些都是FairyGUI的文件,直接改动的话之后要是更新了,容易导致覆盖,所以我们可以把这些类都改为partial class然后把大部分的逻辑代码都写在外面。

首先,我要解析我们设定的自定义数据,我定的规则如下ShadowOffset:5,5|ShadowAlpha:0.5|ShadowColor:00FF00,| 分割的键值对。新建一个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
        {
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值