web-dev-qa-db-ja.com

Unity3Dプロジェクトでc#7機能を有効にする方法

Unity3Dプロジェクトで(Visual Studio 2017を使用して)新しいメソッドを作成しました。そのメソッドには、C#7以降が必要です。だから私は このガイド の指示に従いました。

ここで、プロジェクトのプロパティを開こうとすると、Visual Studioでプロジェクトが開きますが、開いた直後に突然閉じます。今ではプロジェクトのプロパティを開くことすらできません。

これはそれがどのように見えるかです:

gif

1番目と3番目のエラーが発生するのはなぜですか? (私がgifで示したもの)

7
Nadavs2310

[〜#〜]編集[〜#〜]

RoslynコンパイラがUnity 2018.3でサポートされるようになりました。これにより、最新のC#7機能を使用できるようになります。

参照: https://blogs.unity3d.com/2018/09/13/unity-2018-3-beta-get-early-access-now/


Unity3D <2018.3。*の場合

Unity3DプロジェクトでC#7.3を有効にした方法を説明します(ただし、その機能の一部はまだコンパイルできません)。ただし、注意してください。この方法はハックです。これは、UnityでのC#7の時期尚早で実験的な使用法です。

以下の手順に従うと、問題を簡単に追跡できる可能性があります。質問の場合、SOコミュニティに完全なMCVEを提供することは非常に難しいためです。 。しかし、実際に達成しようとしているのは、UnityでC#7を有効にすることであり、プロジェクトのプロパティウィンドウの奇妙なバグを解決することではないと思います。

続行する前に、Visual Studio 2017とUnity3Dを完全に再インストールすることをお勧めします。これは、不適切なインストールに関連する問題が発生していないことを確認するためです。最新バージョンを入手できるように、Viual Studioのインストーラーを使用するのではなく、常にUnityのWebページからUnityを直接ダウンロードしてください。

Unity 3DプロジェクトでC#7を有効にする(Unity3D v.2018.2.10f、VS 2017 v.15.8.5でテスト済み)

  1. まず、新しい空のプロジェクトを作成します。

  2. Edit -> Project Settings -> Playerに移動し、Other Settingsセクションを見つけて、Configuration/Scripting Runtime Versionの下で.NET 4.x Equivalentを選択します。

  3. Mcs.exeに、C#7の新しい「実験的」機能を使用してC#コードを処理するように指示します。そのためには、Assetsフォルダー内にファイルmcs.rspを作成するだけです。それを編集し、その中にこの行を書きます:

    -langversion:experimental
    
  4. 次に、Editorフォルダー内にAssetsという名前の新しいフォルダーを作成します。このフォルダーにスクリプトを追加すると、Unityは*.Editor.csprojプロジェクトファイルを作成します。このファイルには、Unityエディターの変更を目的としたスクリプトが含まれています。

  5. プロジェクトがC#7.3言語をサポートしていることをVisualStudioに通知する必要があります。これは、UnityがC#7.3のすべての機能をコンパイルできることを意味するわけではありませんが、少なくともVisual Studioは、実験的に使用しようとしている機能については気にしません。

    ただし、csprojファイルを直接編集すると、Unityはある時点で自動的に上書きします(Unityは常にプロジェクトファイルとソリューションファイルを自動生成します)。したがって、プロジェクトファイルが自動生成されるときに呼び出されるフックをインストールして、プロジェクトファイルを自分で開き、カスタマイズを追加することができます(カスタマイズは、言語バージョンの変更だけに限定されません。より多くのことを行うことができますが、ここで何をしているのかを理解する必要があります)。

    この目的のために、次のスクリプトをEditorフォルダー内に配置します。

    #if ENABLE_VSTU
    
    using SyntaxTree.VisualStudio.Unity.Bridge;
    using System;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    using UnityEditor;
    using UnityEngine;
    
    [InitializeOnLoad]
    public class ProjectFilesGeneration
    {
        private class Utf8StringWriter : StringWriter
        {
            public override Encoding Encoding
            {
                get { return Encoding.UTF8; }
            }
        }
    
        static ProjectFilesGeneration()
        {
            ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
            {
                // Ignore projects you do not want to edit here:
                if (name.EndsWith("Editor.csproj", StringComparison.InvariantCultureIgnoreCase)) return content;
    
                Debug.Log($"CUSTOMIZING PROJECT FILE: '{name}'");
    
                // Load csproj file:
                XNamespace ns = XNamespace.Get("http://schemas.Microsoft.com/developer/msbuild/2003");
                XDocument xml = XDocument.Parse(content);
    
                // Find all PropertyGroups with Condition defining a Configuration and a Platform:
                XElement[] nodes = xml.Descendants()
                    .Where(child =>
                        child.Name.LocalName == "PropertyGroup"
                        && (child.Attributes().FirstOrDefault(attr => attr.Name.LocalName == "Condition")?.Value.Contains("'$(Configuration)|$(Platform)'") ?? false)
                    )
                    .ToArray();
    
                // Add <LangVersion>7.3</LangVersion> to these PropertyGroups:
                foreach (XElement node in nodes)
                    node.Add(new XElement(ns + "LangVersion", "7.3"));
    
                // Write to the csproj file:
                using (Utf8StringWriter str = new Utf8StringWriter())
                {
                    xml.Save(str);
                    return str.ToString();
                }
            };
        }
    }
    
    #endif
    

プロジェクトファイルの変更点を完全に理解したい場合は、任意の差分ツールを使用して、以前のバージョンと新しいバージョンのcsprojファイルを比較します。上記のハックは、Unityがプロジェクトファイルを自動生成するたびに行うことを除いて、基本的に言語バージョンを変更するときに投稿したリンクと同様のことを行います。 Microsoftは、csprojファイル内の定義に関する多くのドキュメントも提供しています。

9

Unityを使用しているようです(投稿で言及しています)。幅が4ピクセルくらいなので、gifではわかりません。

実際にUnityを使用している場合は、C#7の機能をまだ使用できません。彼らはC#6の実験的なサポートのみを許可しました( ここ を参照)。

残念ながら、UnityでC#7を使用したい場合は運が悪いです

0
maccettura

プロパティウィンドウが開かないのは、Visual Studioのインストールに問題があるようです(これについてはあまりアドバイスできません)

コーディングエラーについては、別のメソッド内でメソッドを宣言しようとしているようです(これはかなり奇妙です)。

_void Update() {
    ...
    public void Method1();
}
_

想像それはあなたの意図ではありません。コンパイルしているC#のバージョンがそれをサポートしていないので不平を言っています(そしてC#7のローカルメソッドはどのような場合でもpublicとマークすることはできません)。また、メソッドが抽象(または外部)ではないが、C#で許可されていない本体がないため、不平を言っています。これはあなたが意味したことですか?

_void Update() {
    if (Input.GetKeyDown(KeyCode.R)) // Note no ; here!
    {
        GetComponent<Renderer>().material.color = Color.red;
    }
}

public void Method1() {
    // Some code
}
_

また、15行目のif ()ステートメントの後に誤った_;_があります。これにより、_GetComponent<Renderer>_行(17行目)が常に実行されます。条件が真である場合だけではありません。繰り返しますが、これはおそらくあなたが私が想像したものではありません。

0
Mark Pim