一般我们做unity c#开发基本使用vs,也就是visual studio,写shader使用vscode,这套黄金组合目前应该算是最完美的。不过最近因为项目同时涉及window桌面开发和DLL嵌入(我职业生涯还是桌面开发为主,我当年刚入行就是winform+js),导致我unity工程csproj关联非常多,整个unity编辑器和vs2019操作起来巨卡,目前除了卸载csproj能解决之外别无他法,但是卸载了csproj,我编译的时候又要加载csproj,很麻烦。
所以我就把vscode环境配起来了,直接用vscode编写unity c#脚本。
安装配置插件如下:
基本上安装成功启用后,首次通过unity打开vscode就会自动下载配置所需要的文件和程序集,之后我们写unity c#就有自动补全,和vs一样。
常用vscode快捷键操作:
1.Alt+Shift+F c#代码格式化排版 (vs是自动格式化)
也可以在设置里面设置ctrl+s自动格式化
2.F2 c#代码字段重命名(vs是Ctrl+RR)
3.CTRL+/ c#代码块注释(右shift左边的那个/)
4.F12 api转到定义
5.ALT+← 工作区段回跳
vscode调试unity:
安装启用Debugger For Unity后,直接点击BUG爬虫
点击创建lanuch.json
点击Debugger For Unity
如果看不到Debugger For Unity
需要将Debugger For Unity添加到工作区
然后点击左上角play-UnityEditor
打一个断点运行就可以看到效果,调试操作和vs一样F5 F10 F11:
自动刷新编译的问题:
vs2019我们可以设置后台Ctrl+S自动刷新并且编译,如图:
设置为True之后我们每次ctrl+s就会编译,免得我们每次切换到unityeditor就要“转菊花”。
vscode这个功能我没找到,所以这一点比较麻烦,我写了一个隔一段时间自动刷新的脚本,但是脚本有潜在风险:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class EditorAutoRefreshScripts : EditorWindow {
private string refreshTimeString = "5";
private float refreshTimeFloat = 5;
private float refreshElapse = 0f;
private bool refreshEnable = true;
private int refreshTimes = 0;
private string refreshScriptsDirectory = @"D:\Github\ShaderSamples\ShaderSamples\Assets\Scripts";
[MenuItem ("SelfTools/打开自动刷新脚本")]
static public void execute () {
Rect wr = new Rect (0, 0, 400, 300);
EditorAutoRefreshScripts window = (EditorAutoRefreshScripts) EditorWindow.GetWindowWithRect (typeof (EditorAutoRefreshScripts), wr, true, "自动刷新脚本");
window.Show ();
}
private void OnGUI () {
GUILayout.Label ("时间设置为秒");
refreshTimeString = EditorGUILayout.TextField (refreshTimeString);
if (GUILayout.Button ("更新时间")) {
if (float.TryParse (refreshTimeString, out refreshTimeFloat)) {
refreshElapse = 0f;
refreshEnable = true;
this.ShowNotification (new GUIContent ("设置时间为更新成功"));
} else {
this.ShowNotification (new GUIContent ("设置时间为秒,设置错误"));
refreshEnable = false;
}
}
GUILayout.Label (string.Format ("刷新次数{0}", refreshTimes));
}
void Update () {
if (refreshEnable) {
float refreshInterval = Time.realtimeSinceStartup - refreshElapse;
if (refreshInterval > refreshTimeFloat) {
refreshElapse = Time.realtimeSinceStartup;
refreshTimes++;
Debug.LogFormat ("刷新一次:{0}", System.DateTime.Now.ToString ("yyMMdd-hhMMss-fff"));
AssetDatabase.Refresh();
//DirectoryInfo dirinfo = new DirectoryInfo (refreshScriptsDirectory);
//RecusRefreshFiles (dirinfo); //没有效果
}
}
}
private void RecusRefreshFiles (DirectoryInfo dirinfo) {
FileInfo[] files = dirinfo.GetFiles ();
if (files != null) {
for (int i = 0; i < files.Length; i++) {
files[i].Refresh ();
}
}
DirectoryInfo[] dirs = dirinfo.GetDirectories ();
if (dirs != null) {
for (int i = 0; i < dirs.Length; i++) {
RecusRefreshFiles (dirs[i]);
}
}
}
}
核心就是隔5秒就刷新一下AssetDataBase,这就是风险所在,我原本只想刷新我单个脚本,或者说脚本总目录,但是c#Directory递归Refresh无法关联Unity的资源刷新检测,所以这下只能刷新全体Assets了,如果我有一个Assets不想保存,结果就被自动保存了,所以这个脚本慎用。
好了,差不多勉强能达到vs写调C#的感觉,当然我个人还是更喜欢vs。