前言:我们在游戏开发的过程中,往往会通过游戏引擎结合编程语言的方式,来作为项目开发的手段。因此,了解相关语言的特性、发展和前沿知识,就显得相当必要。笔者这里结合自身的工作经验和学习心得,用简洁通俗的语言,尽量保证专业性的同时,帮助同学们对此有一个简单的认识。文章中如有不足之处,欢迎指正。
个人强烈建议,在学习新的知识技术时,请尽量遵照官方推荐,以保证自身知识的扎实性。比如新学Unity时,一些互联网上的开发课程和教程视频,固然可以帮助我们快速上手;但一定不要忽视官方指导文档、API文档、官方示例、社区答疑等一些列官方指导性内容。这些内容对于科学、全面掌握Unity有着本质的决定性作用。评价一个开发者是否是一位好的游戏开发工程师的标准之一,我个人觉得应该是是否对官方指导性内容的尊重程度。只有如此,开发者才能在一个比较全面、扎实的基础上,去进行技术上的提升和迭代。
一、查看工程所使用的C#语言版本。
C#语言是Unity引擎默认的编程语言。当我们在Unity官方文档的指引下,安装Unity编辑器,搭建开发环境的时候。往往官方已经帮我们适配和选择好语言的版本,以及相关的IDE开发环境(Visual Studio)。
那么,在搭建好开发环境工作流之后,进行编程语言版本的查看(Unity文档中会介绍所用到的C#编译器,其中会介绍可支持的C#版本):
Unity User Manual 2021.3 (LTS)脚本Unity 架构Unity 中的 .NET 概述C# 编译器
二、当前C#版本的主要特性。
知道了引擎中编译器的特性之后,就可以去微软的.NET文档中查看C#的语言特性了。
Learn .NET C# 指南 C# 9 版
三、特别注意。
在全面了解了语言特性之后,需要特别注意的是,引擎使用的C#编译器的特性。**具体的编译器未必支持语言的全部特性。**其往往存在不受支持的部分、部分支持的部分等。例如:
Unity2021 所使用的C#编译器(Roslyn),支持C#版本为9.0,但有以下功能不受支持或使用注意事项。
- 1.禁用localsinit标记;
- 2.协变返回类型;
- 3.模块初始化;
- 4.非托管函数指针的可扩展调用约定;
- 5.只初始化的设置器;
以上功能是Unity中不支持的
C# 9 的 init 和 record 支持存在一些注意事项。- 1.要完全支持记录record,需要使用 System.Runtime.CompilerServices.IsExternalInit 类,因为它使用了 init-only 设置器,但该类仅在 .NET 5 及更高版本中可用(Unity 不支持)。用户可以通过在自己的项目中声明System.Runtime.CompilerServices.IsExternalInit 类来解决此问题。
- 2.不应该在序列化类型中使用 C# 记录,因为 Unity 的序列化系统不支持 C# 记录。
未托管函数指针支持
Unity支持C# 9中引入的非托管函数指针,但不支持可扩展的调用约定。以下示例代码提供了关于如何正确使用非托管函数指针的更详细信息。
以下示例针对Windows平台,并需要在Player Settings菜单中启用“不安全”代码。有关C#不安全上下文的更多信息,请参阅Microsoft的 unsafe (C# Reference) 文档或Microsoft的 Unsafe code, pointer types, and function pointers 文档。
四、总结。
按照上述的步骤,我们基本上就把游戏引擎和编程语言两者之间的联系给对应起来了。希望能对大家系统性掌握知识有一个帮助。