Unity环境搭建

ooowl
  • 游戏开发
  • unity
About 7 min

📝Note

这是我为自己做的选择。
白鸟白鸟不要回头望
你要替我飞去那地方
一去那地方
那是你我共同故乡

No Game,No Life

已经习惯了使用mac和jetbrains全家桶开发,这次换了新电脑也继续用吧,开箱即用不用操心真不错。
基本的开发环境dotnet,git之类的都跳过了,这些太基础

摆脱中国特供版Unity

首先代理是必须的
中国特供版会让你填手机号,不要访问unity.cnopen in new window,也不要访问unity.com的中文版面,要访问英文界面的官网。
然后注册你的unity帐号,找个镜像之类的下载unity hub国外的版本,不是中国特供版,不然会让你跳到国内版网站去验证。
如果有已安装的UnityHub版本,先卸载,为以防万一,卸载之后删除 ~/AppData/Roaming 这个目录下的UnityHub和Unity Hub目录。然后再安装,mac直接删除UnityHub就行

windows上的启动脚本为

@echo off
set HTTP_PROXY=http://127.0.0.1:1080
set HTTPS_PROXY=http://127.0.0.1:1080
start "" "C:\Program Files\Unity Hub\Unity Hub.exe"

mac的为

#!/bin/bash
export HTTP_PROXY=http://127.0.0.1:1080
export HTTPS_PROXY=http://127.0.0.1:1080
nohup "/Applications/Unity Hub.app/Contents/MacOS/Unity Hub" &>/dev/null &

原理就是先在命令行里走代理,然后启动程序就会全走命令行的代理,打开之后是不能关掉命令行的session的。
如果是程序老手,平时肯定就已经挂上了,直接使用最后一句启动就行
一定要使用上面的脚本启动!否则UnityHub启动时不会读取系统代理,在登陆时会跳转到https://id.unity.cn/open in new window

设置Rider为编辑器

Rider 代替 VisualStudio

  1. 打开Unity项目选择:Window > Package Manager > 搜索 Rider 点击 Install(安装)
  2. 安装完毕后,选择 Edit > Preferences > External Tools > 选择 External Scriot Editor 为你的Rider版本
  3. 若在你的 Package Manager 窗口中搜索不到 JetBrains Rider Editor,那么请检查 Packages 是否选择了 Unity Registry,选择 In Project就是在你自己的工程里搜索,如果你没有安装的话是搜不到的

Warning

不要直接浏览选择Rider
这里有坑, External Scriot Editor 的时候千万不要从你的文件目录里面选择你安装的 Rider.exe,如果不修改这个地方就一直不能把 Unity 和 Rider 联系起来!!
因为这个版本的 Unity 本身自带了 Rider 工具,如果不修改这个地方就一直不能把 Unity 和 Rider 联系起来!! 因为这个版本的 Unity 本身自带了 Rider 工具,官网有文章open in new window

看源代码的时候使用Rider->Settings->ColorSchema->General->FoldingText 可以调整折叠代码的颜色,便于查看源代码模式。 同时把warn的斜体去掉。
我把颜色调成#4B576E这样折叠起来的就不碍眼了,然后拉高函数定义的颜色亮度,更好查找。这样不会找影响自己写代码中折叠起来的块
设置Unity中Prefence->Color->PlayMode tint为#E0FDDF运行模式的时候更显眼不容易忘
之后双击就是在Rider中打开项目了。

关闭自动编译

每次修改脚本自己就编译,很卡,尤其是项目大的。
Edit->Prefrence->Asset Pipeline->AutoRefersh(Disable)
Settings->Languages&Frameworks->Unity Engine->Automatically refresh assets in Unity取消
修改完脚本之后Menu->Asset->Refersh Assetss手动刷新

C#的特点

  • 没有多重继承
  • 提供了GC和内存管理
  • 编译 为中间代语言CIL,使用.NetFramwork虚拟机CLR Common Language Runtime通用语言运行库解释执行
  • 沙币微软dotNet早期不开源,只能在windows运行,所以unity用mono把CIL直接用JIT编译成汇编运行
  • Mono是微软.Netopen in new window Framework的开源实现,基于C#语言的ECMA标准,包含C#编译器和CLR
  • 最开始不是开源的,但是后来开源了,dotnet库非常大,很多包是内部提供的,微软也赞助了基金会托管

📌Tip

复习一下概念
当前运行环境本地指令的提前编译(AOT就是传统理解的编译过程,编译一次就不需要再编译)或即时编译(JIT),Mono会有一部分代码通过AOT静态编译,以降低在程序运行时JIT动态编译在效率上的问题。
在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的即时编译不包括IOS,这也是U3D官方没有提供热更新的原因
Ahead of Time
AOT编译在应用程序执行前进行,并且通常在不同计算机上(需要运行的平台)执行,用于转换成对应平台的指令。
iOS平台是禁止使用JIT的,可Mono的AOT模式仍然会保留一部分代码会在程序运行时动态编译。
为了破解这个问题,Mono提供了一个被称为Full AOT的模式。即预先对程序集中的所有CIL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎。
iOS无法dll热更新的根本原因
实际上,iOS并非直接把JIT禁止了,而是IOS封了JIT内存(或者堆)的可执行权限,相当于变相的封锁了JIT这种编译方式。[1]

dotnet不是编程语言,但它能通过CLR(公共语言运行库)的JIT编译器CILCommon Intermediate Language(公共中间语言)编译成本机代码本机代码包括托管代码非托管代码

  • 托管代码:为DOTNET框架编写的代码,需要CLR。
  • 非托管代码:是指直接编译成目标计算机的机器码,比如Win32 C/C++ DLL。不在CLR控制下以运行。 本机代码可以在操作系统上执行,在执行的过程中CLR(公共语言运行库)会对托管代码进行内存管理、垃圾收集和异常处理等管理。并不是编译完就没事了

Unity跨平台

Unity的C#是先编译成 CIL 然后再解释执行,跨平台本质是解释器解释执行的问题,mono都支持,CLR以JIT为主但也支持AOT,.net5+使用RyuJIT,Unity使用什么取决于平台。因为IOS封锁了JIT,所以L2CPP 会把 IL 转成 C++,再用 Clang 编译成机器码(AOT)此时传统的热更就不能用了。所以用解释器方式热更(如 xlua、tolua、ILRuntime)或者HybridCLR 这种结合 AOT 和解释器的方式做热更

零散补充

C#中没有对象的copy方法,几种方法:

  • json序列化深拷贝适合复杂对象,不用自己写每个字段,但是 Unity的 JsonUtility 要求对象是[Serializable],而且只支持简单字段,复杂引用类型比如 Dictionary 不能直接支持,也比较浪费性能
  • 手动在类中实现clone方法把数据复制一份
MS推荐的代码规范open in new window命名风格示例
类 / 接口 / 方法 / 属性PascalCaseUserManager
变量 / 参数 / 字段camelCaseuserId
私有字段(有些风格)_camelCase_userName

C#支持顶级语句直接写在文件里,但是全局只能有一个文件直接使用顶级语句,编译器会自动帮你生成文件同名的类和Main方法,只有顶级语句(如变量定义、表达式、方法调用等)会被编译器自动放进 Main() 方法中,
类、结构、枚举、接口等声明则是正常全局作用域不会被包含进 Main,而是像平时一样单独存在于程序集里。



Last Edit: 2025-07-04 14:16:28

  1. 为什么iOS无法动态加载Dll? | 车斌的博客open in new window ↩︎

Loading...