LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-29

: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でのビルドができなくなるのでより深刻。 

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6