Unity自学指南 (Generative Art方向)
自使用 Unity 作为主力创作工具后,不时收到一些私信:大体为如何入门 Unity, 或如何用游戏引擎做 Generative Art。这里会尝试回顾近两年的学习历程, 梳理一些个人的学习方法以及相关资源。抛砖引玉的同时也和更多同好交流
Unity 的优势与选择原因
在使用 Unity 之前,过去做图形生成实验主要使用 Processing 和 Openframeworks。两者都是 creative coding 的主流工具,做偏抽象风格的图形特别趁手。总体而言编程逻辑较接近,又各有优势
●Processing 对新手友好,入门资源多,社群强大,使用人数多(相对 Openframeworks)
●Openframeworks 稳定性好,执行效率高,多用于商业项目
但它们都存在一些明显的短板,在内置默认渲染模式中,可选的图形风格非常有限。要么是扁平化的着色,要么可添加光源但没有投影。这导致使用该工具创作的作品大体风格上非常相似(以硬边点线面为主)。
(From bee and boom‘s ,made with Processing)
对于初学者,要在该框架下实现一些偏写实类的图像风格是特别麻烦的,除非自己编写 shader 或结合一些现成插件。而对大多数人而言,为获得特定渲染效果去学一些过于底层的算法是不太现实的,相比这些,有更多顶层问题更值得去关注。
为了取得平衡,既能专注在生成算法,同时又兼顾图形风格的表现广度。就尝试转去使用游戏引擎。尽管切换工具需要一定的学习成本。但对这一方向而言,核心仍是算法,过去在其他框架工具内积累的经验仍是可复用的,只需要熟悉新的 API 与绘制逻辑。而且游戏引擎有更高的自由度, Processing 和 Openframeworks 上能实现的效果,游戏引擎内一样能实现。但反过来,游戏引擎中的一些效果要在前两个工具上复现却很困难,需要从底层造轮子。由于 Unity 有易上手和快速迭代的特点,就从当时主流的游戏引擎中选择了它。经过一段时间的使用,对比过去的一些creative coding 框架主要有以下这些优点
●更宽广的图形表现能力
内置成熟且高效率的材质渲染系统以及各类屏幕后处理效果( Post processing)。支持从底层定制各类 shader 和渲染管线去实现不同的渲染风格。对光线追踪的支持也逐渐成熟完善,逐步靠近写实的影视级效果
●工具链完善,适合团队作业
支持各种美术资源的导入,官方自带 probuilder 一类能在编辑器中快速的建模工具的插件。shader graph ,ampify shader ,visual effect graph 等这类无需代码基础的节点式编程工具可以实现 shader 或各类粒子特效。新整合进引擎的 Bolt 节点工具,也能使用它来编写游戏逻辑
●应用范围广,使用人数多
交互装置,游戏,VR,AR ,数据可视化等领域都可应用。跨平台,全能型选手。而作为商业软件,在维护人数,迭代速度上都有保证。使用人数多,也更容易促进交流合作
●学习成本相对较低,适合快速迭代
Unity 的教程资源非常多。无论官方非官方都有大量优秀的教程作者在输出内容。编译速度快也更利于作品的快速迭代
如何入门
对于这一问题。比起“如何学”,可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,成为强大的牵引力。
要找到这些作者有多种途径,可以在相关的设计平台如 viemo,behance ,artstation 。但这类平台总体而言更偏传统的 CG 或平面/绘画类。如果单从“找人”的角度,个人更推荐使用 Twitter。在实时交互和程序化生成领域的创作者,上面的数量和活跃程度是最高的。由于发推这一行为非常轻量,所以上面的更新速度和频率都很高,甚至能看到背后一些技术细节分享。
利用社交媒体
下面选了一些比较典型,使用的创作工具都为 Unity,并在特定方向有给过自己启发的创作者
●Adam Samson
https://twitter.com/adamshmamshon
对于材质与光影拿捏到位。不少作品使用了 SEGI(https://github.com/sonicether/SEGI) 全局光插件,在早期RTX未普及前,作品的效果相当惊艳 ,是影响自己转向 Unity 的创作者之一
●Oskar Stålberg
https://twitter.com/OskSta
游戏 《bad north》的开发者,曾是育碧的TA。近期有上线一款基于WFC 算法的小镇建筑生成游戏《TownScaper》
●Wilhelm nylund
https://twitter.com/wilnyl
《Totally Accurate Battlegrounds》的作者。非常有创意并且脑洞大开。善用 ragdoll 系统去制作一系列基于物理的角色程序动画
●Keijiro Takahashi
https://twitter.com/_kzr
Unity 日本区的技术美术总监。为数不多,大量输出的同时经常分享工程源文件的创作者
●Arsiliath
https://twitter.com/psychobiotik
善于使用 ComputeShader 进行诸多生物和有机体的模拟。开设的线上工作坊个人认为是网上资源中讲解 Compute shader 最全面的
● Makan Gilani
https://twitter.com/Makan_Gilani
关注程序化动画(Procedural Animation),Boss 战设计让人眼前一亮
●Marpi Studio
https://twitter.com/marpistudio
作品主题多为探索数字化生物
● Alexey Kalinin
https://twitter.com/_alexeykalinin
善于结合Houdini 来生成资产在引擎中使用
● Daniel Beauchamp
https://twitter.com/pushmatrix
VR,AR 的交互设计上非常有新意,脑洞大开
●Joyce[MinionsArt]
https://twitter.com/minionsart
Unity shader 特效,经常输出一些 Gif 原理教程
教程类作者:
除了输出习作为主的创作者外,还有专门输出教程类的作者。想拓展知识面,看既有趣又实用的教程可关注SebastianLague 和 itsKristinSrsly,看他们的视频是一种享受。
https://twitter.com/SebastianLague
https://twitter.com/itsKristinSrsly
VR,AR 方向则可关注 Dilmer。要获得较全面的,涉及各类 Unity 知识点可关注 Brackey,偏底层硬核技术向的可关注 CatlikeCoding
https://twitter.com/Dilmerv
https://twitter.com/BrackeysTweet
https://twitter.com/catlikecoding
以上列出的创作者, 每个人的作品揭示了某个方向的可能性,从时间线可以看到迭代深化的过程
要在Twitter 上找到更多同类的创作者是非常容易的。基本是关注一个人就能按图索骥找到该领域的一串人。通过点赞或转推,其他人会很自然地浮现在你的信息流上。部分作者你也能通过文章和视频,了解他推崇的创作者或是创作理念的源头。结合一些关键字搜索,能够挖掘到更深入的信息
除了使用 Twitter 作为信息源的输入,下面我想略微展开如何使用 Twitter 进行输出
Twitter 使用指南
使用 Twitter 可以选择潜水仅做一个关注者。但如果想获得更多反馈和交流,就可以考虑进行输出,例如在上面发布一些习作或心得。通过输出能让更多人了解你的关注点,就能很自然地和同类交流。尽管可以用邮件或私信的方式,但比起用大段文字叙述自己对什么感兴趣,在做什么,不如直接用作品来说话更高效。当有这个基础,想深入和特定作者进行交流是很简单的,作者也一般乐意回答。甚至反过来,会有关注的作者主动过来探讨问题,了解背后的实现技巧,这种互相认可的感觉会特别好
Twitter 比较特别的一点。不像平台有专门的编辑来审核以此决定作品的曝光率。它主要依赖用户自发的转载来传播的。基本上好的作品,是很容易流传开的。只要作品有亮点并且坚持持续输出,即使新人也很容易在圈子"崭露头角"
发习作时有一点技巧,由于 twitter 没有内容推荐机制,如果你起始的关注者数量很少(一两位数),可能很难获得正向反馈。若你对内容比较有自信,可以尝试 @ 一些相关的官方机构,或打上相关的标签。当官推看到优秀内容,都会乐意转载。这一点个人认为 Unity 的官方推特运营得非常好,除了常规功能会发布更新信息,还会发起类似 #madewithunity ,#Unitytips 一类的活动,从连接创作者的角度去运营,让更多人了解到该工具带来的创作可能性。
除此之外,当作品有学习或参考过特定作者,也可以 @他注明 credit。这也是一种非常自然的,可以带来更多互动交流的方式。作者一般会有回复反馈,甚至会转载。
社交媒体除了交流属性。你发布的内容本身也是一张个人名片,能带来合作的可能。像不少独立创作者,工作室,机构都会通过它来联系寻求合作。
其他交流工具
除了 twitter 外,instagram 也是不错的内容发布平台,更整洁而且视频输出质量更高。但由于没有转载功能,流动性比较弱。另一个比较推荐的交流平台则是 Discord,类似于国内的微信群。很多插件的维护者,游戏开发者,都会开通自己的 discord 频道。Unity 的官方本身就有 discord 论坛,任何人都可以加入,通过不同的标签根据主题可以进入不同的房间,参与实时的讨论。
当你有更完整的作品,可考虑上传 vimeo ,behance等平台,或制作一个专门的个人网站。如果有意运营工作室/公司,这是一种更正式的梳理作品和案例的方式。当然,这一形式作为展示的意义更大。前者更适合互动交流。
更系统的学习资源
社交媒体的作用更多是打开视野,了解这个工具能做什么。要实打实地学习,视频教程/书籍, 会是一种更系统的学习方式。个人最早是直接从官方教程入手,先看一些更“美术向”的教程。了解基础的界面布局,如何在场景里打光,创建基础的几何体等等。后续再了解如何使用脚本,用脚本去控制物体。接着可了解一些能提高生产效率的模块,如 timeline,物理系统,vfx graph ,shader graph。
现在官方推出了UnityLearn栏目(https://learn.unity.com/tutorials),里面有标签将不同的内容按主题和学习难度进行了分类。可以完全满足入门需求。里面每个关键步骤都拆得很细,用图文结合短视频的形式去组织,比传统的纯视频学习起来更有效率。
学习期间,大概会冒出一些陌生名词,如 procedural animation,Inverse Kinematics 等等。如果想深入了解,就能直接在 youtube 通过 "Unity + 主题关键字" 搜到更多教程。自己前期铺垫基础知识点,有 90% 是通过这个方式完成的。
除此之外也可以购买书籍教程作为手册去使用,但个人较少使用这种方式。一方面技术的更新很快,某些新功能可能几月 API 就会有大改动。导致中文类的纸质书籍教程通常都会滞后。等作者从写作到印刷出版,有些内容已经不适合新版本。所以为了避免阅读过旧的资料,更推荐直接观看网上教程。
选择合适的教程/学习资源
没有绝对意义上的好教程。只有适合自己的才是好教程。
每个人当前所处的阶段和学习接受能力都不一样,某些过于详尽的教程,初学者会觉得清晰贴心。但中高阶学习者却可能觉得啰嗦,节奏太慢,长时间观看很难保持集中力。
但无论你是哪种学习者,一般意义上的好教程个人认为有几个特征。
●教程有分段落,会划分为小节。一般在 5 到 20 分钟区间,不是连续1个多小时以上
●教程作者有大量输出
可以留意同一个作者是否有稳定,持续输出的习惯。如果只是首秀或者零星地做一两次,通常质量不会太高(除非是业内资深从业者通过开发者大会和工作坊分享技术,但内容更偏高阶而非常规的学习素材)
●教程有经过剪辑
不是视频时长越多就表明知识点越多。比起录播形式的(讲者由头讲到尾),经过剪辑的教程质量大概率优于不进行剪接的,不剪辑对讲者方便,剪辑对观者方便。前者通常更有诚意并且信息密度更高。有剪辑处理的通常在讲前就会做好大纲,哪个部分讲什么,相应部分放什么配图和视频。更好的甚至连插入的音乐都是非常考究(像 Sebastian)。当然也与作者的风格有关,有人不惧怕展示错误/卡壳而展示全程的,像 Shiffman。但一般没有驾驭能力的讲者还是老老实实做个剪辑比较好
(这是个人认为节奏好的教程,短短十分钟就把 particle system 的用法讲明,行云流水.
https://www.youtube.com/watch?v=FEA1wTMJAR0 )
●收费教程与付费教程
对于是否有必要购买或参加付费的课程。这个需要擦亮双眼多加辨别。无论官方非官方,收费付费,国内还是国外,都有参加过一些。但总体而言,教程质量和是否收费没有相关性。有收费教程看了开头后面就没有打开过。也有免费教程质量高得吓人让人想在 Patreon打赏作者的。
看课程简介时,不要迷信所谓“专家”,有些只是用营销话术,各类 title 来包装出来的。如果作者本身技术过硬且有不错的作品案例,平时有分享技巧经验的习惯,那大概率做的内容是过关靠谱的。否则做教程或开班只是另有目的,更差的甚至会起误导作用。
个人的编程方面的知识几乎是自学而来。基础知识来源于网上的免费教程。如果你是学生, 经济条件不允许,学校又没有足够好的老师,自学完全可行,在网络时代几乎没有知识壁垒。交流窗口都是开放的。既可以是简单的私信,也可以是正式的邮件。如果有机会能接触一些行业前辈,认真准备好问题,虚心请教。点拨下就足矣。只要不是一类伸手党问题,上来直接要源码,一般都是乐意回答的。
如果准备参加收费课程,也建议提前将一些基础知识通过免费的网络教程先过一遍。这样学习课程时,就能向讲者提出一些更高级的问题,时间用于学习更有价值的内容上。
学习方法与技巧
有了教程和各类资源,下面再分享一些操作性较强的学习方法
●科学上网,阅读外文资料
在学习过程中,一个必备的组合是 V_P_N + 词典。优质教程都是外文居多。不想看二手信息和教程。就尽量从源头汲取资讯。
如果外语基础不好,前期学习确实会不如阅读中文教程流畅。但技术类的文章,需要掌握的词汇并没有想象中多。从阅读自己感兴趣的信息开始,遇到生词就查词典(开启屏幕取词)。这样边学边用,潜移默化就会提高。养成习惯,长远看获益巨大。更重要的,有些问题必须用英语关键词 google 才能检索到答案。学好外语对于学习编程绝对是事半功倍
●由点及面,非线性的学习路径
不要有线性的学习思维和包袱。如一本书或一套教程,由头学到尾,期望彻底搞清每个章节的知识点才前往下一章进行学习。除了先从重点切入外,有些内容和模块如果是彼此独立的,则可以打乱顺序去学习。先从能立刻实践的角度出发,把学到的知识串起来。若有A,B,C 三个彼此独立的知识和模块。你已经掌握了 A, 先学B 的话,AB 之间关联小。但先学 C,则能把 AC 结合起来做点新东西。这样就优先学 C。基于这一的原则慢慢铺开,随着要做的东西越来越复杂,很自然就能把所有知识点都涵盖到。
非线性学习的另一重含义,就是有些时候看某教程卡壳了,可以转向另一套教程看相同知识点是如何讲解的。而不是先怀疑自己智商,然后死磕教程。有些时候部分作者在针对初学者的讲解时,容易忽略一些前置知识,又或者举的例子不够直观简明,就无形间增加了难度。此时换一个其他路径去理解可能就豁然开朗。对比之下,也许会发现原本选择的教程就不咋的。所以不要抱着先入为主的观念去迷信某书籍或权威,尽量忠于自己的学习感受
●大量练习,大量输出
在学教程时,第一步通常是模仿,重复作者的操作或代码,确保能正常运行起来。但这种理解往往是浅层的。要真正掌握,就必须在用中学。将知识点打散重组,再在运用中巩固。
当新掌握的知识积累到一定阶段,就可以发挥创意,做些有意思的习作作为输出。
刚开始学习 Unity,通过教程掌握了下面基础知识点。
●使用 Instantiate 生成物体
● transform 改变物体的位置和角度
● 物理系统- rigidbody
由此联想到可以用程序化的方式来摆放生成一系列多米诺骨牌。
(Test372)
这样就把不同知识点串起来了,同时也是一个比较有趣的交互程序。而后面了解到图片的读取像素信息的方法,稍加改良便可以对板块进行着色。
(Test373)
过去的四百多个“代码速写”。记录了自己在生成方向的探索和实践。通过大量输出,一方面记录了探索成果,另一方面展示了你的关注点。这无论对于求职,寻找同道或是潜在合作者都非常有帮助。
可能有朋友会觉得自己作品不够成熟,所以怯于展示,或是追求完美,觉得要做些大作,才能代表自己水平。这类担忧纠结其实是不必要的。通过输出可以获得评价,收获不同的视角,或许有人会给出更好的改进思路,都会督促自己进步。
●推陈出新,提炼总结
当基础问题解决差不多,后续就不是比拼谁看过的教程更多。而是考验创造力,或者说挖掘新模式的能力。
这就是为什么作品看多了 ,会发现不少风格雷同的情况出现。因为都是基于类似算法规则调参得出的。而要形成自己的风格,让它看起来不那么一样。就需要不断解构重组,提出新的规则和模式,建立自己的图形语言。如果没有走得更深,就很难做到眼前一亮。要进步,就不要用自己熟悉的方法套路。特别对于有一定能力的学习者,不要认为够用了就放弃学习和探索。这样技术和创意水平就会停滞不前。做一个贪心的创作者,永不满足就会永远有提高和突破
●善用笔记
要巩固新学习的知识,意义非凡。个人认为笔记对于学习能占到 80% 的作用。养成记笔记的习惯,会让你阅读资料时不自觉思考内容的重点,避免走马观花。其次,在记录过程中用自己的语言再组织一遍,就能加深理解避免遗忘。
个人早期是用 markdown 在本地建立自己的笔记库。但后来转向使用一些跨平台支持云储存的记事软件(如有道云笔记),这样方便在手机也能查看同时并且即时记录一些灵感。
不少人不喜欢记笔记,一部分原因是没有好的习惯和方法,导致想起要用某些知识点,不知道从哪个地方找。或是整理不当,能找到但耗时太长,觉得笔记没什么必要。
笔记个人认为只要做好两点就够了,树状组织结构 + 关键词搜索。这样能极大的提高复用率。
树状组织结构
树状的文件夹目录结构很好理解。个人编程类别内展开,是“OF相关”,“Unity”,“Unreal相关”等等。而 Unity 目录内则分为
基础知识点:各类基础知识合集
复用模块思考:自定义模块的设计思路,相关的复用经验
插件与模块使用:非官方插件类的使用
Unity shader 相关:Compute shader 等..
...
这样笔记就有一个大致的存放目录,而不会乱。
植入关键字
但空有合理的组织结构是不够的,特别是当记录的内容逐渐庞大起来,最小的目录仍有几十篇笔记的时候。这样每找一次信息都阅读目录下的标题再找出来也会非常慢。 一种方法是继续分子目录,但更好的做法是在笔记文章中植入关键词。
关键词可以是作为笔记的标题。也可以嵌入在笔记内容上。并且用一些简单的词语组合作为钩子,如“程序化动画”,“灯光控制”等。这样需要回顾相关知识点时,只要在云笔记搜索栏输入这些关键字,就能迅速找到而不用翻目录(如果用传统的 word 来记笔记,就较难操作)
另外,植入的“钩子”。可以多用同类词。如“材质混合,材质插值”。这样可以避免因为记忆模糊只记得其中一个就搜不到内容。
●笔记技巧
只要记了,当下自然就有巩固作用。记录时无需过于详细,避免出现“学习十分钟,笔记一小时”的情况。尽量简练,可结合截图。由于写的是笔记不是写教程,所以只要自己能看懂的前提越短越好。归纳得当的笔记是不需要重看原教程,也能靠它迅速理解回顾。同时,笔记中也可附上原始学习素材的来源链接,这样日后看不懂了,以能快速回溯并进行补充。通过笔记养成的思维习惯,在写文档注释时也会非常有帮助,你能在更短时间用更简练的语言去说明各类函数变量,模块设计思路等
●输出经验
个人的学习笔记,再稍加整理也可以外化输出。与更多人交流分享。多写文字,潜移默化之间也能锤炼了自己的表达能力,总结能力。也能启发后来者。
一些创作者甚至会整理成视频,像 Sebastian Lague 的(My First 10 Years of Game Development)就显得有趣而励志,推荐一看
(https://www.youtube.com/watch?v=egukLtEhyP0)
生成类算法的学习路径
最后针对初学者做一点总结。关于个人推荐的学习路线。如果对生成艺术(generative art)感兴趣,有时间打基础。可考虑 Processing -> Unity。如果希望快速出一些交互游戏类的作品,可以直接学习 Unity。
学习 processing 的目的在于能看懂一系列优秀的生成教程。《The nature of code 》是比较系统的(https://natureofcode.com/book/)。特别是涉及力的相关章节非常适合打基础。同时它有一个庞大的社区可以让你汲取生成算法的灵感(https://www.openprocessing.org/)。Unity 的话,与生成相关的教程则偏少,毕竟它本身是一个游戏引擎,更多是围绕游戏工业的工作流去设计的。因此教程要么很程序向,要么很美术向。虽然技术美术( TA )岗位中的技能需求和 generative art 有重叠,但这部分的教程依然相对稀少且不够聚焦,没有太多简易教程入门导致学习梯度会更大。
如果你在学习过程中没太多概念和方向,不妨可以用算法解决下列这类问题
1.掌握如何用函数去映射控制变量(熟悉三角函数,噪声函数):控制形状,颜色,运动
2.在程序中模拟力,理解速度加速度,引力斥力:赋予形态更有机的运动感。
3.有面向对象的思维,实现粒子系统,模拟复杂生命,群体系统
4.程序化建模 Procedural Mesh ,SDF 等
按个人偏好而言,前面三类是较基础的。而 Procedrual mesh 则是个人探索生成算法重点。毕竟程序中的任何造型,都可以理解为是三角面构成的。只有掌握灵活的控制方法,才可能在造物层面上更多样化。而这种灵活性也需要有良好的设计模式才能支撑。所以有很多探索空间。而要掌握如何管理组织三角面。需要了解顶点,索引,uv,法线,是如何串联整合形成一个面片。掌握用纯数字的方式定义,去穿针引线。若想在 Unity 做这类探索,可以从这类视频入门。(https://www.youtube.com/watch?v=ucuOVL7c5Hw&t=55s)
同时,可以考虑学习 ComputeShader 作为辅助,利用 Gpu 的算力做出更多超出想象力的效果。
最后,推荐一份推友整理的 CreativeCoding/Generative Art 的资源宝库 ,通过它可以了解该领域的相关概念,发展脉络以及先锋人物。合理利用必定获益良多 :)
(https://github.com/cacheflowe/creative-coding-notes#graphics-concepts)