Unity5项目无法在外部Visual Studio版本(2017)的Windows PC Standalone中构建。

3

虽然这与编程只有遥远的关系,但它在这里:

自上周以来,我一直在使用 Unity (5.6.0f3 Community x64)Win 10 (x64) 上玩耍 - 使用 Visual Studio (2017 Community) 作为附加编辑器,因为 Unity “需要”,并从[Unity]: Tutorials(第一个)开始。几天内一切都很顺利,但是后来,构建为PC Standalone目标时停止工作。搜索谷歌并检查论坛没有帮助找到有关此确切行为的信息:

PC Standalone build

如图所示,在“构建设置”对话框中(移至右侧),没有(“目标平台”或“架构”)组合框可用于指定构建参数。错误在左侧。

(关于当前行为的说明):

  • 第一个猜测是教程项目出了问题,因此我从头开始创建了一个新项目(一个包含一个“球体”,附加了一个“刚体”和一个基于用户输入应用力的“C#”脚本的虚拟/简单项目),但它的行为相同(这是上面图像中的项目构建输出)
  • WebGL构建运行得非常好(在浏览器中加载);这是当前使用的解决方法,但它需要很长时间才能完成
  • Play(显然)也可以工作(不用说事情在VStudio中是OK的,没有来自csc的抱怨),!但!在尝试(并失败)构建之后,Play就再也不能工作了(重新加载项目是唯一的修复方法)
为了排除任何可能的疑虑,这里是一个 DownloadAssistant 的截图:

Download Assistant

我会尽力为您翻译中文,以下是需要翻译的内容:

一切都已经检查完毕,有两个项目(与此案件不太相关)没有显示出来(因为窗口大小不可调整),但它们已经被勾选(并且已经安装)。

背景信息

  • 第一次安装Unity时,计算机上没有VStudio 2017版本,因此它(Community Edition)作为Unity安装过程的一部分被安装(我记得助手中有至少一个与VStudio相关的组合框)
  • 然后,一个VStudio补丁可用;在准备安装它时,我意识到VStudio安装在默认路径(%SYSTEMDRIVE%上),这对我来说不起作用,因为它是一个很大的产品,所以:
    • 卸载它
    • 直接从[VisualStudio]: Visual Studio Downloads下载并安装到另一个驱动器上(是的,我知道更改安装路径仍会在%SYSTEMDRIVE%上安装相当大的部分,例如Windows SDK
    • 由于我认为上述两个步骤将打破Unity和新VStudio之间的链接,因此我也重新安装了Unity。这一次,在Assistant中没有VStudio相关的复选框(检查是否已安装它需要安装的任何软件似乎是正常的1)。后来,我还发现了一个持久的RegValue(意味着在Unity卸载时不会被清除)(HKEY_CURRENT_USER\SOFTWARE\Unity Technologies\Installer\Select_VisualStudio)其值为0(与同一键下值为1的其他值相对)
  • 之后,我多次重新安装Unity,包括在卸载/安装之间重新启动计算机(不需要),但没有结果(在启动Assistant之前启用上述RegVaue是一种试探)
一些调试揭示,尝试构建(PC Standalone)时,Unity会执行类似以下操作的操作(不要介意路径,这是我的机器上的方式),可以从cmdline重现:

build_win.bat:

"E:\Install\x64\Unity\5.6.0f3\Editor\Data\MonoBleedingEdge\bin\mono.exe" "E:\Install\x64\Unity\5.6.0f3\Editor\Data\MonoBleedingEdge\lib\mono\4.5\mcs.exe" "@args-win.txt"

args_win.txt:

-debug
-target:library
-nowarn:0169
-langversion:4
-out:Temp/Assembly-CSharp.dll
-unsafe
-optimize
-r:E:/Install/x64/Unity/5.6.0f3/Editor/Data/UnityExtensions/Unity/GUISystem/Standalone/UnityEngine.UI.dll
-r:E:/Install/x64/Unity/5.6.0f3/Editor/Data/UnityExtensions/Unity/Networking/Standalone/UnityEngine.Networking.dll
-r:E:/Install/x64/Unity/5.6.0f3/Editor/Data/UnityExtensions/Unity/UnityAnalytics/UnityEngine.Analytics.dll
-define:UNITY_5_3_OR_NEWER
-define:UNITY_5_4_OR_NEWER
-define:UNITY_5_5_OR_NEWER
-define:UNITY_5_6_OR_NEWER
-define:UNITY_5_6_0
-define:UNITY_5_6
-define:UNITY_5
-define:UNITY_ANALYTICS
-define:ENABLE_AUDIO
-define:ENABLE_CACHING
-define:ENABLE_CLOTH
-define:ENABLE_DUCK_TYPING
-define:ENABLE_GENERICS
-define:ENABLE_PVR_GI
-define:ENABLE_MICROPHONE
-define:ENABLE_MULTIPLE_DISPLAYS
-define:ENABLE_PHYSICS
-define:ENABLE_RUNTIME_NAVMESH_BUILDING
-define:ENABLE_SPRITERENDERER_FLIPPING
-define:ENABLE_SPRITES
-define:ENABLE_TERRAIN
-define:ENABLE_RAKNET
-define:ENABLE_UNET
-define:ENABLE_LZMA
-define:ENABLE_UNITYEVENTS
-define:ENABLE_WEBCAM
-define:ENABLE_WWW
-define:ENABLE_CLOUD_SERVICES_COLLAB
-define:ENABLE_CLOUD_SERVICES_ADS
-define:ENABLE_CLOUD_HUB
-define:ENABLE_CLOUD_PROJECT_ID
-define:ENABLE_CLOUD_SERVICES_UNET
-define:ENABLE_CLOUD_SERVICES_BUILD
-define:ENABLE_CLOUD_LICENSE
-define:ENABLE_EDITOR_METRICS
-define:ENABLE_EDITOR_METRICS_CACHING
-define:ENABLE_NATIVE_ARRAY
-define:INCLUDE_DYNAMIC_GI
-define:INCLUDE_GI
-define:PLATFORM_SUPPORTS_MONO
-define:RENDER_SOFTWARE_CURSOR
-define:INCLUDE_PUBNUB
-define:ENABLE_PLAYMODE_TESTS_RUNNER
-define:ENABLE_SCRIPTING_NEW_CSHARP_COMPILER
-define:ENABLE_VIDEO
-define:UNITY_STANDALONE_WIN
-define:UNITY_STANDALONE
-define:ENABLE_SUBSTANCE
-define:ENABLE_RUNTIME_GI
-define:ENABLE_MOVIES
-define:ENABLE_NETWORK
-define:ENABLE_CRUNCH_TEXTURE_COMPRESSION
-define:ENABLE_UNITYWEBREQUEST
-define:ENABLE_CLOUD_SERVICES
-define:ENABLE_CLOUD_SERVICES_ANALYTICS
-define:ENABLE_CLOUD_SERVICES_PURCHASING
-define:ENABLE_CLOUD_SERVICES_CRASH_REPORTING
-define:ENABLE_EVENT_QUEUE
-define:ENABLE_CLUSTERINPUT
-define:ENABLE_VR
-define:ENABLE_WEBSOCKET_HOST
-define:ENABLE_MONO
-define:NET_2_0_SUBSET
Assets/_Scripts/x.cs
-r:E:\Install\x64\Unity\5.6.0f3\Editor\Data\Mono\lib\mono\unity\System.Runtime.Serialization.dll
-r:E:\Install\x64\Unity\5.6.0f3\Editor\Data\Mono\lib\mono\unity\System.Xml.Linq.dll
-r:E:\Install\x64\Unity\5.6.0f3\Editor\Data\Mono\lib\mono\unity\UnityScript.dll
-r:E:\Install\x64\Unity\5.6.0f3\Editor\Data\Mono\lib\mono\unity\UnityScript.Lang.dll
-r:E:\Install\x64\Unity\5.6.0f3\Editor\Data\Mono\lib\mono\unity\Boo.Lang.dll
-sdk:unity

args_win.txt 是一个 ${PROJECT_ROOT}\Temp\UnityTempFile-* 文件的副本(我将这样的文件称为 utfile),更准确地说,是在构建开始时创建的那个。有趣的是,它是从另一个(在项目加载时创建的10多个相同的 utfile 之一)utfile 中通过去除(和混淆(amestecating))某些行来创建的。(没有进行彻底检查,可能还有其他行)。

显而易见的是(甚至不需要检查源 utfile):-r:E:/Install/x64/Unity/5.6.0f3/Editor/Data/Managed/UnityEngine.dll,将其插入上述文件中,可以完美地工作。但我不知道如何指示 Unity 不要去除它。

其他事实(更或者不太相关):

  • 已安装了其他几个 VStudio 版本(201020132015),以及更多的 VCRedist,但我严重怀疑这些都不会有任何影响,因为 VStudio 仅用于编辑(例如,在双击脚本时由 Unity 启动)
  • 我的电脑也“遭受” [BT]: 您的 Windows 10 开始菜单停止工作了吗?如何修复(我每周重新启动一次;约 3-4 天后问题重新出现),但在安装 Unity 几周前就发生了这种情况

可能的解决方案

  • 卸载UnityVStudio,并恢复原始设置(如果仍然有效)- 不可取
  • 得到答案(在这里或Unity论坛上,在那里我将立即发布相同的问题),并希望深入了解问题的根源
  • 开始痛苦的调试/监视过程([MS.Docs]: Process Monitor(ProcMon) 是一款出色的工具),也可能涉及反汇编 UnityDownloadAssistant-5.6.0f3.exe,但不能保证会产生(有利)结果。无论如何,我认为以下内容存在(暂时隐藏)链接:
    • VStudio复选框在Assistant中不存在,当VStudio已安装时
    • PC Standalone缺少构建参数组合框
    • 在构建时剥离UnityEngine.dll依赖项
  • 修复这个问题的可能工作计划/算法是(只是理论):
    • 调试Assistant,并识别查询VStudio安装状态的资源(注册表值、文件等...)
    • 调整该资源,使Assistant“认为”VStudio未安装;这将触发VStudio安装程序(并使Assistant“标记”此安装适用于PC Standalone构建),该程序将检测到以前的安装(当然,在此之前,需要取消调整资源(如果相同)),并失败(另一个长枪手在这里是Assistant不检查返回代码)
    • Assistant完成,希望一切顺利

欢迎任何想法。

附注1(与问题无关):在卸载/安装Unity时,我注意到了一些问题;如果这是“社区版”特有的问题,我可以(有点)理解,但如果不是,那么这是一个相当糟糕的错误/行为:

  • 已安装Unity(完全按照上述方式)
  • 运行Assistant,并且不要更改以前安装的任何内容(我上面提到的父RegKey的RegValue默认情况下确保了这一点)。 它将:
    • 下载(并覆盖?)任何子包(例如UnitySetup-Linux-Support-for-Editor-5.6.0f3.exe,FacebookGamesArcade.msi等);对我来说,它是~3GB+(即使文件已经存在)
    • 运行每个指定的(“已选中的”)pkg /文件
    • 在安装之前删除(UnitySetup64.exe)任何现有的安装(???)

你的脚本顶部是否有 using UnityEngine; - Draco18s no longer trusts SE
@Daco18s 当然。这个脚本在语法上是正确的,否则它就无法播放/构建,并且在_VStudio_中会显示为“红色”。 - CristiFati
只是检查一下,因为这是我想到的第一件事。非常奇怪。 - Draco18s no longer trusts SE
2个回答

1

长话短说

显然,没有一个简单的解决方案(或者至少我找不到),所以我开始了卸载/重新安装UnityVStudio的“极具挑战性”的过程(在卸载后重新启动 - 确保没有任何“隐藏”的操作悬而未决)。

我首先看了一下Assistant在幕后做了什么,通过指定自定义下载路径,如下图所示:

Assistant custom paths

注意:由于我更改了安装路径(既然我必须重新安装产品,为什么不利用一下呢?),因此安装路径与问题中的略有不同,但这些更改并不重要。
在指定的文件夹中,有一堆(~3GB+)已下载的文件(可执行文件),以及一个批处理脚本,它是“Assistant”的命令行等效物。

install.bat:

REM Run this script to automatically install or reinstall all packages,
REM as it's performed by the Unity Download Assistant.
REM Needs to be run with superuser permissions.

"UnitySetup64.exe" -UI=reduced /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnityDocumentationSetup.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnityStandardAssetsSetup.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnityExampleProjectSetup.exe" /S
"vs_Community.exe" --productId "Microsoft.VisualStudio.Product.Community" --add "Microsoft.VisualStudio.Workload.ManagedGame" --campaign "Unity3d_Unity" --passive
msiexec.exe /i "FacebookGamesArcade.msi" /qr LAUNCHEXE=FALSE
"UnitySetup-Android-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-iOS-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-AppleTV-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Linux-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Mac-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Metro-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-UWP-IL2CPP-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Samsung-TV-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Tizen-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-WebGL-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3
"UnitySetup-Facebook-Games-Support-for-Editor-5.6.0f3.exe" /S /D=e:\Install\x64\Unity\Community\5.6.0f3

我注意到的是与VStudio相关的内容:

"vs_Community.exe" --productId "Microsoft.VisualStudio.Product.Community" --add "Microsoft.VisualStudio.Workload.ManagedGame" --campaign "Unity3d_Unity" --passive

作为(某些)启动器参数对我来说不是很清楚,所以我查了一下:[MS.Docs]: 使用命令行参数安装 Visual Studio 2017。因此,我通过命令行启动它(不使用--passive以获取选择哪些功能的机会),我认为我已经做到了:如下图所示选择了使用Unity进行游戏开发(之前,在我“正常”安装VStudio时,我没有勾选该框)。

Unity selection

但是行为是相同的!!!

注释:

  • 如果您选择安装此选项(并自己安装Unity),请确保取消勾选Unity editor,以避免重复安装。
  • 后来我发现(当然是通过重新安装),勾选/取消勾选使用Unity进行游戏开发完全没有影响。
  • 而且,VStudio未安装在其默认路径上(有一段时间我变得偏执,认为可能存在一些VStudio硬编码路径在Unity文件中)并不是原因。

我接下来做的一步是重新创建初始场景(它曾经工作过的场景):

  • 使用“我的”初始选项安装VStudio(例如,未选中使用Unity进行游戏开发)
  • 使用默认选项安装Unity-在安装之前删除其RegKey(我在问题中提到)

它起作用了!!!

然后我知道其中一个Unity组件正在干扰我的设置,所以在基本安装(从install.bat到vs_Community.exe的内容)的基础上,我逐个安装所有其他选项,并在每个组件安装后检查是否能够进行PC Standalone构建,以及...
短故事
结果发现,Facebook Gameroom Build Support(如Assistant中所示)是我所有问题的根源。因此,另一个干净的安装(包括VStudio和Unity)(不包括Facebook构建支持)运行得很好。
现在,调查才进行了一半,我仍需要找出为什么会发生这种情况,但我要在这里停止。如果将来需要为Facebook构建,则必须解决问题并使其正常工作,但目前不需要。请注意,对于我的(新手)目的而言,独立PC,因为当前我在Win上)版本已足够(也许还有WebGL来测试浏览器),但我安装了所有其他版本以防我想玩玩。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接