找回密码
 立即注册
查看: 225|回复: 5

【Unity】Unity的c#项目如何使用更高版本的.Net框架?

[复制链接]
发表于 2024-7-15 18:07 | 显示全部楼层 |阅读模式
如题,Unity版本2020.3.38,测验考试过在Unity的project setting中改削api compatibility level为.Net 4.x后重启项目还是用不了高版本.Net的一些内容,在VS里面测验考试改削项目属性中的方针框架也只有.Net Framework可选,请问该如何使用.Net 5或以上版本呢?
发表于 2024-7-15 18:07 | 显示全部楼层
前言

在面试中,我们经常会被问到Unity的底层是如何处理C#,本节给通过一下3个点来给大家详细的分析这个问题:
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。




C#的发展历史

C#没有出来之前,当时Java凭借Java虚拟机+Java字节码解释执行,让Java代码移植编写可以跨平台运行。同时Java等有了垃圾回收机制等,大大的降低了开发的难度。微软为了应对Java, 推出了.net平台。.net平台包含了几个点:


c: 开发一个.net 虚拟机能解释执行CLR字节码,同时把.net虚拟机移植到多个平台(windows, win mobile等windows系的操作系统)。这样用C#/J#开发的程序能跨平台到.net支持的操作系统上,同时C#, J#底层一样,能相互的调用。
d: 为了让.net能支持更多的平台,微软把.net CLR的标准开放出来了。


Unity为什么用C#

讲完.net的发展历史的几个阶段以后,我们来看下为什么Unity会使用选C#来做开发语言。Unity 出来的时候,也需要解决 游戏 for mac, 游戏for linux, 游戏for windows, 游戏 for xbox等平台,后来手游发展起来以后又要解决 游戏 for Android, 游戏for IOS等。所以Unity引擎必须要构建在能跨平台发布的这个基础上。所以早期的Unity选择了Mono,作为跨平台基础,所以Unity是基于mono发展起来的项目。而mono 基于.net技术构建,所以在mono上开发,可以支持多种开发语言,c#, J#等所以早期Unity能支持C#, Boo, Js等编程语言,都是基于mono .net技术。所以Mono帮助Unity解决了跨平台问题,开发语言与开发工具的问题。
看上去一切很美好,但是基于mono构建的技术方案也有致命的问题,后期的Unity发现问题越来越多,主要的问题如下:






Unity il2cpp 救世主

为了解决mono .net的问题,Unity 开发团队推出了一个新的技术,就是il2cpp,顾名思义就是讲CLR/IL代码通过il2cpp,把它转成c/c++代码,然后再基于平台的native开发工具再进行编译,最终编译出native的二进制代码。


这样做发布IOS没有任何问题,native code性能也好,同时如果有新的平台出现的时候,只要把C/C++移植到对应的平台就可以了,移植的时候非常的方便。
总结一下unity基于il2cpp 来构建处理C#的基本原理与步骤:


(3) 使用il2cpp工具,将CLR/IL字节码转成静态的C++代码;
(4) 使用native的开发工具(xcode, Android NDK等),来将C++代码编译成目标的native机器码;
这样Unity开发到目标OS平台的安装包就打包发布出来了。假设有新的平台出现后,只要将游戏引擎的native代码+平台工程工具移植好就可以了,获得更好性能的同时获得了更好的跨平台移植性。最后上一个图来展示一下整个的架构,如下:


本节就分享到这里了,关注我,学习更多的Unity开发的知识。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 18:07 | 显示全部楼层
在Unity框架设计中与游戏服务器对接的网络框架也是非常重要的一个模块,本文給大家分享如何来基于Unity来设计一个网络框架, 主要的讲解以下几个点:


对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
TCP半包粘包, 长连接与短连接, IO阻塞
TCP 是可靠的网络传送协议,网络传输底层每发送一个TCP数据包,就要等对方确认,收到确认消息以后才能发下一个TCP数据包。当我们在应用层发送一个应用层的数据包的时候,TCP网络底层可能会把这个应用层的数据包分成若干”TCP数据包”,通过网络底层发出去。那么这里就会有一个问题,应用层发的数据包有可能被拆散成几个”TCP数据包”发出去,我们在另外一端接收的时候,可能要把这些拆散的包组合起来。这个就是”半包”。底层有可能把两个应用层的数据包分到一个”TCP数据包”发过去,接收到后,一部分是属于上一个应用层的数据包,一部分属于下一个应用层的数据包,这个叫做”粘包”。




Tcp Socket与UDP Socket 的技术方案
了解完网络的一些基本概念以后,接下来看下使用TCP/UDP Socket用哪些技术方案。Unity其实是作为网络的客户端,而客户端只要去连接服务端与服务器通讯就可以了,不用像服户端同时处理N个客户端的数据传送。所以客户端Socket非常的简单。Unity客户端的Socket我们用哪个插件呢?其实这种完全不需要用什么插件,直接使用OS为我们提供的Socket的相关API就可以了。


UDP Socket的使用, UDP Socket不是面向连接的,只是调用底层的网络协议,直接把数据包发往特定地址+端口。所以直接是SendTo(网络地址+端口), RecvFrom(网络地址+端口)
TCP/UDP Socket已经足够简单,Unity开发者在选取技术的时候直接使用即可。
Unity的序列化与反序列化技术方案


文本序列化: 将数据变成人眼可读的文本数据。当收到序列化好的文本数据的时候,根据文本数据的规则来解析出里面的数据重建数据对象。


TCP的封包与拆包
上面讲解了,应用层的数据包有可能被拆分成若干”TCP数据包”,还有可能两个应用层的数据包连在一起在一个”TCP数据包”中。为了收数据的时候能完整正确的收到应用层的数据包,我们必须要把两个应用层的数据报之间做好分隔标记,当我们收到数据以后就可以根据分隔标记来决定哪些数据是哪个包的。目前有两种做法:


基于http的短连接技术方案


Unity 网络框架设计与实现原理
铺垫了这么多,我们直接来上Unity网络框架的架构设计结构图,供大家参考。




本节分享就到这里了,关注我,学习更多的Unity框架设计的技巧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 18:07 | 显示全部楼层
每个版本的Unity对于.Net版本支持有一个上限,比如unity2022最高支持到.Net 4.8。
这是unity那边,自己引擎代码做的工作,用户不太可能自行支持。
发表于 2024-7-15 18:08 | 显示全部楼层
unity迁移到官方.NET平台的进度已经在路上了,届时将会支持完整的c#特性
.NET和Unity的未来未来可期吧
前段时间Godot引擎也发布了4.0正式版,也是迁移到了.NET6平台,我个人还是持乐观态度的
发表于 2024-7-15 18:08 | 显示全部楼层
Unity不是直接使用标准的(微软的).NET实现,这个选项也只是叫API Compatibility Level,等于说告诉你大概能在脚本里用到相当于.NET哪个版本的API。
看看了一下2020的文档,C#可以支持到8.0
https://docs.unity3d.com/2020.3/Documentation/Manual/CSharpCompiler.html要想用高版本的特性只能建议更新Unity版本,2023可以支持C# 9.0
另外就是参见API兼容级别选项对应的.NET API版本。
ApiCompatibilityLevel顺便说一句.NET Standard不是一个具体的.NET实现,它相当于是一套各种实现都能支持的API。2.1是比较新的。如果你确实需要较新的标准库中的功能,可以考虑调成.NET Standard
.NET Standard
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 21:08 , Processed in 0.106337 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表