目前【暂时】解决了问题,整个过程扑朔迷离到以至于我不知道如何去形容这次遇见的情况。 搜遍全网,国内目前没有可以解决这个问题的博客。有可能仅使用于我自己的情况。 外网unity社区也有相关的问题 遗憾的是,这个问题提出一年多了,仍然没有确切的解决方法。也许只在少数人的电脑上会出现这样的情况。
版本
Visual Studio Community 2022, Unity 2022.1.18f1c1(事实上2021版本也出现了这样的情况)
出现的问题
这里可以确保环境和组件没有任何问题。 点击VS中的附加到Unity,经过短暂的等待后,没有发生任何事情。下面出现这样的提示 目标计算机积极拒绝,无法连接。(VS2019甚至不会出现这样的提示。升级到2022后我才排除了VS的问题) 理论上,56800端口应该是Unity进程应该开启监听的端口,我使用netstat查找后并没有发现有这个端口
最诡异的事情是,这种情况是概率事件。在我几十上百次的尝试中,在外部条件相同的情况下,有时候仅仅是重启了unity,就能成功附加。这是最让人摸不着头脑的情况。 目前暂时得出结论,是Unity开启监听端口时出现了问题。理应开启的端口没有开启。
此外,偶尔会出现“操作无法完成。未指定的错误”的弹窗,原因不明
尝试过的办法
- 重启电脑——并不奏效
- 重启VS——经过数十次的重启后,事实证明对该问题没有任何的解决
- 重启Unity——重复打开同一个工程文件
在我多达几十次的尝试中,只有在某次刚开机的两次重启中能够成功让VS附加到unity,后面均失效。只有在极少数重启中(大概几十次出现一次吧),可以成功附加 - 重新安装VS——我曾重装过VS2019两次,并不奏效
- 升级VS——我将VS2019升级到VS2022,在第一次附加时成功附加,之后重试时仍然失败
- 重装Unity——从Unity2021升级到2022,并不奏效
- 关闭防火墙——检查了防火墙所有规则并关闭了所有防火墙,并不奏效
- 删除项目文件中的.vsconfig文件和.vs文件夹——完全不奏效
- 在Extern tool选项中重新定向VS,包括手动将其指向 devenv.exe——自欺欺人的做法,完全不奏效
- 关闭杀毒软件——不奏效
- 关闭其他应用程序——很难完全关闭所有应用程序,不能确定是不是这里出现了问题,但至少我关闭了很多程序,并不会解决问题。
- 重新创建一个Unity项目——仍然不能附加,因此排除了乱设置Unity项目配置的情况
- 重新构建VS解决方案——不奏效,目前基本排除VS出的问题
- 寻找所谓的Preference -> External Tools -> Editor Attaching选项,实际上这只有在unity2019以下的版本才有这个选项
- 删除我所有的 Unity Library/obj/log/temp 文件夹并重建整个项目——重建项目并不奏效
并没有选择重装系统或者重买电脑,这是我最后的倔强。
暂时解决的办法
提前说明一下,该方法并不能完全解决问题,只是将附加失败的概率从99%降低到了30%,仍然会出现一些我无法掌握的情况。很有可能在某次重启后,这个方法也不再奏效了。 这个方法来自于unity3D外网社区的一个帖子。
如图所示,将Edit->Preferences->External Tool 中的Generate .csproj files for中的复选框仅保留Player project,然后点击Regenerrate project files 重新构建文件,之后重启Unity即可。 另外,外网也有点击Regenerrate project files以重新构建项目就能解决的情况。在这里我的建议是,不管复选框 里你选了哪些选项,这个按钮你都得点击,并多次尝试。
值得一提的是,当允许VS附加到Unity时,我的Unity往往会发出如下警告:
至今没有查找到该警告的相关资料,但通常出现这个警告后我的VS才能附加到Unity中。 PS:后面又出现了一次没有警告也能附加的情况。我实在晕了。
接下来在VS中查看一下Unity实例。点击 调试->附加Unity调试程序:
可以看到Unity开放了56276端口. 使用端口查询指令,发现Unity开放了56276的TCP监听端口,现在一个VS实例与该端口建立通信,现在是正常的情况。 该方法有一定失败的可能性。如果附加仍然失败,将之前取消勾选的Generate .csproj files for中的选项选上,再次重新构建项目,重启unity,反复尝试即可。
总结&猜测
寻找解决方法至今寻找了三天,目前我也不敢说自己成功解决了问题。在写这篇博客的同时我仍在反复尝试,但仍然经常出现附加失败的情况。 这里仅做一个猜测:Unity在启动的时候会从56000往上的端口随机选取一个端口作为监听其他IDE调试的端口,有时候会遇到一些不可抗拒的因素导致端口开放失败,也许是进程占用,也许是操作系统的问题,也许是Unity内部的一些BUG。总之,Unity尝试打开一个端口失败,却把这个端口号传递给了VS,VS试图与这个端口进行连接,最后以失败告终。 重新构建项目和反复重启Unity的目的也许是让Unity反复尝试寻找到一个真正能打开的端口。 最后,在真正解决这个问题之前,如果某次VS成功附加上了Unity,那就尽量不要关掉Unity了,万一再也成功不了呢。
|