开发手札:unity+vscode联合开发

        一般我们做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左边的那个/)

       vscode调试unity:

       安装启用Debugger For Unity后,直接点击BUG爬虫

       

       点击创建lanuch.json

      

       点击Debugger For Unity

      

       然后点击左上角play-UnityEditor

     

      打一个断点运行就可以看到效果,调试操作和vs一样F5 F10:

    

    

     自动刷新编译的问题:

     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。

    

 

Guess you like

Origin blog.csdn.net/yinhun2012/article/details/108758234