惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
Recorded Future
Recorded Future
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
N
News | PayPal Newsroom
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Help Net Security
Help Net Security
博客园 - Franky
SecWiki News
SecWiki News
Recent Announcements
Recent Announcements
T
Troy Hunt's Blog
The Register - Security
The Register - Security
The Last Watchdog
The Last Watchdog
Webroot Blog
Webroot Blog
S
Security Affairs
博客园 - 司徒正美
S
Schneier on Security
I
InfoQ
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Forbes - Security
Forbes - Security
腾讯CDC
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic
Cloudbric
Cloudbric
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
V
Vulnerabilities – Threatpost
C
Check Point Blog
Google DeepMind News
Google DeepMind News
Google Online Security Blog
Google Online Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cisco Blogs
Schneier on Security
Schneier on Security
O
OpenAI News
K
Kaspersky official blog

会走路的三百块

part 4 踩坑记录 | 会走路的三百块 Unity-进阶知识 | 会走路的三百块 Unity-天命6源码 | 会走路的三百块 CICD | 会走路的三百块 part 1 linux的历史节点 | 会走路的三百块 C的编译器 | 会走路的三百块 字符串常量存储 | 会走路的三百块 第三章 数据和C | 会走路的三百块 类型转换和缩减 | 会走路的三百块 零散知识点 | 会走路的三百块 DNS选择机制 | 会走路的三百块 网络八股Cache | 会走路的三百块 第三章-数据和C | 会走路的三百块 一些零散的知识点 | 会走路的三百块 自顶向下 | 会走路的三百块 linux简单速通 | 会走路的三百块 设计图的概述 | 会走路的三百块 AI和自动化暂存 | 会走路的三百块 第一章 初识C语言 | 会走路的三百块 Games101 | 会走路的三百块 Unity-Lua补充 | 会走路的三百块 Unity-个人Demo | 会走路的三百块 Unity-基础知识 | 会走路的三百块 Unity-经典MMO | 会走路的三百块 Fastapi-Pydantic | 会走路的三百块 Fastapi-Sqlalchemy | 会走路的三百块 Scrapy-Redis分布式爬虫 | 会走路的三百块 Scrapy-Web集成 | 会走路的三百块 Scrapy爬虫 | 会走路的三百块 Twitter爬虫 | 会走路的三百块 Uinotes爬虫 | 会走路的三百块 PythonCheatSheet | 会走路的三百块 Python库 | 会走路的三百块 Python快速复习 | 会走路的三百块 Python语言进阶 | 会走路的三百块 Py自动化办公 | 会走路的三百块 Py踩坑记录 | 会走路的三百块 深入Python | 会走路的三百块 基本前端常识 | 会走路的三百块 文档分发与产品安全 | 会走路的三百块 跨平台应用脚手架 | 会走路的三百块 后端开发常见层式结构 | 会走路的三百块 mongodb | 会走路的三百块 PG-ep1 | 会走路的三百块 分库分表 | 会走路的三百块 docker常用知识 | 会走路的三百块 K3S | 会走路的三百块 后端常见安全措施 | 会走路的三百块 part 2 常用命令 | 会走路的三百块 part 3 shell脚本 | 会走路的三百块 服务器装机 | 会走路的三百块 测试与性能指标评估 | 会走路的三百块 缓存系统设计 | 会走路的三百块 Caddy | 会走路的三百块 Nginx-EP1 | 会走路的三百块 Nginx-EP2 | 会走路的三百块 EP1-设计模式 | 会走路的三百块 EP2-创建型模式 | 会走路的三百块 EP3-结构型模式 | 会走路的三百块 EP4-行为模式 | 会走路的三百块 EP5-其他 | 会走路的三百块 软件工程 | 会走路的三百块 日志模块设计 | 会走路的三百块 订单和支付模块 | 会走路的三百块 minio对象存储 | 会走路的三百块 Rustfs对象存储 | 会走路的三百块 一次性搞懂 | 会走路的三百块 基本硬件知识 | 会走路的三百块 开源协议 | 会走路的三百块 彩蛋收集 | 会走路的三百块 版本控制 | 会走路的三百块 项目管理 | 会走路的三百块 leetcode-EP1 | 会走路的三百块 第二章 C语言概述 | 会走路的三百块 第零章 计算机概论 | 会走路的三百块 爬虫基础 | 会走路的三百块 Sqlite | 会走路的三百块 README | 会走路的三百块 异步任务模块 | 会走路的三百块 用户和验权 | 会走路的三百块 通用数据库执行器 | 会走路的三百块 clickhouse | 会走路的三百块 会走路的三百块 Obsidian博客搭建 | 会走路的三百块 关于 | 会走路的三百块
Unity环境搭建 | 会走路的三百块
2026-05-25 · via 会走路的三百块

创建于 2024年2月29日 06:32:18 · 约2,093字

[ 📝Note ] 这是我为自己做的选择。

白鸟白鸟不要回头望
你要替我飞去那地方
一去那地方
那是你我共同故乡

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

摆脱中国特供版Unity ​

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

windows上的启动脚本为

bat

@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的为

sh

#!/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/

设置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 工具,官网有文章

看源代码的时候使用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手动刷新

如果脚本是有问题的,有可能进不去编辑器,打开Unity就卡死。一般打开的时候会进入安全模式,不运行用户写的托管代码,此时可以进去调整代码解决卡死。

C#的特点 ​

  • 没有多重继承
  • 提供了GC和内存管理
  • 编译 为中间代语言CIL,使用.NetFramwork虚拟机CLR Common Language Runtime通用语言运行库解释执行
  • 沙币微软dotNet早期不开源,只能在windows运行,所以unity用mono把CIL直接用JIT编译成汇编运行
  • Mono是微软.Net 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的程序集 ​

  • 程序集Assembly是编译输出的.dll或.exe文件。每个程序集内部包含 类 结构体 接口 元数据 IL 等,相当于jar包可被加载、引用、反射、执行。
    • 一个.csproj对应生成一个程序集,但是Unity的程序集额外由.asmdef控制
  • Unity在某文件夹中创建程序集的时候,Unity会自动把该文件夹下面的所有cs文件归属到这个程序集。当修改了某个程序集的cs文件Unity编译对应的程序集就可以不用整体编译。不同程序集下的类互相引用必须要在Inspector下指明引用关系后才能使用。
  • Unity 2017.3 开始,引入了AssemblyDefinition 文件(.asmdef)它让你可以手动划分程序集边界,而不是所有脚本都进 Assembly-CSharp.dll。每个 .asmdef 会生成一个独立的程序集DLL。Unity 会自动在构建时生成对应的 .csproj 文件
    • 记得如果更改了程序集的名字,除了文件名要在Inspector中Name也改掉,否则很容易找不到引用。
    • OverrideReferences 手动指定依赖的DLL,不然就全部引用上
    • RootNamespace 相当于整个自定义程序集的Namespace
    • DefineConstrains 预定义宏存在的话才会编译此DLL
  • Unity中默认带的程序集(其实他们几个互相是有引用关系的,但是一般不用管
    • Assembly-CSharp.csproj 包含所有游戏cs文件的脚本
    • Assembly-CSharp-Editor.csproj 包含Editor文件夹下的脚本(非Plugins文件夹)
    • Assembly-CSharp-firstpass.csproj Plugins/Standard Assets/Pro Standard Assets`下的(非Editor文件夹)
    • Assembly-CSharp-Editor-firstpass.csproj Editor下的Plugins/Standard Assets/Pro Standard Assets文件夹
    • 当使用.asmdef时,此.asmdef定义的文件夹默认规则失效。
    • 放在项目里的第三方dll其优先级均低于自定义asmdef,可以在自定义asmdef中放心使用

Unity跨平台 ​

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

选择自己的版本以查看Unity版本和C#版本对应特性支持

零散补充 ​

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

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

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

在Unity中复制的变量经常带个m_xxx 底层用 C++ 引擎 + C# 脚本,序列化时需要把对象字段保存到 .prefab.unity.asset 这类 YAML 文件里。内部引擎字段(通常是 private 或 protected)会加前缀 m_,表示 member field(成员变量) 于是用户可见的属性/变量就不带,序列化出来的底层字段带。

unity和C#中版本对应的关系,源生成器等东西


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