unreal游戏,unreal教学,unreal素材

超级管理员

96

帖子

0

回复

280

积分

楼主
发表于 2018-03-08 21:25:57 | 查看: 152 | 回复: 0

ue4实现富文本提示


游戏中需要用到富文本提示信息,即一行提示信息文字可配置多种颜色,还可以考虑加入图片(本文只实现多颜色,扩展也比较简单)

实现富文本,大体分为两步:

1.实现富文本配置

2.显示富文本

先来看第一步,定义提示信息格式,如下所示:

<str color=252>测试</str><str color=253>行</str><str color=251>一</str>

很明显,可以为“测试”、“行”、“一”配置不同颜色,此处使用了颜色索引,约定好一些颜色,当然也可以直接配置颜色值,想要加入图片,只要扩展属性即可

以上格式采用正则表达式解析比较简单,具体解析代码如下:


[cpp] view plain copy

  1. USTRUCT()  

  2. struct FTextElementInfo  

  3. {  

  4.     GENERATED_USTRUCT_BODY()  

  5.   

  6. public:  

  7.     UPROPERTY(EditAnywhere, BlueprintReadWrite)  

  8.     FString Text;  

  9.   

  10.     UPROPERTY(EditAnywhere, BlueprintReadWrite)  

  11.     int32   Color;  

  12. };  

  13.   

  14. UFUNCTION(BlueprintCallable, Category = "TextElement")  

  15. void ParseNoticeString(const FString& Strs, TArray<FTextElementInfo>& ElementList);  

  16.   

  17. void ParseTextElement(const FString& Str, FString& Text, int32& Color);  

  18.   

  19. void UTestGameInstance::ParseNoticeString(const FString& Strs, TArray<FTextElementInfo>& ElementList)  

  20. {  

  21.     TArray<FString> OutArray;  

  22.     Strs.ParseIntoArray(OutArray, TEXT("><"));  

  23.   

  24.     for (int32 Index = 0; Index < OutArray.Num(); ++Index)  

  25.     {  

  26.         FTextElementInfo Info;  

  27.         if (Index == 0)  

  28.         {  

  29.             this->ParseTextElement(OutArray[Index], Info.Text, Info.Color);  

  30.         }  

  31.         else  

  32.         {  

  33.             this->ParseTextElement(TEXT("<") + OutArray[Index], Info.Text, Info.Color);  

  34.         }  

  35.           

  36.         ElementList.Add(Info);  

  37.     }  

  38. }  

  39.   

  40. void UTestGameInstance::ParseTextElement(const FString& Str, FString& Text, int32& Color)  

  41. {  

  42.     const FRegexPattern NodePattern = FRegexPattern(TEXT("<([\\w\\d\\.-]+)"));  

  43.     FRegexMatcher NodeMatcher(NodePattern, Str);  

  44.     if (NodeMatcher.FindNext())  

  45.     {  

  46.         FString NodeName = NodeMatcher.GetCaptureGroup(1);  

  47.         if (!NodeName.Equals(TEXT("str")))  

  48.         {  

  49.             GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("字符串格式错误,结点名必须为str"));  

  50.             return;  

  51.         }  

  52.     }  

  53.   

  54.     TMap<FString, FString> AttrList;  

  55.   

  56.     const FRegexPattern AttrPattern = FRegexPattern(TEXT("([\\w\\d\\.-]+=[\\w\\d\\.-]+)"));  

  57.     FRegexMatcher AttrMatcher(AttrPattern, Str);  

  58.     while (AttrMatcher.FindNext())  

  59.     {  

  60.         FString MatchStr = AttrMatcher.GetCaptureGroup(1);  

  61.   

  62.         int32 EqualPos = MatchStr.Find("=");  

  63.         FString Key = MatchStr.Mid(0, EqualPos);  

  64.         FString Value = MatchStr.Mid(EqualPos+1);  

  65.   

  66.         AttrList.Add(Key, Value);  

  67.     }  

  68.   

  69.     FString* ColorStr = AttrList.Find(TEXT("color"));  

  70.     if (ColorStr != NULL && !ColorStr->IsEmpty())  

  71.     {  

  72.         Color = FCString::Atoi(**ColorStr);;  

  73.     }  

  74.     else  

  75.     {  

  76.         Color = 255;  

  77.     }  

  78.   

  79.     const FRegexPattern TextPattern = FRegexPattern(TEXT(">([\\w\\d\\.-]+)<"));  

  80.     FRegexMatcher TextMatcher(TextPattern, Str);  

  81.     if (TextMatcher.FindNext())  

  82.     {  

  83.         Text = TextMatcher.GetCaptureGroup(1);  

  84.     }  

  85. }  

通过以上代码,即可把约定格式的文本解析到FTextElementInfo列表中

解析逻辑比较通用,跟引擎甚至语言无关,当然也跟显示无关


接下来看第二步,实现富文本显示

显示富文本跟具体的需求有关,以下提供一个简单的实现:

先静态创建最大数量的文本显示控件,把要显示的提示信息放到一个列表里,然后每帧重新刷新显示列表的信息,隐藏没有用上的文本控件,具体实现由于是蓝图实现就不上图了,很简单

文章来源自:http://blog.csdn.net/xiaozhi0999/article/details/52777480



您需要登录后才可以回帖 登录 | 立即注册

Copyright © 2017-2018 Scouther Group.All rights reserved.