Stable Diffusion 确实是靠大模型支撑的,而参考图的“意义大小”,要看你是用原始的 SD 模型,还是带 扩展模块(ControlNet、Inpainting 等) 的版本。
GitHub - lllyasviel/ControlNet: Let us control diffusion models!
后来社区觉得“单靠文字+噪声,控制力太弱”,于是开发了 ControlNet / T2I-Adapter:
火柴人/骨架 (OpenPose) → 控制人物姿势。
线稿/草图 (Canny, Scribble) → 控制图像轮廓。
分割图 (Segmentation) → 控制不同区域是衣服、帽子、背景。
深度图 (Depth) → 控制空间透视和层次。
这时候,你的“参考图”才变得非常有意义 —— 因为 ControlNet 会解析你的图(提取姿势、边缘、分割),把它当作硬性条件加入扩散过程。
Micro-facets whose surface normal is oriented exactly halfway between the light direction and view direction will reflect visible light.
微面元的表面法线正好位于光方向和视方向之间时,会反射可见光。
However, in cases where the microsurface normal and the half normal are equal, not all microfacets will contribute as some will be blocked by shadowing (light direction) or masking (view direction) as illustrated in Figure 07.
然而,在微表面法线与半法线相等的情况下,并非所有微面元都会做出贡献,因为一些微面元会被阴影(光方向)或遮挡(视方向)所阻挡,如图07所示。
The surface irregularities at a microscopic level cause light diffusion. For example, blurred reflections are caused by scattered light rays. The rays are not reflected in parallel, so we perceive the specular reflection as blurred (Figure 08).
Substance PBR shaders use the GGX microfacet distribution.
双向反射分布函数(BRDF)是一个描述表面反射特性的函数。在计算机图形学中,存在不同的BRDF模型——其中一些在物理上并不可行。为了使BRDF在物理上可行,它必须保持能量守恒并表现出互易性。互易性指的是亥姆霍兹互易性原理,该原理指出,入射和出射的光线可以被视为彼此的逆过程,而不会影响BRDF的结果。
For a BRDF to be physically plausible, it must be energy conserving and exhibit reciprocity. Reciprocity refers to the Helmholtz Reciprocity Principle, which states that incoming and outgoing light rays can be considered as reversals of each other without affecting the outcome of the BRDF.
The BRDF used by Substance’s PBR shaders are based on Disney’s principled reflectance model. This model is based on the GGX microfacet distribution. GGX provides one of the better solutions in terms of specular distribution: with a shorter peak in the highlight and a longer tail in the falloff, it looks more realistic (Figure 10).Substance的PBR着色器所使用的BRDF基于迪士尼的原理性反射模型。该模型基于GGX微面分布。GGX在镜面反射分布方面提供了较好的解决方案:具有较短的亮点峰值和较长的衰减尾迹,看起来更真实(图10)。
左边是GGX,右边是Blinn
Energy conservation plays a vital role in physically-based rendering solutions.
As artists, we don’t have to worry about controlling energy conservation. This is one of the advantages of PBR: energy conservation is always enforced by the shader.
This is part of the physically-based model and it allows us to focus on art rather than physics.
Fresnel is not something that we control in PBR as we did in traditional shading. Again, this is another aspect of physics that is handled by the PBR shader.
When viewing a surface at a grazing incidence, all smoothed surfaces will become reflectors at nearly 100% at a 90-degree angle of incidence.
The most important factor here is the angle between the normal of each microfacet and the light, rather than the angle between the normal of the ‘‘macrosurface’’ and the light. Because the light rays are dispersed in different directions, the reflection appears softer, or dimmer.
Using the index of refraction (IOR) for a surface, you can derive the amount that is reflected.
使用表面的折射率(IOR)可以计算出反射的光线量。
The amount of light that is refracted into the surface is referred to as 1–F0.
The F0 range for most common dielectrics will be from 0.02-0.05 (linear values). For conductors, the F0 range will be 0.5-1.0. The reflectivity of a surface is therefore determined by the refractive index as shown in the equation below
直觉上觉得“光垂直打到表面(0°入射)应该完全反射”,但物理上不是这样的——哪怕在 0° 入射,还是会有一部分能量进入物体(折射),另一部分才是镜面反射。
IOR(Index of Refraction,折射率)
直观比喻
IOR=1.0:光速没变 → 就像走在真空中。
IOR=1.5:光进入玻璃 → 相当于“走进泥地,速度变慢,方向改变”。
IOR=2.4(钻石):光被强烈减速和偏折 → 所以才闪烁耀眼。
常见材料的 IOR 值
材质 | IOR | 备注 |
---|---|---|
空气 | ~1.0 | 几乎不改变光速 |
水 | 1.33 | 轻微放大和折射 |
普通玻璃 | 1.5 | 常见窗口/瓶子 |
钻石 | 2.4 | 折射强,闪烁感 |
金属 (Cu, Au) | 复杂(有实部 + 虚部) | 反射率极高,几乎不透光 |
计算机图形学 (CG) 里的意义
非金属材质 (Dielectric):
反射率由 IOR 决定(比如水、玻璃、塑料)。
表面反射随角度变化(菲涅耳效应)。
金属材质 (Conductor):
用 复数 IOR(n + ik)描述,k 表示吸收。
导致几乎全反射(彩色高光)。
反射率不是固定的
只有在 垂直入射 时,反射率是一个固定值。
这个公式是给0度垂直入射时使用的,
例子:
空气 → 水:F0 ≈ 0.02(2% 反射)
空气 → 玻璃:F0 ≈ 0.04(4% 反射)
空气 → 钻石:F0 ≈ 0.17(17% 反射)
只有在 垂直入射 时,反射率是一个固定值。
入射的是任意角度(θ)时的反射率,这种情况叫菲涅尔效应
【技术美术百人计划】图形 2.7.2 GPU硬件架构概述_哔哩哔哩_bilibili
GPU全称是GraphicsProcessingUnit,图形处理单元。它的功能最初与名字一致,是专门用于绘制图像
和处理图元数据的特定芯片,后来渐渐加入了其它很多功能。
我们日常讨论GPU和显卡时,经常混为一谈,严格来说是有所区别的。GPU是显卡(Videocard、
Displaycard、Graphicscard)最核心的部件,但除了GPU,显卡还有散热器、通讯元件、与主板和显示
器连接的各类插槽。
线程不能独立执行指令而是以一个WARP中32个线程为单位,只有每个WARP间才是独立的。
我们其实可以把它改造成使用if shader中的一个属性变量或者公共变量来做判断,
这样可以减少我们的变体数量。比如说我们在shader的属性里面设置一个变量。他的范围是0~1。对应我们的一个变体,
然后写一个判断if x < 1当我们把它设置为零的时候,
我们可以保证所有执行这个shader的线程中都是 true,
那么我们能够使得线程全部只执行true中的指令,从而获得使用变体相同的效果。
而现在我们使用的Urp管线中。,
他能否使用srp batch。关键,就是相同的shader中他使用的变体是否一致。
blur-blur-blur-blur
世界雾效(Global/Exponential Fog)
本质:是一种 后处理(post-process),直接在屏幕空间根据像素深度计算雾的混合。
实现方式:
读取深度图(Z-Buffer)。
根据相机到像素的距离计算一个雾因子。
最后用
lerp(物体颜色, 雾颜色, 雾因子)
混合。
特点:
算法简单,性能开销很小。
整个场景被均匀“染雾”,效果比较平面化。
雾的厚度不会和光线、体积、阴影互动。
常见效果:Unity 的 Exponential Fog、Linear Fog。
👉 可以理解为 “一张深度渐变的滤镜”。
2. 体积雾(Volumetric Fog / Volumetric Lighting)
本质:是一种 体积渲染(Volume Rendering),雾被看作是填充在三维空间中的一个体积介质。
实现方式:
把空间离散成 3D 体素(volumetric grid / froxel)。
在光照计算时考虑雾的散射和吸收。
相机射线在穿过雾体时累积光照(积分计算)。
特点:
雾会和光照、阴影互动,出现 “光柱(God Rays)”、体积阴影 等效果。
可以有局部浓雾、烟尘、火焰之类的体积效果。
开销比世界雾效大很多。
常见效果:Unity HDRP 的 Volumetric Fog,UE 的 Volumetric Fog + Light Shafts。
👉 可以理解为 “雾是三维空间的一个真实物质”。
雾效还是 后处理型的世界雾(屏幕空间全局雾),只是在上面叠了一个噪声纹理,让它有点动态感。但这样的问题是 —— 噪声始终是贴在屏幕上的,不管你怎么转相机,噪声只是随时间偏移,看不到“真正的世界流动方向”。
独立性(逻辑层面)
独立操作系统:虚拟机里可以装任意系统(Ubuntu、Windows、甚至 macOS),跟宿主机系统不同步。
独立文件系统:虚拟机的磁盘一般是一个单独的
.vmdk
或.vdi
文件,里面的文件目录对宿主机来说就是“一个大文件”,互相不可见。独立运行环境:你可以在虚拟机里装和主机完全不同的软件、配置完全不同的环境,它不会直接影响宿主机。
👉 所以在学习/开发时,虚拟机相当于一台“沙盒电脑”。
2. 共享性(硬件层面)
虚拟机跑在 宿主机的硬件 上:CPU、内存、硬盘、网卡都是主机的。虚拟机只是通过虚拟化软件(VMware、VirtualBox)划分资源来用。
资源有限制:比如分配 4GB 内存给虚拟机,宿主机实际少了 4GB 可用。
性能受限:虚拟机的性能比不上直接装系统,因为有一层虚拟化开销。
3. 联系点(交互层面)
网络:虚拟机网络可以设置成桥接、NAT、仅主机模式,能决定它和主机/外网之间是否能互通。
文件共享:通过共享文件夹、复制粘贴等方式,虚拟机和宿主机可以互传文件。
安全性:正常情况下虚拟机里的病毒不会直接跑到宿主机,但如果开了共享文件夹或网络通信,还是可能间接感染。
Note: Unity Remote replaces the iOS Remote and Android Remote applications from earlier versions of Unity. Unity no longer supports these older applications.注意:Unity Remote取代了Unity早期版本中的iOS Remote和Android Remote应用程序。Unity不再支持这些旧应用程序。
社区确认的稳定解决方案
1. 用离线模块安装
打开 Unity 官方归档页面:Unity Download Archive
找到你的 Unity 版本(比如
2022.3.59f1
或6000.2.0f1
),点击右边的 “Downloads (Win)”展开后会有一堆
.exe
/.pkg
安装器,里面就包含 Android Build Support、Android SDK & NDK Tools、OpenJDK 等下载对应模块的安装器 → 双击安装 → Hub 会自动识别
👉 这是目前最稳定的方法,绕过 Hub 的在线验证。
Unity官方下载_Unity新版_从Unity Hub下载安装 | Unity中国官网
冯乐乐这样提供完整项目(含源文件)可直接运行的教学在圈内非常受欢迎。我查了下,除了冯乐乐之外,还有几位博主或开源作者也提供类似高质量的 Unity(或图形方向)项目,下面推荐几个值得学习和直接上手的项目:
candycat1992(冯乐乐本人 GitHub 账号)
Unity_Shaders_Book:对应他主讲的《Unity Shader 入门精要》书籍,Project 包含所有示例源码。非常适合跟着书来实践 GitHubGitHub+2GitHub+2。
NPR_Lab / Shadertoy_Lab:一些类似 Shadertoy 的非真实感渲染实践项目,适合练习风格化效果 GitHub。
PPCA-Raytracer-2022(教学光线追踪渲染器项目)
PPCA-Raytracer-2022 是一个基于 Rust 的教学项目,带完整源码,可以实现 Path Tracing 渲染器,包含学习光线追踪算法的完整流程,很适合深入图形 renderer 的开发 CSDN Blog+4GitHub+4GitHub+4。
AboutGameEngineGraphics(图形学资源集)
虽然不是单一教学项目,但该仓库汇总了大量图形学课程、开源项目、教程记录,非常适做学习资料目录。从中你能找到很多可运行的示例仓库 GitHub。
我bulid Setting里面设置成安卓了,然后Editor里也设置成了anydivice,手机也开了developer,开了debugg允许,然后手机上的remote还是没反应啊
这个报错在社区里很常见,尤其是第一次尝试 Unity Remote + 安卓 的时候。
https://developer.android.com/studio
1. 用 Android Studio 官方 SDK
去 Google 官方下载 Android Studio(安全、正版)。
安装好后,它自带 Android SDK Manager,可以一键装 SDK、NDK、Platform Tools。
默认路径:
Windows:
C:\Users\<用户名>\AppData\Local\Android\Sdk
macOS:
~/Library/Android/sdk
然后在 Unity →
Preferences → External Tools
手动指定:SDK →
...\Android\Sdk
NDK →
...\Android\Sdk\ndk\版本号
JDK → 用 Android Studio 自带的,或者安装 Adoptium Temurin JDK 11
SDK、NDK、JDK、Gradle,好像一堆东西必须都装,其实它们各有明确分工。
JDK (Java Development Kit)上下文:相当于“Java 语言的编译器 + 工具链”
SDK (Android Software Development Kit)
作用:Android 平台开发工具集合,包含:
platform-tools
→ adb、fastboot 等工具,用来和手机通信。build-tools
→ aapt、dx 等,打包 APK 必需。platforms
→ 各 Android 版本 API 库。
NDK (Android Native Development Kit)
作用:编译 C/C++ 代码成 Android so 动态库。
在 Unity 里:
如果项目里有用到 IL2CPP(Unity 把 C# 转成 C++ 再编译),就需要 NDK。
插件里有 C++ 部分(比如自定义底层库)也要用它。
上下文:相当于“安卓的 C/C++ 编译器”。纯 C# 项目几乎也要用它(因为 IL2CPP)。
Gradle
作用:Android 的构建系统,相当于“自动化编译+打包工具”。
在 Unity 里:
Unity 导出 Android 工程时,Gradle 负责把工程拼成 APK / AAB。
上下文:相当于“工程经理”,负责调度 JDK、SDK、NDK 来完成整个构建过程。
总结在 Unity 里的调用顺序
Unity 把 C# 编译(IL2CPP → C++ → NDK 编译 → so)。
Unity 用 JDK 编译 Java 桥接层代码。
SDK 提供 adb、aapt、dx 等打包工具 + API 库。
Gradle 把所有东西组织起来 → 打包 → 签名 → 生成 APK/AAB。
adb (SDK) 把 APK 装到手机上 → Unity Remote / 调试才会有反应。
所以你在 Unity Preferences → External Tools 看到的路径,其实就是告诉 Unity:
JDK 在哪(编译 Java)
SDK 在哪(工具 + 手机通信)
NDK 在哪(编译 C++ / IL2CPP)
Gradle 在哪(工程管理 + 打包)
DK / SDK / NDK / Gradle 并不是 Unity 专用的东西,而是安卓开发必备的通用工具链。
所以:
可以共用
SDK:Android SDK 是版本化的,可以安装在一个公共目录(例如
D:\Android\Sdk
),多个 Unity 都能指向它。NDK:Unity 对 NDK 版本有要求(比如 Unity 2022 要求 r21e,Unity 2021 要求 r19),所以要么你给每个 Unity 配对一个 NDK,要么在公共目录里放多个版本(
ndk/21.4.7075529
,ndk/19.2.5345600
),Unity 的 External Tools 路径指向对应版本就行。JDK:Unity 推荐 JDK 11(或 JDK 8),基本可以共用一份,路径填同一个即可。
Gradle:Unity 自带 Gradle wrapper,不必单独配置。但如果想手动指定,也可以共用。
“Yes, you don’t need to install SDK/NDK for every Unity version. Just download once (e.g. with Android Studio) and point all Unity versions to it in Preferences > External Tools.”
D:\Android\
├─ Sdk\
│ ├─ platforms\
│ ├─ build-tools\
│ └─ ...
├─ NDK\
│ ├─ 21.4.7075529\
│ ├─ 19.2.5345600\
│ └─ ...
└─ JDK\
└─ jdk-11.0.23\
然后在 Unity Preferences > External Tools 里手动指定:
SDK → D:\Android\Sdk
NDK → D:\Android\NDK\21.4.7075529 (不同 Unity 可以切换)
JDK → D:\Android\JDK\jdk-11.0.23
Unity 2021.3.41f1 对 JDK / NDK / SDK 的版本要求
根据 Unity 官方文档整理如下:
• Android SDK
Unity 官方提示:没有严格版本要求,只要是“相对新的 SDK”就行。
但通过 Unity Hub 安装的版本是:
SDK Build Tools:32.0.0
Command-line Tools:6
Platform Tools:30.0.4
对比其他版本:Unity 2021.3.0 – 2021.3.40f1 用的是 30.0.2
Unity 2021.3.44f1 之后是 34.0.0 Unity Discussions+11Unity Documentation+11Unity Documentation+11docs.unity.cndocs.unity.cn+6Stack Overflow+6YouTube+6
• Android NDK
Unity 2021.3 LTS 支持的 NDK 版本是 r21d (21.3.6528147) Unity Documentation+4Unity Documentation+4Unity Documentation+4
• JDK (Java Development Kit)
2021.3.41f1 及以后开始使用 OpenJDK 11。
在此版本之前的 2021.3 系列默认是 OpenJDK 8 Unity Discussions+13Unity Documentation+13Unity Discussions+13
工具 | Unity 2021.3.41f1 推荐使用版本 | 查看方式 |
---|---|---|
JDK | OpenJDK 11 | Preferences → External Tools → Android → JDK 路径 |
NDK | r21d (21.3.6528147) | Preferences → External Tools → Android → NDK 路径 |
SDK | Build Tools v32.0.0 (Platform Tools 30.0.4) | Preferences → External Tools → Android → SDK 路径 |
如何确认版本 | 路径复制到文件管理器,查看子目录版本(如 build-tools/32.0.0/ ) |
同上 |
https://zhuanlan.zhihu.com/p/687372068
OpaqueTexturePyramid是一种特殊的纹理金字塔,用于在渲染透明材质时模拟不同模糊程度的投射效果。
它通过生成多个层级的透明纹理(Mipmaps),每个层级代表不同的模糊程度,从而实现对不同粗糙度的透明材质的准确模拟。
在Unity的手机端PBR渲染中,OpaqueTexturePyramid可以帮助开发者高效地生成和处理透明材质的光照效果,特别是在模拟玉石、玻璃、钻石和水晶等材质时,能够提供更加真实和细腻的视觉体验。
通过这种方式,开发者可以避免复杂的物理模拟计算,同时保持材质在不同光照条件下的健壮表现。
https://docs.unity3d.com/2021.3/Documentation/Manual/android-supported-dependency-versions.html
Redmi K60 这种国内安卓机型,要让 Unity Remote / adb 正常识别,确实需要安装 对应品牌的 USB 驱动,
USB 驱动 (USB Driver)” 指的是 要安装在电脑上的软件,不是手机上的。
手机 → 已经有 Android 系统,USB 调试功能在 MIUI 的“开发者选项”里打开就行,不需要额外装东西。
你该做的事情
在 Windows 电脑 上安装 小米/Redmi 官方 USB 驱动(或者 Google USB 驱动)。
装好后再把手机插到电脑 → Windows 会用这个驱动去识别手机。
这样
adb devices
才能列出你的 Redmi K60。
电脑如何看待 USB 设备
当你把手机插到电脑上,电脑并不知道它能做什么。
Windows / Linux / macOS 只会问设备:“你是谁?你提供什么接口?”
手机会通过 USB 的 设备描述符 (Device Descriptor) 告诉电脑:“我能做存储盘、MTP 文件传输、调试接口、音频设备…”
问题是:操作系统默认只认识最常见的接口(U盘、键盘、鼠标、MTP)。
像 adb 调试接口 (Android Debug Bridge interface),Windows 并没有内建驱动。
它告诉操作系统,“当这个设备声明自己是
Android ADB Interface
时,应该用这样的协议与它通信”。没有驱动,Windows 只会当它是“未知设备”或“仅能充电”。
为什么 adb / Unity Remote 需要
adb 工作原理:它通过 USB 的一个专用接口(ADB Interface)发送命令和接收数据。
比如
adb devices
会问所有已连接的设备:“报上名来!”手机通过这个通道回一个序列号。
Unity Remote:Unity Editor 在 PC 上实时运行场景,把 GameView 的画面流(压缩的 JPEG 帧 + 输入事件)通过 adb 这条管道传到手机。
👉 如果没有 USB 驱动:
系统层面根本不知道怎么跟手机开通这个“调试通道”。
adb 就算装了,也会显示 空列表 或
unauthorized device
。Unity Remote 因为依赖 adb,当然就黑屏。
Qualcomm Driver
这是 底层芯片厂商的 USB 驱动。
用途主要是:
在 高通 9008/9006 模式下(手机进入 EDL、刷机、救砖模式),电脑能识别手机;
一般用户平时传文件、调试 app 用不上它。
对 Unity Remote / adb 来说,不是必须的。
但是安装了也没坏处,它只是让 Windows 能识别更多“底层模式”的接口。
👉 可以理解为:紧急维修通道,不是给 Unity Remote 或日常开发用的。
如果我又装了Google driver,两个会冲突吗
不会“硬冲突”,但可能会出现 Windows 默认挑错驱动 的情况,所以需要你手动确认。
为什么不会真正冲突
驱动的匹配依据是 设备的硬件 ID (VID/PID)。
小米/Redmi 的设备 ID 在 Windows 设备管理器里是
VID_2717
(小米分配的厂商号)。小米 ADB Driver 会写规则:“VID_2717 用我”。
Google USB Driver 默认只匹配
VID_18D1
(Google Nexus/Pixel 设备)。所以一般不会抢占彼此。
但可能的情况
有时候,Windows 会把手机识别成 通用 MTP 设备 或 未知设备,这时如果你同时装了 Google 驱动和小米驱动,系统可能会“随便挑一个 INF 文件”去绑定,这就会导致 adb 不认。
解决办法(手动指定)
如果你装了两个:
插手机 → 打开 设备管理器 (Device Manager)。
找到
Android Device
或Portable Devices
下的手机。右键 → 更新驱动程序 → “浏览计算机以查找驱动程序” → “让我从计算机上的可用驱动程序列表中选择”。
选 Xiaomi ADB Interface(或
Android ADB Interface
)。
这样就强制绑定到正确的 ADB 驱动,避免系统随便挑。
Google USB Driver 和 小米 ADB Driver 不会直接冲突。
如果都装了,要确保手机设备绑定的是 小米的 ADB 驱动,否则 adb 可能连不上。
核心检查命令:
adb devices
如果能看到 device,说明驱动正确。
https://xiaomidriver.com/install-adb-driver
在 Windows PowerShell 里,如果你要运行当前目录下的可执行文件,需要写成 .\adb
而不是直接 adb
。
adb 通道已经打通,你可以放心继续测试 Unity Remote 了
建议的排查步骤
Unity Editor → Preferences → Devices → 选 Any Android Device。
Build Settings → 切到 Android。
新建一个空场景 → Camera + Cube。
打开手机 Unity Remote 5 App。
确认 adb devices 显示
device
。Unity Editor → 点击 Play。
👉 如果这样还是黑屏,基本可以判断是 Unity Remote 本身的兼容问题(尤其是 Unity 2021.3+ 和部分 MIUI 系统)。
🚩 社区“最后的招数”
很多 Unity 开发者放弃 Remote,因为它传输延迟大、画质差,还经常连不上。
替代方案:
直接 Build APK 安装到手机(最稳定)。
用 scrcpy(开源投屏工具)把手机画面投到电脑上,这样几乎无延迟。
6,毒蛇出去
How to Install ADB Driver using the Windows Device Manager
OEM(Original Equipment Manufacturer)解锁,直译就是“允许厂商解锁”。
在 Android 体系里,它指的是 允许解锁 Bootloader(引导加载程序)。
Bootloader 是手机开机时最底层的程序,相当于“守门员”,决定能不能加载操作系统内核。
默认情况下,Bootloader 是上锁的,防止用户刷机、改系统。
开启 OEM unlock 开关 = 告诉手机:
👉 “以后我允许自己去解锁 Bootloader”。
单纯打开 OEM unlock 开关,不会立刻清空数据,也不会影响日常使用。
但是如果你之后在 fastboot 模式里跑了
fastboot oem unlock
或fastboot flashing unlock
,那就真的解锁 Bootloader,手机会被清空。有些金融类 App、游戏可能会检测 Bootloader 状态,解锁后会认为手机“不安全”。
🔑 默认行为(没关掉时)
当你第一次用
adb devices
连接手机时,手机会弹出 “是否允许 USB 调试” 的弹窗。你点 允许 并勾选“始终允许”后,手机会保存一份 授权密钥。
但是:Android 默认有一个 7 天的超时(不同版本可能略有不同)。如果超过这个时间没再连接,授权会过期,手机下次还会重新弹出确认框。
📌 打开 “Disable adb authorization timeout” 的效果
顾名思义:禁用 adb 授权超时。
一旦你授权过电脑,这个授权就 不会过期,除非你手动在开发者选项里点击“撤销 USB 调试授权”。
这意味着:
开发者不必每隔一段时间重新点授权弹窗。
长期做 Unity Remote、真机调试、自动化测试的场景会更方便。
🔑 什么是 Logger buffer
Android 系统里有一个 日志系统 logcat,开发者用它来输出调试信息(
Log.d()
,Log.e()
等)。这些日志会先写进一块内存里的 环形缓冲区 (circular buffer)。
Logger buffer size 就是控制这块缓冲区有多大。
📌 不同选项的含义
常见可选值有:
64K / 256K / 1MB / 4MB / 16MB …
越大 → 能保存的日志越多,不容易被覆盖掉。
越小 → 占用内存更少,但日志很快会滚动丢失。
⚠️ 使用场景
原生 App / 系统开发者:会关心这个,因为需要长期收集 logcat 日志(例如排查 bug)。
Unity 开发者:通常用不到,除非你在 Android Studio / adb logcat 里抓日志调试游戏崩溃。
普通用户:开大缓冲区不会带来明显好处,反而长期写日志可能略微增加耗电。
本质上都是日志缓冲区 → 界面显示器
Unity 的
Debug.Log()
→ 打到 Editor ConsoleAndroid 的
Log.d()
/ Unity Android Runtime 日志 → 打到 logcat buffer
两者都能分类(Info / Warning / Error)。
都是“先进先出”的形式,旧的日志会被新的覆盖掉。
特性 | Unity Console | Android logcat |
---|---|---|
存储位置 | 内存里,跟随 Editor 打开关闭 | 内存环形缓冲区,由系统维护 |
大小限制 | 理论上无限制(但 Unity Editor 会卡顿,如果日志爆量) | 固定大小(由 Logger buffer size 决定,默认 256KB~1MB) |
输出来源 | Unity 引擎(C# 脚本、Editor 内部模块) | 整个 Android 系统(Unity Runtime、系统服务、其它 App) |
查看方式 | Unity Editor Console 窗口 | adb logcat 、Android Studio Logcat 窗口 |
持久化 | Unity 不自动保存,关 Editor 日志就没了 | logcat 也不持久,缓冲区满了就覆盖(除非用工具导出) |
“Select log level”(选择日志级别)也是 Android 开发者选项里和 logcat 有关的一个开关。它决定了 系统在 logcat 缓冲区里记录哪些等级的日志。
Android 的日志有几个标准级别(Unity 在 Android 上跑的时候,Debug.Log()
这些最终也会落到这里):
Verbose (V)
最详细,几乎所有调试输出都会写进日志。
包括开发者用的
Log.v()
。
Debug (D)
开发调试信息,
Log.d()
。Unity 的
Debug.Log()
默认也是D
。
Info (I)
一般信息,说明 App 或系统的正常运行状态。
Warn (W)
警告,可能是潜在问题,但不会立刻崩溃。
Error (E)
错误,功能失败或崩溃点,
Log.e()
。
Assert / Fatal (A/F)
严重错误,通常直接导致崩溃。
“Enable GPU Debugging Layers”(启用 GPU 调试层)
Android 图形栈基于 OpenGL ES / Vulkan。
平时运行时,驱动只执行渲染命令,不做额外检查。
打开 GPU Debugging Layer 后,系统会在 GPU API 调用之间插入一个 验证层 (validation layer):
检查你调用 OpenGL/Vulkan API 是否合规(比如非法的参数、越界访问、未初始化资源)。
打印更多调试信息到 logcat。
有时还会模拟错误场景,帮助开发者定位 bug。
这和 PC 上的 Vulkan Validation Layers、DirectX 的 Debug Layer 是同一个思路。
“Allow screen overlay”(允许屏幕叠加层设置),有时在不同的 Android 版本 / ROM 里也会叫 “Draw over other apps” 或 “允许在其他应用上层显示”。
Android 6.0 (Marshmallow) 开始,Google 把这个权限收紧:
需要用户手动在“开发者选项 / 应用权限”里允许。
因为浮窗可能被恶意利用,比如做“钓鱼”界面、覆盖登录按钮窃取密码。
有些系统设置界面(比如修改权限、允许安装 APK)会强制禁止 Overlay,以避免恶意覆盖用户的确认按钮。
✅ 和 Unity 的关系
对 Unity Remote / 普通 Unity 游戏没有影响。
只有当你在做 悬浮窗工具类 App(例如 Unity 打包一个桌面悬浮球)时,才需要用户开启这个权限。
你用 Unity Build → Android 得到的 .apk 文件,就是 Android 系统可以安装的应用包。只要手机允许安装,它就能运行。
⚠️ 注意事项
安装来源:
如果不是从应用商店下载,第一次安装 apk 时系统会提示 “安装未知来源应用”。
需要在“设置 → 安全”里允许对应的安装来源(比如文件管理器 / 浏览器)。
ABI / CPU 架构:
Unity 默认会打包 ARMv7/ARM64 版本。
如果你在 Build Settings 里勾错(只勾 x86),部分手机可能装不上。
签名 (Keystore):
Unity 默认会给你一个 Debug 签名,能装到手机上。
但如果以后要上传到应用商店,就需要自己生成 Release 签名。
USB 调试 vs 安装 APK:
Unity Remote 走的是 adb 实时串流,不是真正运行 APK。
打包 apk 并安装,才是最接近最终效果的测试。
你打出来的 APK 里面 没有包含 64 位 (ARM64) 的 so 库,而你的手机(Redmi K60,骁龙8+ Gen1)是 64 位 CPU。Android 系统从 2019 年 8 月 Google Play 政策开始,强制要求 所有新应用必须支持 64 位,所以 MIUI/安卓也会提示“不适配”。
如果你用的是 IL2CPP(推荐),ARM64 编译可能会稍微慢一点。
这说明如果你的脚本后端还是用默认的 Mono,那么那个选项就不会显示。你得改成 IL2CPP 才能看到 ARM64、ARMv7 等勾选项。Unity Discussions
将 Scripting Backend 从
Mono
改为IL2CPP
。Unity Editor 会重新编译一些内容。
此时你应该能看到 Target Architectures,然后可以勾选
ARMv7
和ARM64
。
这样就能打上 64 位支持的 APK 了。
我在unitybuild Android版本,如果包含多个scene,手机上会怎么办
什么也不会“自动发生”。把多个 Scene 勾进 Build 后,Unity 只会把它们打进包里;手机启动时只会进入 列表里索引 0 的那个场景。其余场景只有在你用代码(或场景过场工具)去加载时才会打开。
启动场景
Build Settings → Scenes in Build 中 排在最上面的场景(index 0) 会在手机上首次启动时加载。
没有内置的“关卡选择界面”,除非你自己做。
其他场景
只是被打包进 APK/AAB,不会占用运行时内存,直到你加载它们。
需要你调用
SceneManager.LoadScene(...)
或LoadSceneAsync(...)
才会切换。
包体/下载:多场景会增大包体,但只影响安装大小,不会在未加载时占内存。若包体太大,可以用 Addressables + Play Asset Delivery 把部分场景做成按需下载的 Asset Pack(install-time / fast-follow / on-demand)。
(如果你的项目装了新输入系统)在 Project Settings → Player → Other Settings → Active Input Handling 选择 Both,保证
Input.touches
可用。手机上运行:
左半屏按下拖动 = 移动(浮动摇杆)
右半屏拖动 = 视角转动
不需要重力、不会被碰撞阻挡(纯自由飞)
这份脚本是有“条件分支”的:
在 Editor / Standalone 平台
使用
Input.GetAxis("Horizontal")
、Input.GetAxis("Vertical")
→ 键盘 WASD使用
Input.GetAxis("Mouse X")
、Input.GetAxis("Mouse Y")
→ 鼠标移动用
#if UNITY_EDITOR || UNITY_STANDALONE
包起来,所以只有在电脑 Editor 里才会走这部分。
在 Mobile 平台 (Android/iOS)
使用
Input.touches
检测手指 ID 和位置 → 左屏浮动摇杆 / 右屏视角这些只在 真机运行时才会触发,Editor 里是不会执行的。
换句话说:电脑上跑的就是键鼠逻辑,手机上跑的就是触控逻辑,互不干扰。
Unity 默认是 竖屏 (Portrait),所以你打包到手机上跑的时候,场景就竖过来了。做 FPS 相机控制通常需要 横屏 (Landscape)。
方式一:在 Player Settings 里改
打开 Unity →
File → Build Settings → Player Settings
。找到 Resolution and Presentation (旧版本可能在
Other Settings
)。找到 Default Orientation,改为:
✅ Landscape Left 或 Landscape Right(推荐 Left)。
❌ 不要用 Portrait。
重新 Build → 手机运行时就是横屏了。
你现在看到竖屏是因为 Unity 默认 Player Settings = Portrait。
👉 改成 Landscape Left 就能解决,FPS 控制逻辑也会符合常规习惯。
Editor 里看到的 Game 视图 ≠ 真机看到的范围,因为手机分辨率、屏幕比例可能不同。
Unity Editor 里模拟手机分辨率
打开 Game 窗口 → Aspect Ratio 下拉菜单。
添加一个新的分辨率(比如 Redmi K60 是 3200×1440, 20:9)。
选择这个分辨率,就能在 Editor 里看到和真机接近的画面比例。
这样你能大致预览“横屏状态下手机能看到多少”。
using UnityEngine;
[ExecuteAlways]
public class CameraFrustumGizmo : MonoBehaviour
{
void OnDrawGizmos()
{
Camera cam = GetComponent<Camera>();
if (cam != null)
{
Gizmos.color = Color.yellow;
Gizmos.matrix = transform.localToWorldMatrix;
Gizmos.DrawFrustum(Vector3.zero, cam.fieldOfView, cam.farClipPlane, cam.nearClipPlane, cam.aspect);
}
}
}
Gizmos 画辅助框
你还可以写个小脚本,在 Scene 视图里画出相机可见范围(Gizmos 的视锥体),这样可以一眼确认相机能“看到多大一块”。
真机范围取决于 屏幕比例 + 相机 FOV。
在 Editor 里用 Game View → 手机分辨率模拟,能大致确认。
最准确的:真机运行 + 测试标记物。
手机桌面上显示的 App 名 是取自 Unity 项目里的 Player Settings → Product Name 字段,而不是 APK 文件名。
Android 安装 App 时,会读取 APK 里的 AndroidManifest.xml。
Manifest 里包含
<application android:label="XXX">
→ 这就是手机上显示的应用名。Unity 打包时,这个
label
字段来自 Player Settings 里的 Product Name。
你打包时生成了
MyFirstBuild.apk
。在 Unity →
Edit → Project Settings → Player → Product Name
里填的是My Unity Game
。手机安装后:
APK 文件 =
MyFirstBuild.apk
桌面显示 =
My Unity Game
✅ 怎么改
打开 Unity →
Edit → Project Settings → Player
。在 Player Settings → Product Name 改成你想要的名字。
重新 Build APK → 手机上显示的名字就变了。
有些 Shader 在不同图形 API 下效果不同,甚至出 bug(常见:光照、阴影、半透明)。
👉 解决:确认 Player Settings → Graphics API,用和手机一致的(比如 Android → Vulkan 或 GLES3)。
在 Editor →
Scene/Game
里切换 API 做对比。
Shader 精度
PC Shader 默认
float
精度很高。移动端很多地方退化成
half
/lowp
,容易出现偏色、锯齿、闪烁。
👉 解决:在 Shader 中显式写float
,或者确认用对了精度。
材质/贴图压缩
Editor 里贴图一般显示原图。
打包到 Android,Unity 会自动用 ETC2/ASTC 压缩纹理。
这会导致:颜色偏差、模糊、带格子感。
👉 解决:选中贴图 → Inspector → Android 平台 → Format 里改压缩方式(甚至用 RGBA32 直存)。
光照 & 后处理
Editor 里可能开了 Scene 灯光 / Post Processing。
手机性能不够,Unity 在打包时自动降级/关闭部分特效。
例如:Bloom、AO、实时阴影在低端机上被禁用。
👉 解决:检查 Quality Settings 和 Graphics Settings,看看 Android 平台是不是单独用了更低的质量级别。
找到 Other Settings → Rendering → Auto Graphics API,取消它
这时你就会看到 Graphics APIs 列表,可以手动选择 Vulkan、OpenGL ES(GLES)等,决定你的 Android 构建使用哪个图形接口
Android DevelopersUnity Documentation
Override default graphics APIs
You can override the default graphics APIs and use an alternate graphics API for the Editor and Player. Use the following steps:
In the Player settings > Other settings > Rendering section, disable the Auto Graphics API for a platform (Windows/Mac/Linux).
When Auto Graphics API for a platform (Windows/Mac/Linux) is disabled, the Unity Editor displays a list of supported graphics API for that platform and uses the first API in the list. The graphics API at the top of the Graphics API list is the default API. If the default API isn’t supported by a specific platform, Unity uses the next API in the Graphics API list. For the Player builds, Unity tries to use only those graphics APIs added to the list.
Select the Add (+) button, then select the graphics API from the dropdown.
目前 Unity 不支持为 Editor 和 Android 真机分别设置图形 API,它们共享同一个配置入口。
官方说明与社区经验
统一配置入口
在 Unity 文档里明确指出:
如需自定义图形 API,需要到 Project Settings → Player → Other Settings → Rendering 中,取消勾选 Auto Graphics API,手动设置 API 列表,例如 Vulkan、OpenGL ES3 等。这个设置一旦应用,就会影响:
Editor 播放模式中用于模拟的图形 API(在该平台上优先使用)。
最终构建出来的 Android Player 真机运行时使用的图形 API。
也就是说,Unity 用同一套 Graphics API 列表来同时控制 Editor 和 Player。你无法指定两个不同的列表。
Unity DocumentationUnity Support
社区反馈建议
有开发者指出,在遇到 Editor 模拟与真机 Shader 行为差异时:
“如果你强制把 Editor 模拟用的 API 和真机一致(比如都选 GLES3/ Vulkan),不少问题可以避免。”
Unity Answers
Issue with shaders in the editor when targeting android - Unity Engine - Unity Discussions
PC 上 Unity 可用的图形 API
Windows 平台 (NVIDIA 显卡)
默认优先用 Direct3D 11 (DX11)
新版 Unity 支持 Direct3D 12 (DX12)
还可以切到 OpenGL Core
如果安装了 Vulkan Runtime,也可以切成 Vulkan
NVIDIA 显卡 ≠ 只能用 DirectX,它同样支持 OpenGL / Vulkan。
Mac 平台 (AMD/Intel/Apple GPU)
Unity 强制用 Metal,没有 DX。
nity 里如何切换 API
在 Edit → Project Settings → Player → Other Settings → Rendering 里:
取消勾选 Auto Graphics API
你会看到一个 Graphics APIs 列表
在 Windows 平台下,可以选:
Direct3D11
Direct3D12
OpenGLCore
Vulkan
其实也是有可能我在build里切换平台的时候就有变化了,但是unity game里显示的阴影,手机上的阴影看上去的锯齿感更强
涉及的原因会应该是很复杂的,,如果想要修改这个结果,,不知道怎么出发,显示是因为shader,同一份shader在手机上和电脑上的运行效果不同
调用图形API,,GPU的作用,
标题栏显示 DX11?
Unity Editor 本身运行在 Windows 桌面环境,所以 Editor 的渲染窗口(Scene / Game 视图)默认用 DirectX 11 来绘制。
👉 这是 Unity Editor 自己的图形 API,不等于你 Android 构建时用的 API。