Unity

Unity 2017で.NET4.6選択時にVisual Studio上で出るエラーを消す方法

:warning: Unity2018では、下記の対応は必要ありません


Unity2017では.NET4.6が選べるようになっていますが、現在(2017/8/30) Visual Studioのプロジェクトファイル生成に問題があり、.NET4.6にしてもC#6.0が使えなかったり、IDE上で大量のエラーが出たりします。

原因はcsprojの内容にあります。



  • LangVersionが4なのでC#6.0を書くとエラーになる (6になっていてほしい)


  • TargetFrameworkVersionが3.5なのでIObservableが見つからないなどのエラーが出る(特にUniRxを使っているとき1)

いずれもIDE上の問題でありUnityでのビルドには影響ありませんが、

波線が目障り、Unityにアタッチができないなど、開発に支障があります。

"試験的"が取れるまで待てばいいのですが、早くC#6を書きたいので、

プロジェクト生成のフックで無理やり直しました。


ProjectFileGenerationFix.cs

using SyntaxTree.VisualStudio.Unity.Bridge;

using System.IO;
using System.Text;
using System.Xml.Linq;
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class ProjectFileGenerationFix
{
class UTF8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}

static string XDocumentToUTF8String(XDocument document)
{
var writer = new UTF8StringWriter();
document.Save(writer);
return writer.ToString();
}

static ProjectFileGenerationFix()
{
if (PlayerSettings.GetApiCompatibilityLevel(BuildTargetGroup.Standalone) == ApiCompatibilityLevel.NET_4_6)
{
ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
{
if (!name.EndsWith(".csproj"))
{
return content;
}

var document = XDocument.Parse(content);

var ns = (XNamespace)"http://schemas.microsoft.com/developer/msbuild/2003";
var propGroup = document.Root.Element(ns + "PropertyGroup");

propGroup.Element(ns + "LangVersion").SetValue(6);
propGroup.Element(ns + "TargetFrameworkVersion").SetValue("v4.6");
propGroup.Element(ns + "TargetFrameworkProfile").Remove();

Debug.Log(name + ": 'LangVersion' is set to '6'.");
Debug.Log(name + ": 'TargetFrameworkVersion' is set to 'v4.6'.");
Debug.Log(name + ": 'TargetFrameworkProfile' is removed.");

return XDocumentToUTF8String(document);
};
}
}
}


このスクリプトをエディタ拡張としてAsset/Editor等に入れておくと、csprojが生成される時にLangVersionを6に、TargetFrameworkVersionを4.6に修正してくれます。





  1. 別件ですが、UniRxを使っていて.NETを4.6にするとIObservableが競合します。ScriptingDefineSymbolsENABLE_MONO_BLEEDING_EDGE_EDITORENABLE_MONO_BLEEDING_EDGE_STANDALONEを足すと直ります。こっちはUnityでのビルドができなくなるのでより深刻。