智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在Visual Studio调试器中显示Unreal的数据类型的值

Posted on   Bill Yuan  阅读(632)  评论(0编辑  收藏  举报

转自:https://blog.csdn.net/witton/article/details/5977766

 

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

      经过研究,笔者实现了FColor,FNameEntry,FString的直接显示,但是对于FName的显示,通过调整FName的代码,也实现了其调试显示的需求。

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

 

    VS2010中的方法如下:

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

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

在[Visualizer]下添加如下脚本:然后就可以在调试中尽情查看以上自定义数据类型的值了。

复制代码
; Unreal格式的数组  
TArray<FString>{  
     children  
     (  
         #array  
         (  
             expr :    ((FString*)($c.Data))[$i],  
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FString*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
      
     stringview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FString*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
TArrayNoInit<FString>{  
     children  
     (  
         #array  
         (  
             expr :    ((FString*)($c.Data))[$i],  
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FString*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
      
     stringview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FString*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
; Unreal格式的数组  
TArray<FStringNoInit>{  
     children  
     (  
         #array  
         (  
             expr :    ((FStringNoInit*)($c.Data))[$i],  
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
      
     stringview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
TArrayNoInit<FStringNoInit>{  
     children  
     (  
         #array  
         (  
             expr :    ((FStringNoInit*)($c.Data))[$i],  
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
      
     stringview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],  
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
; Unreal格式的数组  
TArray<*>{  
     children  
     (  
         #array  
         (  
             expr :     (($T1*)($c.Data))[$i],   
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr : (($T1*)($c.Data))[$i],   
                 size : $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
; Unreal格式的数组  
TArrayNoInit<*>{  
     children  
     (  
         #array  
         (  
             expr :     (($T1*)($c.Data))[$i],   
             size :     $c.ArrayNum  
         )  
     )  
     
     preview  
     (  
         #(  
            "[",  
             $c.ArrayNum ,  
            "](",  
             
             #array  
             (  
                 expr : (($T1*)($c.Data))[$i],   
                 size :      $c.ArrayNum  
             ),  
            ")"  
         )  
     )  
}  
  
; Unreal的FName  
FName{  
     preview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name,su])  
         stringview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name])  
}  
; Unreal的FString  
FString{  
     preview([$c.Data,su])  
         stringview([$c.Data,su])  
}  
  
; Unreal的FString  
FStringNoInit{  
     preview([$c.Data,su])  
         stringview([$c.Data,su])  
}  
; Unreal的UObject  
UObject{  
     preview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name,su])  
         stringview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name])  
}  
  
; Unreal的TMap  
TMap<*,*>{  
     preview(#("size=",[$c.Pairs.ArrayNum,u]))  
}  
复制代码

 

显示效果如下:

 

Tips显示方式

 

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示