在游戏中有时候会碰到这样的需求,在Label中显示的文字中,部分文字需要有交互效果,比如点击地图位置文字可以自动寻路,点击聊天信息中的道具名称可以显示道具详情之类的。
解决这类问题,要么是将相应的文字做成button覆盖在文字上方,或者直接在对应的文字位置设置碰撞框,添加点击事件。不管如何都需要计算出label中一些特定文字的相对位置,才可以将碰撞框(或者表情之类的图片)放到正确的位置。
NGUI本身带有计算位置和显示文字大小的方法,NGUIText.CalculatePrintedSize和NGUIText.PrintExactCharacterPositions,这里需要将这些方法改编一下
//计算单个文字的准确位置
//参数1是显示字符串的UI控件,参数2是要显示的所有文字,参数3是要计算位置的文字的index
public static Vector2 CalculateSinglePosition(UILabel label, string text, int index)
{
BetterList<Vector3> verts = new BetterList<Vector3>();
BetterList<int> indices = new BetterList<int>();
UpdateCharacterPosition(label, text, out verts, out indices);
index = indices.IndexOf(index);
Vector3 p1;
if (index != -1 && verts.size > index * 2 + 1)
{
p1 = (verts[index * 2] + verts[index * 2 + 1]) *