RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 688209
Accepted
Алексей Шиманский
Алексей Шиманский
Asked:2020-07-07 01:43:44 +0000 UTC2020-07-07 01:43:44 +0000 UTC 2020-07-07 01:43:44 +0000 UTC

如何在 Unity3d 中使用 C# 5/6/7 特性?

  • 772

我想与时俱进,看着 C#6/7 中的新芯片和包子,得到了启发。那里的一切都那么美味和凉爽,不使用它是一种罪过。我打开Unity、Visual Studio,写了几行然后……陷入了绝望。对于任何使用新功能的尝试,他们都会告诉我一件事:

功能bla bla bla在 C#4 中不可用。请使用语言版本 6 或更高版本

或者

功能bla bla bla不能使用,因为它不是 C# 4.0 语言规范的一部分

查看Unity 5.6使用的Mono版本(!!!最新版本),它是:. 因此,它拥有 C#3 中的所有内容,外加 C#4 中的一部分。2.0 (Visual Studio built mono)

这并不能使我很高兴和满足。

毕竟,有没有可能使用该语言的新版本,而不是在遥远的 2010 年停滞不前?可以做什么以及如何做?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Алексей Шиманский
    2020-07-07T01:43:44Z2020-07-07T01:43:44Z

    更新 (01/12/2021)

    根据数据,您现在可以使用本机和 C# 7.3 。

    2020.1 beta 文档仍然提到 7.3,但 2020.2 表示将支持 8.0。


    其他统一版本的旧答案

    是的,可以使用较新的版本,但有一个警告......下面有更多内容。

    虽然Unity在CLR 2.0上停留了很长时间,但新的 C# 功能并不需要最新版本的CLR。如果明确要求,Microsoft和 Mono编译器可以为CLR 2.0编译C# 5/6/7 。

    注意:但是,某些功能仍然不可用,例如dynamic.


    因此,可以在Unity C# 5.0 和 6.0 Integration bitbucket 存储库中找到此功能(目前可能是唯一的功能)

    需要做什么?

    • 对于 C# 6.0

      1. 将文件夹CSharp60Support从存储库(或从下载页面)复制到您的Unity项目。该文件夹必须放在项目根目录中,在 Assets. 不在里面!
      2. 导入CSharp60Support.unitypackage(位于文件夹中CSharp60Support)到您的项目中。
      3. 重新加载Unity
      4. [可选 - 可选]:在Windows上-/CSharp60Support/ngen install.cmd以管理员权限运行。该命令将使用Ngen编译 csc.exe、pdb2mdb.exe 和 mcs.exe ,这将使Unity的编译速度更快一些。
    • 对于 C# 7.0

      1. 对于MacOS,下载并安装Mono 4.6+。对于Windows,下载并安装.Net Framework 4.6.2+。
      2. 将文件夹CSharp70Support 从存储库(或从下载页面)复制到您的Unity项目。该文件夹必须放在项目根目录中,在 Assets. 不在里面!
      3. 导入CSharp70Support.unitypackage(位于文件夹中CSharp70Support)到您的项目中。
      4. 重新加载Unity
      5. [可选 - 可选] 在Windows上-/CSharp70Support/ngen install.cmd以管理员权限运行。该命令将使用Ngen编译 csc.exe、pdb2mdb.exe 和 mcs.exe ,这将使Unity的编译速度更快一些。

    因此,仅更改当前项目所在的文件夹。其余项目将照常使用当前版本的语言、Mono 和其他 tin :)

    这个怎么运作?

    1. /Assets/CSharp vNext Support/Editor/CSharpVNextSupport.dll是一个编辑器扩展,它通过反射修改编辑器的内部数据,告诉它使用替代的 C# 编译器 ( /CSharpXXSupport/CSharpCompilerWrapper.exe)。如果不存在,则使用默认值。
    2. CSharpCompilerWrapper.exe接收来自Unity的编译请求并将其转发到当前的 C# 编译器之一,该编译器使用以下规则:
      • 如果该文件夹存在CSharp70Support且包含文件夹Roslyn,则使用 C# 7.0 编译器;
      • 如果该文件夹存在CSharp60Support并且包含文件夹Roslyn,则使用 C# 6.0 编译器;
      • 否则,如果该文件夹存在CSharp60Support并且包含,则使用Mono C# 6.0mcs.exe编译器;
      • 否则,将使用默认编译器 ( /Unity/Editor/Data/Mono/lib/mono/2.0/gmcs.exe)。

    确保编译器CSharpCompilerWrapper.exe确实有效!为此,请查看编译日志:UnityProject/CSharpXXSupport/compilation.log

    支持哪些平台?

    它适用于所有主要平台:

    • Windows(编辑器和独立)
    • macOS(编辑器和独立版)
    • 安卓
    • iOS

    您可以在存储库的主页上阅读更多信息和小限制 ,也可以(因为上面给出了主要信息)以英文来源的引用形式:

    响应 (.rsp) 文件

    如果您想使用响应文件将额外的选项传递给编译器(例如-unsafe),则该文件必须命名为CSharpCompilerWrapper.rsp.

    平台得到“支持”

    在 MacOS 上,Roslyn 编译器无法创建 Unity 可以使用的调试信息文件 (.pdb)。如果您在 MacOS 上使用 Roslyn 编译代码,您将无法对其进行调试。

    由于 WebGL 不提供任何多线程支持,因此 AsyncBridge 和任务并行库不适用于此平台。Caller Info 属性也不可用,因为它们的支持来自 AsyncBridge 库。

    由于最新版本的 .Net Framework 和旧版本的 TPL (System. Threading.dll) 随 AsyncBridge 一起提供。也就是说,您不能使用 async/await、Caller Info 属性以及 System.Threading.dll 中的所有内容(例如并发集合)。

    其他已知问题

    • C# 5.0/6.0 与 Unity Cloud Build 服务不兼容的原因很明显。

    • 在 Visual Studio 中调试时,使用 Mono C# 6.0 编译器可能会导致 Unity 偶尔崩溃 - http://forum.unity3d.com/threads/c-6-0.314297/page-2#post-2225696

    • IL2CPP 不支持在 C# 6.0 (ExceptionFiltersTest.cs) 中添加的异常过滤器。

    • 如果在命名空间内声明了 MonoBehaviour,则源文件不应在 MonoBehaviour 声明之前包含任何特定于 C# 6.0 的语言构造。否则,编辑器不会将该脚本识别为 MonoBehavior 组件。

      坏例子:

        using UnityEngine;
        using static System.Math; // C# 6.0 syntax!
      
        namespace Foo
        {
         class Baz
         {
            object Qux1 => null; // C# 6.0 syntax!
            object Qux2 { get; } = null; // C# 6.0 syntax!
         }
      
          class Bar : MonoBehaviour { } // "No MonoBehaviour scripts in the file, or their names do not match the file name."
        }
      

      好的例子:

        using UnityEngine;
      
        namespace Foo
        {
         class Bar : MonoBehaviour { } // ok
      
         class Baz
         {
            object Qux1 => null;
            object Qux2 { get; } = null;
         }
        }
      
    • Mono C# 6.0 编译器中存在一个与 null 条件运算符支持 (NullConditionalTest.cs) 相关的错误:

        var foo = new[] { 1, 2, 3 };
        var bar = foo?[0];
        Debug.Log((foo?[0]).HasValue); // error CS1061: Type `int' does not 
        // contain a definition for `HasValue' and no extension method
        // `HasValue' of type `int' could be found. Are you missing an
        // assembly reference?
      

      Mono 编译器认为foo?[0]是int,而实际上是Nullable<int>. 但是,bar正确推断出的类型是 - Nullable<int>。

    执照

    所有源代码均在WTFPL version 2下发布。

    想谈谈吗?

    http://forum.unity3d.com/threads/c-6-0.314297/#post-2108999

    散记

    • Roslyn C# 6.0 编译器取自 VS 2015 安装。C# 7.0 编译器取自 VS 15 Preview 5 安装。

    • mcs.exe,pdb2mdb.exe其依赖项取自Mono 4.4.1.0安装。Unity 自带的 pdb2mdb.exe 与 Roslyn 编译器生成的程序集不兼容。

    • AsyncBridge 库包含一组类型,可以在面向 CLR 2.0 的项目中使用async/await。它还提供呼叫者信息属性支持。有关详细信息,请查看此博客文章。

    • 如果您在 Unity 事件(Awake、Start、Update 等)中使用async/await,您可能会注意到延续(await 关键字下方的代码)是在后台线程中执行的。这很可能不是您想要的。要强制await将执行返回到主线程,您必须为其提供同步上下文,就像所有 WinForms 和 WPF 应用程序一样。

      检查和位于项目中的示例实现UnityScheduler.cs。这些类为 Unity 的主线程创建和注册多个同步上下文,因此 async/await 可以像它们在常规 WinForms 或 WPF 应用程序中那样工作。UnitySynchronizationContext.csUnityTaskScheduler.cs

      有关什么是同步上下文、它的用途以及如何使用它的更多信息,请参阅 Stephen Toub 的这组文章: 一、二、三。


    PS我会尝试跟踪主题并保持最新版本的链接是最新的。

    • 21
  2. Merlin
    2020-01-13T02:27:12Z2020-01-13T02:27:12Z

    目前(01/12/2020)在Unity中,C#7.3语言的版本是证明 ,不需要执行特殊操作,一切都是开箱即用的,如果我错了,请指正。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5