/// <summary>
/// 超链接信息列表
/// </summary>
private
readonly List<HrefInfo> m_HrefInfos =
new List<HrefInfo>();
/// <summary>
/// 文本构造器
/// </summary>
private
static
readonly StringBuilder s_TextBuilder =
new StringBuilder();
/// <summary>
/// 超链接正则
/// </summary>
private
static
readonly Regex s_HrefRegex =
new Regex(@
"<a href=([^>\n\s]+)>(.*?)(</a>)", );
[Serializable]
public
class HrefClickEvent : UnityEvent<
string> { }
[SerializeField]
private HrefClickEvent m_OnHrefClick =
new HrefClickEvent();
/// <summary>
/// 超链接点击事件
/// </summary>
public HrefClickEvent onHrefClick
{
get {
return m_OnHrefClick; }
set { m_OnHrefClick = value; }
}
/// <summary>
/// 获取超链接解析后的最后输出文本
/// </summary>
/// <returns></returns>
protected
string GetOutputText()
{
s_TextBuilder.Length =
0;
m_HrefInfos.Clear();
var indexText =
0;
foreach (Match match
in s_HrefRegex.Matches(text))
{
s_TextBuilder.Append((indexText, - indexText));
s_TextBuilder.Append(
"<color=blue>");
// 超链接颜色
var group = [
1];
var hrefInfo =
new HrefInfo
{
startIndex = s_TextBuilder.Length *
4,
// 超链接里的文本起始顶点索引
endIndex = (s_TextBuilder.Length + [
2].Length -
1) *
4 +
3,
name =
};
m_HrefInfos.Add(hrefInfo);
s_TextBuilder.Append([
2].Value);
s_TextBuilder.Append(
"</color>");
indexText = + ;
}
s_TextBuilder.Append((indexText, - indexText));
return s_TextBuilder.ToString();
}
/// <summary>
/// 点击事件检测是否点击到超链接文本
/// </summary>
/// <param name="eventData"></param>
public
void OnPointerClick(PointerEventData eventData)
{
Vector2 lp;
(
rectTransform, , ,
out lp);
foreach (var hrefInfo
in m_HrefInfos)
{
var boxes = ;
for (var i =
0; i < ; ++i)
{
if (boxes[i].Contains(lp))
{
m_OnHrefClick.Invoke();
return;
}
}
}
}
/// <summary>
/// 超链接信息类
/// </summary>
private
class HrefInfo
{
public
int startIndex;
public
int endIndex;
public
string name;
public
readonly List<Rect> boxes =
new List<Rect>();
}