Unity与C#的关系

news2024/11/26 20:44:57

第一,我们首先需要知道Unity与C#的关系是什么?

第二,我们要明白为什么Unity会使用C#,而不是C++?

第三,我们需要知道Unity是怎么使用C#的?

第一点:

先说结论:C#是Unity用于开发游戏的主要编程语言之一,而Unity则提供了一个集成开发环境,允许开发者使用C#来编写游戏逻辑。

再说过程:首先我们想要知道Unity和C#关系是什么?我们就需要知道什么是Unity、什么是C#,也就是要明白这两者的概念。

那么什么是Unity呢?
简单来说,Unity 就是一个 2D/3D 引擎和框架,为您提供设计 2D、2.5D 和 3D 游戏或应用场景的系统。 

什么是C#呢?这里我们引用百度百科的原文:

C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。

但是Unity的底层是用C++编写的,提供了核心功能,如图形渲染、音频处理、物理模拟等。然而,Unity为开发者提供了一个使用C#作为主要编程语言的高层脚本环境。

那么,为什么Unity会选择C#呢?

第二点:

要明白为什么Unity使用C#,就不得不谈到C#的一些特性了。

1.我们知道C#是专门为.Net设计的开发语言,C#设计之初就考虑了跨平台的需求,这与Unity引擎的跨平台目标相契合。C#能够在不同的操作系统上运行,而不需要针对每个平台编写特定的代码。具体关于C#是怎么实现跨平台的可以看我的关于.Net的这篇笔记

C#高级编程笔记--.Net体系结构_c#界面高级编程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62520130/article/details/136529829?spm=1001.2014.3001.55012.与C++相比,C#的内存管理和异常处理更加自动化,减少了开发者的负担,C#提供了垃圾回收机制,这有助于管理内存并减少内存泄漏的风险,这对于游戏开发中的实时性能至关重要。

在下面我引入一段Unity官方的回答:

Unity之所以偏爱C#,不仅是因为它很简单,还因为JIT(just-in-time)编译器可以将C#代码转译成效率较高的原生代码。而为了做到性能平衡、可控,Unity引擎剩下的大部分都采用了C++开发。

与此同时,整个微软.NET生态系统也在不断发展,并推出了新的许可和对非Windows平台的支持。我们借着这股东风在2018年升级到了Unity .NET Mono Runtime,并引入了更现代的C#版本(7.0以上)。同年,我们还发布了Burst编译器的首个版本,开创了为C#分支快速生成原生代码的先河。在取得这一突破后,Unity提出了一个新设想:将C#拓展到引擎剩余几个关键部分、不再用C++进行开发,并为DOTS运行时的开发做铺垫。

回答链接:.NET和Unity的未来 - 技术专栏 - Unity官方开发者社区

总的来说,就是因为C#的简单高效跨平台和越来越完善的.Net生态系统。

关于C#与.Net的关系可以看我上面的笔记,里面记载的十分详细,一定会对你有所帮助。

那么,Unity内部是怎么处理C#的呢?

第三点:

Unity内部处理C#的流程如下:

1.脚本编写

开发者使用C#编写游戏逻辑,并将其保存为.cs文件。

2.脚本编译

在早期版本的Unity中,C#脚本通过Mono虚拟机进行编译和运行。Mono是一个开源的C#和CLI(公共语言运行时)实现。从Unity 5.6开始,Unity提供了IL2CPP这一编译选项,它将C#代码转换为C++代码。这样可以提高性能,并允许C#脚本在没有Mono运行时的平台上运行。

如果是使用Mono作为运行时,C#脚本会被编译成中间语言(IL)代码,然后由Mono的即时编译器(JIT)在运行时转换为本地代码。如果项目使用了IL2CPP,则在构建游戏时这些IL代码将被转换成C++代码。

3.API绑定

编译后的C#代码需要与Unity引擎的C++底层进行交互。这就需要API绑定,它允许C#脚本调用由C++实现的Unity引擎功能。Unity通过一个称为C# wrapper的机制来实现C#和C++之间的绑定。这个wrapper层提供了一组C#可以访问的API,这些API在背后调用了C++的实现。

API绑定通常涉及到对C++代码的封装,以提供一个C#友好的接口。例如,一个C++类可能被封装为一个C#类,使得C#代码可以像调用本地对象一样调用它。

4.构建游戏

在准备将游戏部署到目标平台之前,Unity会执行构建过程。如果使用IL2CPP,则在构建时C#代码会被转换成C++代码,然后编译成目标平台的机器代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1650819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Verilog】big_small_cnt

通用大小计数器 timescale 1ns / 1ps // // Company: // Engineer: wengf // Create Date: // Design Name: // Module Name: big_small_cnt // Project Name: // Target Devices: // Tool Versions: // Description: // Dependencies: // Revision: // Revision 0…

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快,五天假期说没就没,因为一些事情耽搁到现在,不过还是要继续学习的,之后就照常更新,先说一下,这个100题是菜鸟教程里面的,但是有一些题,我加入了自己的理解,甚…

odoo实施之创建行业demo

创建数据库,添加公司数据 选择应用,获取15天免费试用 创建完成 设置客户公司logo 创建用户 更改用户语言 前置条件:配置邮件 开发模式下,额外信息 加载demo数据

Conda下Richdem包遇到问题

Conda中Richdem包遇到问题 文章目录 Conda中Richdem包遇到问题问题一报错解决 问题二报错解决 参考 问题一 报错 RichDEM 是一套数字高程模型 (DEM) 水文分析工具,这次打算用richdem进行地形分析,尝试在conda里面安装richdem包的…

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

windows vscode设置扩展和缓存目录

vscode的扩展和缓存占了很大的空间,而且默认在C盘,很烦。。。 修改vscode快捷方式的目标处:"C:\Users\Nv9\AppData\Local\Programs\Microsoft VS Code\Code.exe" --extensions-dir "D:\Program Cache\VScode\extensions"…

sql注入练习

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

Spring Boot集成Swagger快速入门Demo

1.什么是Swagger? Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 主要作用: 使得前后端分离开发更加方便,有利于团队协作。(实际开发中,接口文档的内容会不停的…

kafka学习笔记(三、生产者Producer使用及配置参数)

1.简介 1.1.producer介绍 生产者就是负责向kafka发送消息的应用程序。消息在通过send()方法发往broker的过程中,有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用后才能被真正的发往broker。 demo: public class Kafk…

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题,主要内容是:学习导入NTPClient库,通过这个库获取实时网络时间,显示在1.3寸TFT液晶屏幕上。此前三个专题,请选择查看以下链接。 第一专题内容,请参考 【N…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看(非必须) docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地,这样即使容器被删除,数据也不会丢失。 mkd…

牛客NC142 最长重复子串【中等 字符串 Java/Go】

题目 题目链接: https://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc 思路 注意:题目给的时间复杂度是O(N^2)那么直接套用双重循环:外层循环i为假定起始重复子串的初始位置,内层循环的j为假定重复子串的结束位置…

每日一题5:Pandas-修改列

一、每日一题 一家公司决定增加员工的薪水。 编写一个解决方案,将每个员工的薪水乘以2来 修改 salary 列。 返回结果格式如下示例所示。 解答: import pandas as pddef modifySalaryColumn(employees: pd.DataFrame) -> pd.DataFrame:employees.loc[…

人工神经网络初步

大家好,这里是七七,由于各种比赛的缘故,使用了很多人工神经网络模型。但是很多的原理都不是很明白,就导致了不能灵活地运用┭┮﹏┭┮。为此,去看了些人工神经网络原理书,写下此专题。 在进入正文之前要先…

Delta lake with Java--数据增删改查

之前写的关于spark sql 操作delta lake表的,总觉得有点混乱,今天用Java结合真实的数据来进行一次数据的CRUD操作,所涉及的数据来源于Delta lake up and running配套的 GitGitHub - benniehaelen/delta-lake-up-and-running: Companion reposi…

Mac idea gradle解决异常: SSL peer shut down incorrectly

系统:mac 软件:idea 解决异常: SSL peer shut down incorrectly 查看有没有安装 gradle -v安装 根据项目gradle提示安装版本 brew install gradle7idea的配置 在settings搜索gradle,配置Local installation,选择自己的安装目录…

Unity Shader中获取像素点深度信息

1.顶点着色器中对深度进行计算 v2f vert(appdata v) {v2f o;o.pos UnityObjectToClipPos(v.vertex);o.uv TRANSFORM_TEX(v.uv, _MainTex);o.depth (o.pos.z / o.pos.w 1.0) * 0.5; // Normalize depth to [0, 1]return o; }但是达不到预期,最后返回的值一直大于…

连通“数据”,让制造变“聪明”

说起数据智能,你第一时间想到的是什么呢?是科技感十足的智慧城市?还是炫酷的人工智能景象? 数据作为企业的战略资产越来越受到重视,从最初的数据协助业务协同,转化为数据驱动业务,数据驱动运营…

Hive两代命令行客户端(Hive、Beeline)

Hive命令行客户端 Hive有两个主要的客户端工具,分别是旧版的Hive CLI(Command Line Interface)和新版的Beeline。 Hive CLI: Hive CLI 是 Hive 最早期的命令行客户端工具,它使用 JDBC 连接到 Hive 服务器,…