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に修正してくれます。
-
別件ですが、UniRxを使っていて.NETを4.6にすると
IObservable
が競合します。ScriptingDefineSymbols
にENABLE_MONO_BLEEDING_EDGE_EDITOR
とENABLE_MONO_BLEEDING_EDGE_STANDALONE
を足すと直ります。こっちはUnityでのビルドができなくなるのでより深刻。 ↩