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

您所在的位置:网站首页 unity开发配置 开发手札:unity+vscode联合开发

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

2023-09-07 10:54| 来源: 网络整理| 查看: 265

        一般我们做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。

    



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3