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://xiahunao.cn/news/3018351.html

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

相关文章

Linux性能压测指标信息

1、CPU使用 服务器CPU整体负载信息 可以查看top命令输出的第三行数据 查看多核CPU命令 mpstat -P ALL 和 sar -P ALL top命令执行后输入1 2、内存使用 top命令或者free命令来查看内存的信息,第一行是物理内存使用,第二行是虚拟内存使用(交换空间)。…

mvc 异步请求、异步连接、异步表单

》》》 利用Jquery ajax 》》》 mvc 异步表单 c# MVC 添加异步 jquery.unobtrusive-ajax.min.js 方法 具–>Nuget程序包管理器–>程序包管理器控制台 在控制台输入:PM>Install-Package Microsoft.jQuery.Unobtrusive.Ajax –version 3.0.0 回车执行即可在…

多C段的美国站群服务器有什么用途?

多C段的美国站群服务器有什么用途? 多C段的美国站群服务器是一种常见的网络运营策略,其用途主要体现在以下几个方面: 多C段的美国站群服务器有什么用途? 1. 提高站点排名和流量 部署多个站点在不同的C段IP地址上,可以通过不同的IP地址发布…

AI视频教程下载:学会用AI创作文本图片音频视频

在不断发展的科技领域,人工智能 (AI) 是毋庸置疑的冠军,它是一种不断创新的力量,在我们的生活中扮演着越来越重要的角色。随着 2023 年的到来,我们诚挚地欢迎您加入人工智能精通课程的大门。 这不仅仅是一个课程,它专为…

docker部署elasticsearch7.7.0级拼音(pinyin)插件和分词(ik)插件

拉取并启动es docker run -d --namees -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.7.0安装pinyin插件 下载pinyin插件 下载ik插件 上传插件到服务器 docker cp /path/to/elasticsearch-analysis-pinyin-7.7.0.zip elasticsearch…

【Pytorch】5.DataLoder的使用

什么是DataLoader 个人理解是,如果Dataset的所有数据相当于一副扑克牌,DataLoader就相当于从扑克牌中抽取几张,我们可以规定一次抽取的张数,或者以什么规则进行抽取 DataLoader的使用 查阅官网的文档,主要有这几个参数…

libcity笔记:详细流程(以DeepMove为例)

1 主调用 python run_model.py --task traj_loc_pred --model DeepMove --dataset gowalla --batch_size5有task、dataset、model三个必须命令行参数batch_size一个可选命令行参数没有confg_file 1.1 libcity/utils/argument_list.py/str2bool 将字符串表示的布尔值转换为 Pyt…

C++字模软件发送 单片机接收显示

/****先定义数组类型再赋值**L310*********/ /*2014 8 21 10:01**PAST*CODE1000**TEST**/ #include<reg51.h> #define uint unsigned int #define uchar unsigned char sfr AUXR0x8e; //辅助寄存器 sfr SADDR0xA9; …

java之web笔记

1.Servlet技术 1.1 JavaWeb概述 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。 Java Web应用中可以包含如下内容…

OpenGrok使用

以前都是用的find&#xff0c;或者VScode里面的浏览&#xff0c;但是到了Android这个就不行了&#xff0c;代码太多了。都在用OpenGrok&#xff0c;所以俺也用一下。 这里有两个步骤&#xff0c;一个是安装&#xff0c;是一个使用。 1 安装 大概看了一下&#xff0c;安装是to…

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能&#xff0c;并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发&#xff0c;所以在Windows系统上选用Nginx作为负载均衡&#xff0c;需要考虑并发情况。 若并发需求低于 300&#xff0c;部署集群仅以…

AI数据中心网络技术选型,InfiniBand与RoCE对比分析

InfiniBand与RoCE对比分析&#xff1a;AI数据中心网络选择指南 随着 AI 技术的蓬勃发展&#xff0c;其对数据中心网络的要求也日益严苛。低延迟、高吞吐量的网络对于处理复杂的数据密集型工作负载至关重要。本文分析了 InfiniBand 和 RoCE 两种数据中心网络技术&#xff0c;帮助…

微信公众号营销攻略,2024年微信引流商业最佳实践

确实&#xff0c;微信是中国市场上不可或缺的营销工具。下面是一些关于如何在微信上进行有效营销的最佳实践&#xff0c;以及如何通过微信公众号进行广告宣传&#xff0c;以提升品牌知名度并推动业务增长。 拥有一个微信公众号是进行微信营销的关键第一步。 通过公众号&#x…

Linux网络编程(一) 网络基础

一、一些概念 1.1、局域网与广域网 局域网&#xff1a;局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网&#xff1a;又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。 1.2、IP IP地址本质就是…

线性表--数据结构设计与操作

单链表 1.单链表的定义&#xff1a; typedef struct LNode{Elemtype data;struct Lnode *next; }LNode ,*LinkList;//单链表的数据结构&#xff08;手写&#xff09; #include<iostream> #include<vector> #include<algorithm>typedef int TypeElem; //单链表…

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

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

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 为了生成一个给定数组 nums 的所有子集&#xff0c;我们可以利用一种称为回溯&#xff08;backtracking&#xff09;的算法…

ue引擎游戏开发笔记(34)——建立射击映射,并添加特效

1.需求分析&#xff1a; 准备处理射击系统&#xff0c;首先角色需要能射击&#xff0c;有反馈&#xff0c;先建立角色与控制器之间的映射&#xff0c;并添加简单特效&#xff0c;证明映射已经建立。 2.操作实现&#xff1a; 1.首先常规建立映射流程&#xff0c;具体可参考笔记…

Python爬虫 【1】 —— 爬虫基础

爬虫基本套路 基本流程 目标数据来源地址结构分析 具体数据在哪&#xff08;网站 还是APP&#xff09;如何展示的数据、 实现构思操刀编码 基本手段 破解请求限制 请求头设置&#xff0c;如&#xff1a;useragent为有效客户端控制请求频率&#xff08;根据实际情境&#xff09…

4步快速配置Java、MySQL、Maven环境(windows)

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…