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++代码,然后编译成目标平台的机器代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows如何安装python框架

windows如何安装Python框架?以安装Django框架为例,具体如下: 在idea上运行Python项目时,出现了如下错误,这是因为系统中只安装了Python,没有安装Django。 既然报错的原因就是缺少Django,那我们…

深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理

文章目录 一、AbstractAutowireCapableBeanFactory 概述1.1 详细分析1.2 设计思想 二、深入解析AbstractAutowireCapableBeanFactory 的实现细节2.1 Bean 实例化过程分析2.1.1 createBean()2.1.2 createBeanInstance() 2.2 Bean 属性注入的实现机制2.2.1 populateBean()2.2.2 a…

560. 和为 K 的子数组 974. 和可被 K 整除的子数组 【前缀和】

题目链接 ​​​​​​​974. 和可被 K 整除的子数组 560. 和为 K 的子数组 今天刷题的时候,刷了这两题,感觉挺有意思的。代码写起来挺简单的,但是思路和其中的细节以及涉及到的知识点确实让我挺意外的。这里写个博客解析一波,也是…

Charles抓包工具

Charles是一个HTTP代理工具,使开发人员能够查看客服端和服务器之间的所有HTTP/ HTTPS/SSL网络请求。 Charles是在PC环境下常用的网络抓包截取工具,在做移动开发时,我们为了调试客户端与服务端的网络通讯协议,常常需要截取网络请求…

MCP3008-I/SL 模数转换器ADC SPI接口 模拟信号采集

MCP3008-I/SL 模数转换器ADC 贴片SOIC16 MCP3008-I/SL 是一款模数转换器(ADC),属于 SAR(逐次逼近寄存器)架构的 ADC。它具有以下特点: 8 通道单 ADC 最大采样率:200ksps(千样点每秒…

鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南

几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 是在 OpenHarmony 的 kernel_liteos_a 基础上给内核源码加上中文注解的版本.与官方源码按月保持同步,同步历史如下: 2021/10/09 – 增加性能优化模块perf,优化了文件映射模块2021/09/14 – common,extended等几个目录结构和M…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于深度学习的低剂量SPECT心肌灌注图像去噪:定量评估与临床表现

Title 题目 Deep learning–based denoising of low‑dose SPECT myocardialperfusion images: quantitative assessment and clinical performance 基于深度学习的低剂量SPECT心肌灌注图像去噪:定量评估与临床表现 01 文献速递介绍 单光子发射计算机断层扫描&a…

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下: 已生成的项目架构里面找到manifest.json文件,通过源码视图的方式打开文件,在文件中添加一下代码即可完成代理: "h5": {"devServer": {"disableHostCheck": true, //禁…

基于StatefulSet控制器在Kubernetes上部署MySQL一主多从

一、前提--StatefuSet特性 1.1 有状态的节点控制器 -- StatefulSet 及其网络状态 容器的解决方案是针对无状态应用场景的最佳实践,但对于有状态应用来说,就并非如此了。Kubernetes 用 StatefulSet 解决了有状态应用编排的问题,本文我们就来…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名Github。 GitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、…

爬取深圳2024年链家二手房数据,共3000条数据(其他城市也可)

文章目录 专栏导读1.目标2.导入相关库3.获取每个二手房的链接4.获取每个链接中的相关数据5.保存数据6.数据展示 专栏导读 ✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫…

探索数据结构

什么是数据结构 数据结构是由:“数据”与“结构”两部分组成 数据与结构 数据:如我们所看见的广告、图片、视频等,常见的数值,教务系统里的(姓名、性别、学号、学历等等); 结构:当…

Pandas进阶

文章目录 第1关:Pandas 分组聚合第2关:Pandas 创建透视表和交叉表 第1关:Pandas 分组聚合 编程要求 使用 Pandas 中的 read_csv() 函数读取 step1/drinks.csv 中的数据,数据的列名如下表所示,请根据 continent 分组并…

VMware 虚拟机自定义规范 - 更优雅的虚拟机开局

介绍 虚拟机自定义规范可以在你克隆虚拟机的时候在vCenter 的Web界面设定虚拟机的主机名、单/多网卡IP的IP和网关、DNS服务器、唯一标识符重置(SID等)、硬盘分区自动扩容、设定密码、密钥、时区等信息。 让管理员不需要进入虚拟机系统内部进行配置&…

10000字讲解IoC 思想以及五大注解

文章目录 IoC 思想通过案例讲解 IoC1.传统的开发方式 SpringIoC 和 DI五大注解ControllerServiceComponentRepositoryConfiguration 为什么要有这么多的类注解类注解之间的关系方法注解 Bean重命名 bean扫描路径 IoC 思想 什么是 Spring 呢? 我们经常听到的都是说…

Android 13 aosp 默认关闭SELinux

通过adb修改 adb root adb shell setenforce 0 // 开SELinux,设置成模式permissive adb shell setenforce 1 // 关SELinux,设置成模式enforce adb shell getenforce // 获取当前SELinux状态源码修改 Android_source/system/core/init/selinu…

JS-导入导出

export和export default是ES6中导出模块中变量的语法 导入导出变量 //导出方法(js文件中) export const 变量名值//导入方法 对应导入的变量,一定要加花括号 import {变量名} from js文件路径 导入导出函数 //导出方法(js文件中…

2024.1IDEA 到2026年

链接:https://pan.baidu.com/s/1hjJEV5A5k1Z9JbPyBXywSw?pwd9g4i 提取码:9g4i解压之后,按照 操作说明.txt 操作; IntelliJ IDEA 2024.1 (Ultimate Edition) Build #IU-241.14494.240, built on March 28, 2024 Licensed to gurgles tumbles You have…

福汇美股开户教程

福汇作为全球知名的外汇交易平台,也提供美股交易服务。在福汇交易美股,首先需要开立一个福汇账户。本教程将详细介绍福汇美股开户流程。 第一步:访问福汇官网并填写开户表格 访问福汇美股入口点击页面顶部的“开户”按钮。选择您的国籍&…

JetsonNano —— Windows下对Nano板卡烧录刷机(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南,你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像,并记下它在计算机上的保存…