[Guest Post]使用更好地重构Unity项目。NET分析器
这篇文章由特邀博客写手Shreya Pandit撰写,她是Visual Studio Tools for Unity团队的实习生,团队代表她发布了这篇文章。
我叫Shreya Pandit,是麻省理工学院计算机科学和认知科学专业的本科生。在过去的一个月里,我有了一个难以置信的机会在团结工具团队实习。我专门从事于Microsoft Analyzers for Unity项目,这是GitHub上的一个开源项目。此项目为Unity中的开发人员提供代码建议并抑制警告,以提高代码正确性和性能。在开始实习时,我掌握了C#和Unity的基本知识,最初的重点是熟悉语言和游戏环境。然后,我准备将注意力转移到Analyzer项目上,在该项目中,我将基于社区建议在GitHub存储库中。
项目概述
微软Unity分析器项目旨在为开发人员提供Unity特定的建议,以改进他们的代码。此工具通过功能强大的IDE Visual Studio提供,并依赖于。NET编译器平台,罗斯林编译器在开发人员编程时使用API检查和分析代码,这对检查语法和语义很有用。添加新的分析器使Roslyn能够检查特定的代码模式,如果检测到,它将建议使用分析器指定的代码修复。例如,其中一个分析器标识为空单一行为
方法,例如开始()
,并建议删除该方法以提高代码效率。![在Visual Studio中显示Unity重构的动画](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAA4AQMAAAAxYM+bAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEElEQVQokWNgGAWjYBTAAAADEAABC3uRhAAAAABJRU5ErkJggg==)
示例:创建新分析器
在实习期间,我创建了各种分析器来检测不同的代码模式。我将浏览我最近添加的一个分析程序,该分析程序用于分解过程,并在此过程中提供提示。
确定问题和解决方案
我添加的一个分析器来自社区建议在GitHub存储库中。它通过最小化Unity类“transform”的访问次数来提高代码性能。目标是替换代码分配,例如:
transform.position=新位置;transform.rrotation=新旋转;
具有:
转换。设置位置和旋转(newPosition,newRotation);
项目设置
项目存储库提供了一个易于遵循的自述文件设置项目。下载适当的包后,通过以下部分标题为新分析器生成文件:“创建新分析器”。所需要的只是一个描述性的标题,在这个例子中,我命名了分析器设置位置和旋转
.
检测代码模式
一旦创建了新的分析器,我发现在测试文件中创建几个测试用例是最容易的。这确保了分析器找到了通用模式,而不是单个特定案例。接下来,我想创建一个能够检测问题中标识的代码模式的方法。对于这个示例,我查找了两条指定了新位置和新旋转的连续线。
Windows中的Visual Studio提供了一个称为语法可视化工具。该窗口允许用户打开任何C#代码文件,并检查从类声明到方法操作的当前工作树。要查找此窗口,请转到查看/其他窗口/语法可视化工具。下面是可视化工具中显示的语法树的示例。
![显示Visual Studio中语法树的屏幕截图](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAcAQMAAACtXYi7AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAADklEQVQYlWNgGAWDAQAAAYgAAfkpKZAAAAAASUVORK5CYII=)
基于语法树,我需要检测赋值表达式的两个后续表达式语句,其中一个访问变换的位置属性,另一个访问旋转属性。我通过运行测试用例并检查意外的诊断错误来测试代码模式的分析。
建议代码修复
语法可视化器同样可以用于理解目标表达式的语法。我首先使用适当的语法构造新行,并能够替换和删除最初检测到的节点。这方面的代码可以在下面看到,并可以在分析仪的GitHub上的文件.
var调用=调用表达式(成员访问表达式(句法类型。SimpleMemberAccessExpression,baseExpression,标识符名称(“设置位置和旋转”).WithArgumentList(argList).有领先的琐事(琐事);var documentEditor=等待documentEditor。CreateAsync(document,cancellationToken);文档编辑器。RemoveNode(assignmentExpression.Parent,SyntaxRemoveOptions.KeepNoTrivia);文档编辑器。ReplaceNode(nextAssignmentExpression,调用);return documentEditor。获取更改文档();
当代码修复正确完成时,所有测试用例都应该通过。
提交拉取请求
在完成这些步骤并添加文档之后,分析器就可以进行检查并合并到代码库中了。提交拉请求并检查最终分析仪。这里有一个链接到我的公关,以及下面的设置位置和旋转分析器的示例。
![显示Visual Studio中正在使用的已完成重构的屏幕截图。](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABDAQMAAABQhTKZAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEUlEQVQokWNgGAWjYBQMfgAAA6oAARZ9cesAAAAASUVORK5CYII=)
为项目做出贡献
在过去的几周里,我真的很喜欢与这个团队一起进行微软Unity分析器项目。即使在Unity和C#方面知识有限,我也很快适应了环境,并开始创建新的分析器和抑制器。对于具有不同编码背景的人来说,这是一个非常独立的项目。如果你想了解更多关于VisualStudio和Unity的信息,或者想为开源项目做贡献,那么创建一个分析器需要一个低门槛,才能产生高影响。在这个过程中我学到了很多,我想特别感谢我的经理JB Evain和团队其他成员对我的支持。我相信他们会感谢您的建议和公关意见,以继续改善Unity的开发人员体验。
访问GitHub存储库开始吧!