253 lines
7.2 KiB
Markdown
253 lines
7.2 KiB
Markdown
|
|
# fairygui_plugin_gradient_text
|
|||
|
|
|
|||
|
|
## 插件说明
|
|||
|
|
|
|||
|
|
fairygui 插件设置渐变色
|
|||
|
|
|
|||
|
|
编辑器部分基于wxb1990的[fairygui_plugin_gradient_text](https://github.com/wxb1990/fairygui_plugin_gradient_text)插件魔改而成。
|
|||
|
|
|
|||
|
|
运行时代码请拷贝本文档底部代码或参考其自行实现。
|
|||
|
|
|
|||
|
|
支持组件类型如下:
|
|||
|
|
|
|||
|
|
- text
|
|||
|
|
- richtext
|
|||
|
|
- inputtext
|
|||
|
|
- Button
|
|||
|
|
- Label
|
|||
|
|
|
|||
|
|
## 编辑器使用说明
|
|||
|
|
|
|||
|
|
1. 选中组件,在右侧`检查器`面板中可以看到`渐变`一栏,根据自己需求勾选`上下`或`左右`渐变(可都勾选)
|
|||
|
|
|
|||
|
|
2. 设置颜色值后将立即生效,其将影响两处内容:
|
|||
|
|
|
|||
|
|
1. 编辑器中文本的预览颜色
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
2. 自定义数据中会生成对应的json字段(供运行时使用)
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
## 运行时代码
|
|||
|
|
|
|||
|
|
首先我们需要对`GTextField`添加属性和相关方法供外部设置渐变色:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
namespace FairyGUI
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public class GTextField : GObject, ITextColorGear
|
|||
|
|
{
|
|||
|
|
// 其他代码忽略
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 渐变色
|
|||
|
|
/// </summary>
|
|||
|
|
public Color32[] gradientColor
|
|||
|
|
{
|
|||
|
|
get => _textField.textFormat.gradientColor;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
var tf = _textField.textFormat;
|
|||
|
|
|
|||
|
|
if (value == null)
|
|||
|
|
{
|
|||
|
|
if (tf.gradientColor == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
tf.gradientColor = null;
|
|||
|
|
}
|
|||
|
|
else if (tf.gradientColor == value)
|
|||
|
|
{
|
|||
|
|
// do nothing
|
|||
|
|
}
|
|||
|
|
else if (tf.gradientColor == null)
|
|||
|
|
{
|
|||
|
|
tf.gradientColor = new Color32[4];
|
|||
|
|
value.CopyTo(this.gradientColor, 0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
value.CopyTo(this.gradientColor, 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_textField.textFormat = tf;
|
|||
|
|
UpdateGear(4);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置四方向渐变色
|
|||
|
|
/// </summary>
|
|||
|
|
public void UpdateGradientColor(Color32 leftTop, Color32 leftBottom, Color32 rightTop, Color32 rightBottom)
|
|||
|
|
{
|
|||
|
|
var tf = _textField.textFormat;
|
|||
|
|
|
|||
|
|
var buffer = tf.gradientColor ??= new Color32[4];
|
|||
|
|
buffer[0] = leftTop;
|
|||
|
|
buffer[1] = leftBottom;
|
|||
|
|
buffer[2] = rightTop;
|
|||
|
|
buffer[3] = rightBottom;
|
|||
|
|
|
|||
|
|
this.gradientColor = buffer;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置从上到下的渐变色
|
|||
|
|
/// </summary>
|
|||
|
|
public void UpdateVerticalGradientColor(Color32 top, Color32 bottom)
|
|||
|
|
{
|
|||
|
|
UpdateGradientColor(top, bottom, top, bottom);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置从左到右的渐变色
|
|||
|
|
/// </summary>
|
|||
|
|
public void UpdateHorizontalGradientColor(Color32 left, Color32 right)
|
|||
|
|
{
|
|||
|
|
UpdateGradientColor(left, left, right, right);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
添加上述代码后,GTextField就允许通过代码直接设置渐变色了,然后我们在相关组件构造时,读取自定义数据,用于还原编辑器中设置的渐变色:
|
|||
|
|
|
|||
|
|
1. 新增工具类`UIUtils`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
namespace FairyGUI.Utils
|
|||
|
|
{
|
|||
|
|
public static class UIUtils
|
|||
|
|
{
|
|||
|
|
private const string JSON_KEY = "gradient";
|
|||
|
|
private static readonly Regex REGEX = new Regex(@"#([A-Fa-f0-9][A-Fa-f0-9])([A-Fa-f0-9][A-Fa-f0-9])([A-Fa-f0-9][A-Fa-f0-9])");
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 初始化文本渐变色
|
|||
|
|
/// </summary>
|
|||
|
|
public static void SetupGradientText(GTextField textField, Dictionary<string, object> jsonObject)
|
|||
|
|
{
|
|||
|
|
if (textField == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (jsonObject == null || !jsonObject.TryGetValue(JSON_KEY, out var jsonValue) || !(jsonValue is string str))
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
var colors = REGEX.Matches(str);
|
|||
|
|
if (colors.Count != 4)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
var top = ParseColor32(colors[0]);
|
|||
|
|
var bottom = ParseColor32(colors[1]);
|
|||
|
|
var left = ParseColor32(colors[2]);
|
|||
|
|
var right = ParseColor32(colors[3]);
|
|||
|
|
|
|||
|
|
textField.UpdateGradientColor(top, bottom, left, right);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static Color32 ParseColor32(Match match)
|
|||
|
|
{
|
|||
|
|
var r = byte.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
|
|||
|
|
var g = byte.Parse(match.Groups[2].Value, System.Globalization.NumberStyles.HexNumber);
|
|||
|
|
var b = byte.Parse(match.Groups[3].Value, System.Globalization.NumberStyles.HexNumber);
|
|||
|
|
return new Color32(r, g, b, 255);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 在相关组件的`Setup_AfterAdd`方法中进行初始化:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
namespace FairyGUI
|
|||
|
|
{
|
|||
|
|
public class GObject
|
|||
|
|
{
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
public Dictionary<string, object> dataJsonObject
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (_hasDeserializeDataJsonObject)
|
|||
|
|
return _dataJsonObject;
|
|||
|
|
|
|||
|
|
_hasDeserializeDataJsonObject = true;
|
|||
|
|
|
|||
|
|
var dataStr = data as string;
|
|||
|
|
if (string.IsNullOrEmpty(dataStr))
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 这里的dataJsonObject需要大家用自己的json库将data反序列化
|
|||
|
|
_dataJsonObject = JsonUtils.ParseJson(dataStr);
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
// ignore
|
|||
|
|
_dataJsonObject = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return _dataJsonObject;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 由于GRichTextField和GTextInput均继承自GTextField 所以无需重复执行
|
|||
|
|
public class GTextField : GObject, ITextColorGear
|
|||
|
|
{
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
|
|||
|
|
{
|
|||
|
|
base.Setup_AfterAdd(buffer, beginPos);
|
|||
|
|
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
UIUtils.SetupGradientText(this, dataJsonObject);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public class GButton : GComponent, IColorGear
|
|||
|
|
{
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
|
|||
|
|
{
|
|||
|
|
base.Setup_AfterAdd(buffer, beginPos);
|
|||
|
|
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
UIUtils.SetupGradientText(GetTextField(), dataJsonObject);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public class GButton : GComponent, IColorGear
|
|||
|
|
{
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
|
|||
|
|
{
|
|||
|
|
base.Setup_AfterAdd(buffer, beginPos);
|
|||
|
|
|
|||
|
|
// 省略原有代码
|
|||
|
|
|
|||
|
|
UIUtils.SetupGradientText(GetTextField(), dataJsonObject);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. 然后运行游戏,即可看到在编辑器中设置的渐变色文本了:
|
|||
|
|
|
|||
|
|

|