在Unreal引擎中大量使用了自定义的数据类型如:FName,FString,TArray等等,对于这些自定义的数据类型,我们无法直接查看到这些数据的值,但是我们可以编写VS中的autoexp.dat文件中的脚本,来达到我们需要在调试器中显示的方式。

由于在VS2003中的autoexp.dat脚本不支持表达式,而无法全部满足我们对Unreal引擎中自定义的数据类型的调试显示。经过研究,笔者实现了FColor,FNameEntry,FString的直接显示,但是对于FName的显示,通过调整FName的代码,也实现了其调试显示的需求。

而VS2005、VS2008、VS2010中的autoexp.dat脚本实现了对表达式的支持,基本上可以把Unreal引擎中的所有自定义数据类型直观的显示在调试器中。

VS2003中的方法如下:

打开VS安装目录下的Common7/Packages/Debugger/autoexp.dat文件,在[AutoExpand]下添加如下脚本:

1FNameEntry=<Name,su>
2;Unreal的FColor
3FColor = R=<R,u> G=<G,u> B=<B,u> A=<A,u>
4FString = <Data,su>
5FName = <operator*(),su> ;注意:调用operator*()函数需要把代码中的断言去掉,否则在查看未初始化的FName变量时会出现异常。

VS2005、VS2008、VS2010中的方法如下:

同上打开autoexp.dat文件,在[AutoExpand]下添加如下脚本:

1FNameEntry=<Name,su>
2;Unreal的FColor
3FColor = R=<R,u> G=<G,u> B=<B,u> A=<A,u>

在[Visualizer]下添加如下脚本:

  1; Unreal格式的数组
  2TArray<FString>{
  3     children
  4     (
  5         #array
  6         (
  7             expr :    ((FString*)($c.Data))[$i],
  8             size :     $c.ArrayNum
  9         )
 10     )
 11
 12     preview
 13     (
 14         #(
 15            "[",
 16             $c.ArrayNum ,
 17            "](",
 18         
 19             #array
 20             (
 21                 expr :         [((FString*)($e.Data))[$i].Data,su],
 22                 size :      $c.ArrayNum
 23             ),
 24            ")"
 25         )
 26     )
 27  
 28     stringview
 29     (
 30         #(
 31            "[",
 32             $c.ArrayNum ,
 33            "](",
 34         
 35             #array
 36             (
 37                 expr :         [((FString*)($e.Data))[$i].Data,su],
 38                 size :      $c.ArrayNum
 39             ),
 40            ")"
 41         )
 42     )
 43}
 44
 45TArrayNoInit<FString>{
 46     children
 47     (
 48         #array
 49         (
 50             expr :    ((FString*)($c.Data))[$i],
 51             size :     $c.ArrayNum
 52         )
 53     )
 54
 55     preview
 56     (
 57         #(
 58            "[",
 59             $c.ArrayNum ,
 60            "](",
 61         
 62             #array
 63             (
 64                 expr :         [((FString*)($e.Data))[$i].Data,su],
 65                 size :      $c.ArrayNum
 66             ),
 67            ")"
 68         )
 69     )
 70  
 71     stringview
 72     (
 73         #(
 74            "[",
 75             $c.ArrayNum ,
 76            "](",
 77         
 78             #array
 79             (
 80                 expr :         [((FString*)($e.Data))[$i].Data,su],
 81                 size :      $c.ArrayNum
 82             ),
 83            ")"
 84         )
 85     )
 86}
 87
 88; Unreal格式的数组
 89TArray<FStringNoInit>{
 90     children
 91     (
 92         #array
 93         (
 94             expr :    ((FStringNoInit*)($c.Data))[$i],
 95             size :     $c.ArrayNum
 96         )
 97     )
 98
 99     preview
100     (
101         #(
102            "[",
103             $c.ArrayNum ,
104            "](",
105         
106             #array
107             (
108                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
109                 size :      $c.ArrayNum
110             ),
111            ")"
112         )
113     )
114  
115     stringview
116     (
117         #(
118            "[",
119             $c.ArrayNum ,
120            "](",
121         
122             #array
123             (
124                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
125                 size :      $c.ArrayNum
126             ),
127            ")"
128         )
129     )
130}
131
132TArrayNoInit<FStringNoInit>{
133     children
134     (
135         #array
136         (
137             expr :    ((FStringNoInit*)($c.Data))[$i],
138             size :     $c.ArrayNum
139         )
140     )
141
142     preview
143     (
144         #(
145            "[",
146             $c.ArrayNum ,
147            "](",
148         
149             #array
150             (
151                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
152                 size :      $c.ArrayNum
153             ),
154            ")"
155         )
156     )
157  
158     stringview
159     (
160         #(
161            "[",
162             $c.ArrayNum ,
163            "](",
164         
165             #array
166             (
167                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
168                 size :      $c.ArrayNum
169             ),
170            ")"
171         )
172     )
173}
174
175; Unreal格式的数组
176TArray<*>{
177     children
178     (
179         #array
180         (
181             expr :     (($T1*)($c.Data))[$i], 
182             size :     $c.ArrayNum
183         )
184     )
185
186     preview
187     (
188         #(
189            "[",
190             $c.ArrayNum ,
191            "](",
192         
193             #array
194             (
195                 expr : (($T1*)($c.Data))[$i], 
196                 size : $c.ArrayNum
197             ),
198            ")"
199         )
200     )
201}
202
203; Unreal格式的数组
204TArrayNoInit<*>{
205     children
206     (
207         #array
208         (
209             expr :     (($T1*)($c.Data))[$i], 
210             size :     $c.ArrayNum
211         )
212     )
213
214     preview
215     (
216         #(
217            "[",
218             $c.ArrayNum ,
219            "](",
220         
221             #array
222             (
223                 expr : (($T1*)($c.Data))[$i], 
224                 size :      $c.ArrayNum
225             ),
226            ")"
227         )
228     )
229}
230
231; Unreal的FName
232FName{
233     preview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name,su])
234         stringview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name])
235}
236; Unreal的FString
237FString{
238     preview([$c.Data,su])
239         stringview([$c.Data,su])
240}
241
242; Unreal的FString
243FStringNoInit{
244     preview([$c.Data,su])
245         stringview([$c.Data,su])
246}
247; Unreal的UObject
248UObject{
249     preview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name,su])
250         stringview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name])
251}
252
253; Unreal的TMap
254TMap<*,*>{
255     preview(#("size=",[$c.Pairs.ArrayNum,u]))
256}

然后就可以在调试中尽情查看以上自定义数据类型的值了。

显示效果如下:

Tips显示方式

快速监视显示