Skip to main content

引言

欢迎!您或许以及在其他这样那样的平台阅读过一些 VRChat 创作教程,或在文档库里阅读并实践了 VRCD 入门包,但在您阅读接下来的教程前,我们有一些话要说:

你可能已经注意到,或者亲身体验过社群中一种常见的困惑:

  • 一些朋友认为:“我们不需要那些花哨的高级工具或‘自动化’脚本,自己手动调整每一个参数、从最基础开始搭建才是王道,这样才能完全掌控一切!”

  • 另一些朋友则在遇到问题时感到沮喪:“这些高级工具(比如某些复杂的着色器、动画系统或VRChat SDK的特定功能)太难了!它们内部到底是怎么运作的?一旦出问题,那些‘泄露’出来的底层细节反而让我更加手足无措,感觉还不如从零开始呢!”

这两种看似矛盾的观点,其实反映了一个重要的概念:抽象

软件工程计算机科学中,抽象是从对象系统的研究中,将具体的,多余的细节泛化或隐藏的过程,使得人们能将注意力集中在更重要的细节上。

维基百科 —— 抽象(计算机领域)

最初的计算机没有操作系统,没有用户程序,只是一个由输入的指令进行自动化操作序列的庞大的计算工具

ENIAC 电子计算机

如果我们希望用这种机器执行越来越复杂的现实任务,那么我们不仅要付出沉重的人员教学成本,还要在每次执行任务的时候重复劳动,插入大量的指令,只为了完成某任务中非常简单的一个部分,例如加法或者幂,或者一个指数计算。换算成现在,就是等于在 VRChat世界里的每一束光线、每一个物理碰撞,都需要直接用0和1来描述——看起来这种情况不太理想,既然我们为了计算而制造了自动执行步骤的计算机,我们能否简化计算机或者把计算机进一步自动化?

正是为了摆脱这种困境,抽象的金字塔开始被逐步搭建起来:

  1. 从机器指令码到汇编语言: 第一次伟大的抽象。用助记符替代了二进制指令,大大提高了可读性和编写效率,但依然与特定硬件紧密绑定。

  2. 高级编程语言的诞生 (如 Fortran, COBOL, 再到 C 语言): 这是革命性的一步。C语言常被誉为“可移植的汇编”,它在提供接近硬件的控制能力的同时,通过编译器这一“翻译官”,将人类更易理解的语法转换成不同平台的机器码。这使得程序员可以将更多精力放在“解决什么问题”上,而不是“如何在特定机器上表达”。

  3. 操作系统的崛起: 操作系统将复杂的硬件管理(内存、磁盘、输入输出)抽象成统一的接口(API)。你无需关心数据具体存储在硬盘的哪个扇区,只需调用OpenFile()这样的指令。这极大地解放了应用开发者。

  4. 图形用户界面 (GUI) 与集成开发环境 (IDE): 进一步降低了人机交互的门槛,让操作更直观。

  5. 面向对象编程 (OOP) 与设计模式: 提供了组织和复用编程代码的更高级抽象方法,减少了对具体计算机内存细节的直接操作。

  6. 游戏引擎 (如 Unity): 这或许是我们VRChat创作者最能直接感受到的、也是最庞大的一层抽象。Unity 为我们封装了渲染管线、物理模拟、音频处理、动画系统、网络通信等等无数复杂的底层细节。没有 Unity,我们每个人都需要从零开始编写这些模块,那将是一个难以想象的工程。

VRChat SDK 本身,以及社区中涌现的各种优秀工具、着色器、预制件,都是站在 Unity 这个“巨人”肩膀上,进一步为特定创作目标提供的更高级别的抽象。 它们的目标是让你能够更专注于“我想在VRChat里实现什么样的酷炫效果/互动体验”,而不是“我该如何用C#和HLSL从零开始写一个PBR渲染器或者一套 IK 系统”。

那么,如何看待开头提到的“两级悖论”呢?

  • 关于“我们不需要抽象级工具来自动化”: 这种想法往往低估了现代创作的复杂度和时间成本。拒绝使用成熟的抽象工具,就好比坚持用石头去建造摩天大楼(gugugaga)。虽然理论上你可能对每一块“石头”都了如指掌,但效率和最终能达成的规模将极其有限。在VRChat这样追求快速迭代和创意的社区,善用抽象工具是提升生产力的关键。

  • 关于“抽象级工具的设计性问题会泄露一些底层抽象,加大难度”: 这确实是“抽象泄漏法则 (The Law of Leaky Abstractions)”的体现——任何级别的抽象都是由人设计的,因此没有任何抽象是完美无缺的,它们在简化问题的同时,有时也会暴露出一些底层的复杂性,尤其是在你试图突破其设计边界或遇到Bug时。但这并不意味着抽象本身是坏的,或者我们必须成为全知全能的底层专家才能使用它们——我们作为人的精力是有限的

上的观点,对应两种学习方法:

  • 自下而上,从底层开始学习,逐渐向上抽象,例如说我们从绘画原画开始, 进行建模,绑骨,绘画表面贴图,最终在 Unity 中完成虚拟学习组件拼装,得到完成品
  • 自上而下,从顶层抽象开始,逐层解析细节,例如说我们从 BOOTH 的现成虚拟形象商品开始,配合我们找到的一些虚拟形象装饰和组件,先完成一个初级完成品,然后逐步分解,添加东西。

初级包的核心目的,正是要帮助你在这两者之间找到一个黄金平衡点。 我们将主要以自上而下的视角展现教程,并:

  • 引导你有效地使用 Unity , VRChat SDK 以及诸多社区插件提供的抽象工具,让你能够快速上手,实现你的创意(自上而下的应用)。

  • 在你遇到问题,或者希望进行更高级的定制化时,我们会为你适度地揭开部分“面纱”,解释一些关键的底层概念和工作原理(在需要时进行自下而上的探索),让你不仅“知其然”,还能在一定程度上“知其所以然”。

  • 我们鼓励的不是盲目地“从轮子造起”,例如坚持古法绑骨改模,也不是对工具内部一无所知地“盲目使用”,遇到 bug 强行操作或者束手无策,而是理解工具的设计哲学,学会聪明地站在巨人的肩膀上,将精力聚焦于创新与表达。

因此,你会注意到初级包和文档库中的入门包,或者和其他平台的速通教程的教学思考会有些许不同,我们希望能授之以渔,鼓励您在阅读教程的时候能够推广的解决其他本教程未显式提及的问题,并且把这样的思考范式带入到生活或学习的其他方面。