Unity与C#的关系

第一,我们首先需要知道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.mzph.cn/bicheng/8382.shtml

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

相关文章

LabVIEW波浪发电平台浮筒取能效率数据采集系统

LabVIEW波浪发电平台浮筒取能效率数据采集系统 随着化石能源的逐渐减少以及能源价格的上升,寻找可替代的、可再生的、清洁的能源成为了世界各国的共识。波浪能作为一种重要的海洋能源,因其巨大的潜力和清洁性,近年来受到了广泛关注。开发了一…

Blender修改器

修改器 Modifier,对模型进行修改,相当于一个函数。 修改器图标是界面右下角的扳手样式 每个修改器的顶部都有如下样式,从左到右分别为:展开/折叠,修改器类型,修改器名称,编辑模式按钮&#xff…

TCP三次握手四次挥手 UDP

TCP是面向链接的协议,而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据,三次握手的几个数据包中不包含数据内容。它的应用层,数据部分是空的,只是TCP实现会话建立,点到点的连接 TCP的四次挥手 第四…

Python生成文学编程风格文档库之pycco使用详解

概要 Pycco是一个Python库,用于生成文学编程风格的文档。它受到了Docco(一个快速生成源代码文档的工具)的启发,并通过解析源代码旁边的注释来创建一个美观的文档页面,使代码的解释与代码本身并排显示。 安装 安装Pycco非常简单,可以通过Python的包管理器pip进行安装: …

vue3与js的router基本使用方式

title: vue3与js的router基本使用方式 tags: vue3js abbrlink: ‘57270957’ date: 2024-04-17 18:54:47 第一步快捷引入的别名 使用路由需要大量在src文件中引用所需要的地址,并且组件中也需要很多的包的引用,将快速跳转到src这一文件的步骤进行简化操…

Redis实际应用中的解决方案

Redis缓存使用问题 1数据一致性 分析一下几种方案: 1:先更新缓存,再更新数据库 2:先更新数据库,在更新缓存 3:先删除缓存,后更新数据库 4:想更新数据库,后删除缓存 …

前端 Android App 上架详细流程 (Android App)

1、准备上架所需要的材料 先在需要上架的官方网站注册账号。提前把手机号,名字,身份证等等材料准备好,完成开发者实名认证;软著是必要的,提前准备好,软著申请时间比较长大概需要1-2周时间才能下来&#xf…

需求文档怎么写?

1. 导言 我也来个导言: 写这篇博客的目的就是来解答一下下面几个问题: 需求文档怎么写?需求文档都应该包含哪些内容?怎样才算一个合格的需求文档? 产品需求文档(Product requriement document)&#xff…

全网首发亲测有用:python免费将chatgpt机器人接入个人微信(同时支持钉钉、QQ 以及别的语言模型如文心一言等)

一、获得免费chatgptAPI https://github.com/chatanywhere/GPT_API_free?tab=readme-ov-file 点击这个就可以获取一个免费的CHATGPT API key 或者觉得不够用的话,也可以付费购买在里面,看着价格很便宜,个人没有买过 tips: 转发API无法直接向官方接口api.openai.com发起…

笔试强训Day20 动态规划 模拟

经此一役小红所向无敌 题目链接&#xff1a;A-经此一役小红所向无敌_牛客小白月赛37 (nowcoder.com) 思路&#xff1a; 水题 直接跟思路即可。 AC code&#xff1a; #include<iostream> using namespace std; typedef long long LL; LL a1,a2,b1,b2,t1,t2,sum; int m…

专题五_位运算(3)

目录 137. 只出现一次的数字 II 解析 题解 面试题 17.19. 消失的两个数字 解析 题解 137. 只出现一次的数字 II 137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 解析 注意这里指的是比特位上的01来进行统计的 题解 class Solution { public:int sin…

深入理解分布式事务⑧ ---->MySQL 事务的实现原理 之 MySQL 事务流程(MySQL 事务执行流程 和 恢复流程)详解

目录 MySQL 事务的实现原理 之 MySQL 事务流程&#xff08;MySQL 事务执行流程 和 恢复流程&#xff09;详解MySQL 事务流程1、MySQL 事务执行流程1-1&#xff1a;MySQL 事务执行流程如图&#xff1a; 2、MySQL 事务恢复流程2-1&#xff1a;事务恢复流程如下图&#xff1a; MyS…

基于V4L2框架的摄像头从上层到底层开发

文章目录 一、V4L2应用开发1、识别摄像头2、查看摄像头设备的能力3、查看支持视频格式4、设置视频格式5、申请帧缓冲6、启动采集7、出队取一帧图像8、入队归还帧缓冲9、停止视频采集10、退出释放资源 二、V4L2框架源码分析1、struct video_device2、struct v4l2_device *v4l2_d…

C#核心之面向对象-继承

面向对象-继承 文章目录 1、继承的基本规则1、基本概念2、基本语法3、示例4、访问修饰符的影响5、子类和父类的同名成员 2、里氏替换原则1、基本概念2、is和as3、基本实现 3、继承中的构造函数1、基本概念2、父类的无参构造函数3、通过base调用指定父类构造 4、万物之父和装箱拆…

关于ESP32下载的几个小问题

文章目录 一、没有收到串口数据二、vscode使用jtag烧录失败 在使用esp32的时候&#xff0c;下载遇到了这么几个小问题&#xff0c;写一下解决方法。 一、没有收到串口数据 报错如下&#xff1a; 这是在使用arduino下载的时候出现的错误&#xff1a;A fatal error occurred: …

c++多线程2小时速成

简介 c多线程基础需要掌握这三个标准库的使用&#xff1a;std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…

Web Component fancy-components

css-doodle 组件库 fancy-components 组件库使用 yarn add fancy-components使用&#xff1a; import { FcBubbles } from fancy-components new FcBubbles() //要用哪个就new哪个 new 这里可能会报错eslink,eslintrc.js中处理报错 module.exports {rules: {no-new: off} …

日志审计系统在提高网络安全方面具有哪些重要的作用

随着信息技术的飞速发展&#xff0c;我们正处于一个高度互联、数据驱动的网络时代。在这个时代&#xff0c;日志审计系统作为网络安全和信息管理的重要工具&#xff0c;发挥着至关重要的作用。下面德迅云安全就详细介绍下关于日志审计系统在当今网络时代的重要性。 一、什么是日…

四、Redis五种常用数据类型-List

List是Redis中的列表&#xff0c;按照插入顺序保存数据&#xff0c;插入顺序是什么样的&#xff0c;数据就怎么保存。可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含232-1个元素(4294967295&#xff0c;每个列表超过40亿个元素)。是一种双向列表结构…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…