Unity3Dプロジェクトで(Visual Studio 2017を使用して)新しいメソッドを作成しました。そのメソッドには、C#7以降が必要です。だから私は このガイド の指示に従いました。
ここで、プロジェクトのプロパティを開こうとすると、Visual Studioでプロジェクトが開きますが、開いた直後に突然閉じます。今ではプロジェクトのプロパティを開くことすらできません。
これはそれがどのように見えるかです:
1番目と3番目のエラーが発生するのはなぜですか? (私がgifで示したもの)
[〜#〜]編集[〜#〜]
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でテスト済み)
まず、新しい空のプロジェクトを作成します。
Edit -> Project Settings -> Player
に移動し、Other Settings
セクションを見つけて、Configuration
/Scripting Runtime Version
の下で.NET 4.x Equivalent
を選択します。
Mcs.exeに、C#7の新しい「実験的」機能を使用してC#コードを処理するように指示します。そのためには、Assetsフォルダー内にファイルmcs.rsp
を作成するだけです。それを編集し、その中にこの行を書きます:
-langversion:experimental
次に、Editor
フォルダー内にAssets
という名前の新しいフォルダーを作成します。このフォルダーにスクリプトを追加すると、Unityは*.Editor.csproj
プロジェクトファイルを作成します。このファイルには、Unityエディターの変更を目的としたスクリプトが含まれています。
プロジェクトが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
ファイル内の定義に関する多くのドキュメントも提供しています。
Unityを使用しているようです(投稿で言及しています)。幅が4ピクセルくらいなので、gifではわかりません。
実際にUnityを使用している場合は、C#7の機能をまだ使用できません。彼らはC#6の実験的なサポートのみを許可しました( ここ を参照)。
残念ながら、UnityでC#7を使用したい場合は運が悪いです今。
プロパティウィンドウが開かないのは、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行目)が常に実行されます。条件が真である場合だけではありません。繰り返しますが、これはおそらくあなたが私が想像したものではありません。