如果这是易于搜索的内容,我很抱歉,但我不确定正确的搜索字词是什么。
我现在正在使用Visual Studio,主要用于Unity开发。在创建新脚本时,我经常声明一些私有成员变量,如下所示:
private Rigidbody _rigidbody;
private SomeOtherComponent _myComponent;
为了初始化这些变量,我需要在一个名为“Start”的函数中添加一个GetComponent调用,如下所示:
void Start(){
_rigidbody = GetComponent<Rigidbody>();
_myComponent = GetComponent<SomeOtherComponent>();
}
现在,我找到了一个Visual Studio片段来快速输入“GetComponent”部分,这很不错,但我正在寻找一种在Start函数中自动生成代码行的方法。在一个理想的世界里,我可以输入
private Rigidbody _rigidbody;
然后我可以点击一些键组合,它会自动添加
_rigidbody = GetComponent<Rigidbody>();
到开始功能。
片段只让我到了一半。我需要做什么才能为Visual Studio创建这种类型的扩展?这难以实现吗?
答案 0 :(得分:1)
您可以尝试我的Visual Commander扩展名,该扩展程序专为此类轻量级扩展性而设计。它允许将文档编辑为文本或使用Visual Studio代码模型和Roslyn。
例如,当插入符号位于变量声明中的_rigidbody或_myComponent时调用以下命令:
public class C : VisualCommanderExt.ICommand
{
public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
{
this.DTE = DTE;
EnvDTE.CodeVariable v = FindCurrentVariable();
if (v != null)
{
string initialization = v.Name + " = GetComponent<" + v.Type.CodeType.Name + ">();";
AddLine(FindFunction("Start"), initialization);
}
}
EnvDTE.CodeFunction FindFunction(string name)
{
EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
return null;
EnvDTE.CodeClass codeClass = ts.ActivePoint.CodeElement[EnvDTE.vsCMElement.vsCMElementClass]
as EnvDTE.CodeClass;
if (codeClass == null)
return null;
foreach (EnvDTE.CodeElement elem in codeClass.Members)
{
if (elem.Kind == EnvDTE.vsCMElement.vsCMElementFunction && elem.Name == name)
return elem as EnvDTE.CodeFunction;
}
return null;
}
EnvDTE.CodeVariable FindCurrentVariable()
{
EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
return null;
return ts.ActivePoint.CodeElement[EnvDTE.vsCMElement.vsCMElementVariable]
as EnvDTE.CodeVariable;
}
void AddLine(EnvDTE.CodeFunction f, string text)
{
EnvDTE.TextPoint tp = f.GetStartPoint(EnvDTE.vsCMPart.vsCMPartBody);
EnvDTE.EditPoint p = tp.CreateEditPoint();
p.Insert(text + System.Environment.NewLine);
p.SmartFormat(tp);
}
EnvDTE80.DTE2 DTE;
}