Unity学习笔记
你做的前面10个游戏都是垃圾,所以尽快做完这10个垃圾吧。
英语太重要了,好的视频资料都是英文的,不具备英语的Listen能力,学习效率极低。
工作流是什么?
Unity的设计理念
可视化搭建内容+编程实现交互
事件驱动类型的编程
组件化
学习路线
unity商店买个游戏,修修改改熟悉下。
- Unity官方文档
- UnityLearn
- UnityGameKit
- 联网坦克大战Demo
另外,Unity界面中的每个功能,都去试一下,比如各个导航栏、操控场景和界面等等,手熟了效率才高。
如果是专注于效果实现,可能百人计划比Games101更合适一些。
这个文章里面有书籍推荐、路线推荐、项目案例等。
游戏分类与意图

Unity开发和前端开发的相似性
Unity和前端开发类似,也是通过组件包(Assets)构建页面(场景内容)。
| 类型 | 前端开发 | Unity开发 |
|---|---|---|
| UI组件库 | ElementUI | Standard Assets |
| 内容 | Web页面 | Scene |
| 自定义组件 | Vue组件 | prefab |
| 操控 | Vue声明周期 | 帧生命周期 |
名词概念
网格:Mesh:轮廓
材质:Material:渲染方式和参数
着色器:Shader:渲染的算法
贴图:Texture:图片,增加颜色细节
法线等其他贴图:Normal…:增加物体的凹凸细节等
动画:AnimationClip:让物体动起来
group
通用的分组概念,不再赘述,但是非常有用。
Rigidbody(刚体)
Quaternion(四元数)
(TODO)UnityEngine程序结构
待画一个继承关系和属性图
Volume(体积)
用于后处理的场景滤镜。
这个翻译为体积,Unity使用这个体积框架,之所以这样命名,是因为使用该系统可以分割场景,并根据摄像机位置启用特定设置或功能。
Volume盒是用来影响摄像机的一个通用框架组件
URP自带的后处理功能是放一个Volume,在上面加挂常用后处理,例如Bloom、Tonemap等,调节相应参数;在主相机上,勾选PostProcessing,这样就能得到后处理功能。
VolumeComponent
可以参考这个后处理的文章来辅助了解这个概念。
快捷键
视角
左键:点选物品,点ctrl多选,可以框选
按住(中键)滚轮:视角平移
滚动(中键)滚轮:视角拉进拉远
按住右键:旋转视角
按住右键+wasd:场景漫游
按住右键+shift+wasd:更快的场景漫游
点中坐标线:移动物体
按住alt和鼠标左键,转动鼠标:围绕视觉中心点旋转
按住alt和鼠标右键,转动鼠标:拉进/拉远视角
点击视图区域右上角的x、y、z轴:切换到对应的轴视角
点中物体,按F:聚焦该物体
物体属性
左上角有操控切换按钮:移动、拉伸等,具体如下:
Q:视角平移
W:移动
E:旋转
R:缩放
T:2D缩放
物体操作
ctrl+d:复制
shift+点选:范围选择
alt+点击箭头:展开收起所有子元素
预制件(prefab)
prefab(预制体):将修改应用到多个复制体上,多用于在运行时实例化复杂的游戏对象或游戏对象的集合
官方文档有个攻击的例子可以参考。
常用场景:
- 通过在不同位置(例如在网格或圆形结构中)多次复制单个预制件来构建一个结构。
- 从发射器发射飞弹预制件。飞弹预制件可能是一个复杂的配置,其中包含网格、刚体、碰撞体、音频源、动态光源以及一个具有自己的轨迹粒子系统的子游戏对象。
- 车辆、建筑物或角色(例如机器人)分解成许多部分。在这种情况中,示例脚本将删除完整正常的机器人预制件,并替换为残骸机器人预制件。这种残骸预制件由机器人的单独破碎部分组成,每个部分都具有自己的刚体和粒子系统。通过这种方法,只需一行代码即可将机器人炸成许多碎片,这种情况下会将原始游戏对象替换为一个残骸预制件。
可以将其理解为Vue中的组件,可动态创建,可复用。
安装插件
window->package manager
可以通过git仓库地址安装,注意地址需要带上.git后缀。
比如这个:https://github.com/KhronosGroup/UnityGLTF.git
注意墙的问题,可能导致安装失败。
下载资源
注意:一定要先启动某个版本的编辑器,才能执行“在Unity中打开”的操作;否则只是启动了Unity Hub,是无法在商城Web页面打开资产的。
window->asset store
2020版本开始,为了性能考虑,Asset Store改为仅能通过web访问了。
下载后,要先自己启动编辑器,通过工具栏Window->Pakcage Manager导入才行。
添加效果
选中物体后,右侧的Add Component
UI组件
这块和常规的前端UI组件类似,都是可以可视化设置的。
模型导入
普通的glTF模型是导入不进去的,需要借助插件:
https://github.com/KhronosGroup/UnityGLTF/releases
https://zhuanlan.zhihu.com/p/309207738
渲染
这块其实比我想象的要简单,摆放物体、调节材质、光照、设置环境。
那些高清写实的渲染,也是这样一步步来的。掌握艺术美感、对各种光照材质参数形成一定的敏感度,就可以调试出还行的视觉效果了。
这其实是偏设计师的工作内容,不是我们开发人员的重点,但是基本概念得了解才行。
首先澄清一个误区,UE和unity的画质并没有什么区别,不存在UE比unity画质好。之所以会有这样的误区,是因为UE的默认渲染管线是deffered(只能pc主机以及少数高端手机能跑的渲染模式),高级后效全开,unity默认管线是forward(最简单的渲染模式,但是所有手机都能跑),未开任何后效全素颜。
作者:孙琦证
链接:https://www.zhihu.com/question/476152940/answer/2058789549
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Unity的渲染效果,也可以做到很好:
https://assetstore.unity.com/packages/3d/environments/urban/archvizpro-interior-vol-6-120489
动画系统
动画分类
| Animation | Legace | 老的动画系统,一个一个动画的播放 |
| Animator | Generic | 新的动画系统,可以配置动画播放逻辑 |
| Humanoid | Humanoid | 新的动画系统,用于人形动画的公用 |
动画和模型的绑定
AnimatorController
Avatar
可视化动画逻辑编辑器
条件参数设置
(TODO)动画可操控的对象的数据结构
(TODO)状态机与多线程
移动
本地轴(Space.self)与世界坐标系(Space.world)
常用于这个方法:
1 | |
如果 relativeTo 被省略或设置为 Space.Self,则会相对于变换的本地轴来应用该移动。(在场景视图中选择对象时显示的 X、Y 和 Z 轴。) 如果 relativeTo 为 Space.World,则相对于世界坐标系应用该移动。
(TODO)操控Camera
之前我播放的时候,都是只显示一个2D画面,无法进行3D视角旋转,我怀疑是不是因为我没有编写操控摄像机的逻辑?
多个摄像机之间切换
https://blog.csdn.net/chengbowen1992/article/details/9526539
注意:
Hierarchy中搜索到的内容,可能是个分组,比如我今天搜索Camera就搜到了一个分组和一个具体的Camera对象,结果我把分组给disable了,整个场景中就没有激活的Camera了,所以就看不到了。
SceneView.GetAllSceneCameras();获取的,是分组,不是具体的某个对象。
让摄像机跟随物体移动
三种方法:https://blog.csdn.net/ghl1390490928/article/details/80139439
可以通过GameObject.FindWithTag(tagName)这个API获取某个物体:
1 | |
物理引擎
触发器trigger
不产生物理碰撞的视觉效果,但是可以用来检测是否发生碰撞,可以用于拾取特殊物品、进入区域等。
这个和隐藏的兔子类似。
坦克动画拆解
注意,有些脚本是绑定在prefab上的,所以直接从project下的物体上,是找不到的。
官方坦克教程
https://learn.unity.com/project/tanks-tutorial
音效
可以在这个网站下载音效:
https://www.aigei.com/sound/short/transition_4/
绑定
直接拖到对应的物体上即可
C#脚本
一句话经验
在创建脚本时,实际上是在自定义新的组件类型,可以像任何其他组件一样将这种组件附加到游戏对象。
设置为public的属性,可以自动识别为Unity的组件变量。
可以通过Script Execution Order设置脚本的执行顺序。
游戏编程中的一个关键概念是在渲染每帧之前改变游戏对象的位置、状态和行为,即帧更新(Update方法)
事件函数的执行顺序(脚本生命周期)
https://docs.unity3d.com/cn/current/Manual/ExecutionOrder.html
这个很具有参考意义,我们写其他可视化内容的时候也可以用到。
比如这个,就适合用来处理用户操作,像我们之前的动态柱状图的操作:
- OnApplicationPause:在帧的结尾处调用此函数(在正常帧更新之间有效检测到暂停)。在调用 OnApplicationPause 之后,将发出一个额外帧,从而允许游戏显示图形来指示暂停状态。
脚本操作流程
- 将GameObject拖动到公共属性上,进行绑定
- 脚本内部调用属性,改变属性
- 通过update更新UI
(TODO)1个单位的距到底有多长?
比如speed=1到底代表多少的位移量?
(TODO)协程
协程就像一个函数,能够暂停执行并将控制权返还给 Unity,然后在下一帧继续执行。
关键的类
https://docs.unity3d.com/cn/current/Manual/ScriptingImportantClasses.html
- GameObject:表示可以存在于场景中的对象的类型。
- MonoBehaviour:基类,默认情况下,所有 Unity 脚本都派生自该类。
- Object:Unity 可以在编辑器中引用的所有对象的基类。
- Transform:提供多种方式来通过脚本处理游戏对象的位置、旋转和缩放,以及与父和子游戏对象的层级关系。
- Vectors:用于表达和操作 2D、3D 和 4D 点、线和方向的类。
- Quaternion:表示绝对或相对旋转的类,并提供创建和操作它们的方法。
- ScriptableObject:可用于保存大量数据的数据容器。
- Time(以及帧率管理):Time 类用于测量和控制时间,并管理项目的帧率。
- Mathf:一组常见的数学函数,包括三角函数、对数函数以及游戏和应用开发中常用的其他函数。
- Random:提供简便的方法来生成各种常用类型的随机值。
- Debug:用于可视化编辑器中的信息,这些信息可以帮助您了解或调查项目运行时发生的情况。
- Gizmos 和 Handles:用于在 Scene 视图和 Game 视图绘制线条和形状以及交互式手柄和控件。
录制视频
TimeLine + Unity Recorder:
https://blog.csdn.net/weixin_38239050/article/details/102472200
https://www.jianshu.com/p/d9a144c14777
发布项目(Build)
导出为exe
https://blog.csdn.net/qq_27124771/article/details/82085137
导出为WebGL
https://blog.csdn.net/u010930289/article/details/55814101
注意:需要先安装WebGL的工具库,并且启动项目之前,在Unity Hub中将项目的平台切换为WebGL.
编译为WebGL很耗费CPU,满负荷100%运转,直接笔记本卡住了。编译速度也很慢,小坦克的游戏花了4分钟;后来我禁用压缩格式,就很快了(几十秒)。估计是首次或者压缩小文件导致的。
这种方式其实是compile WebAssembly module
坦克游戏有接近40M,太大了,是否合适?
Uncaught ReferenceError: unityFramework is not defined
这是压缩导致的。
将Build Settings - 左下角Player Settings - Publishing Settings - Compression Format 设置为Disabled, 再次发布即可。
不过禁用压缩后,打包的文件大小从40M增加到60M了,不利于网页访问。
经验教训
- 一定要保存后再播放;播放后一定要退出再增加GameObject
通过命名空间解决多人合作开发问题
依赖包冲突报错
GUID [4f91902dd112b67448af5d5aced09a31] for asset ‘Packages/com.unity.collab-proxy/Tests/Editor/PlasticSCM/ProjectDownloader/ParseArgumentsTest.cs’ conflicts with:
‘Packages/com.unity.plasticscm-cn/Tests/Editor/ProjectDownloader/ParseArgumentsTest.cs’ (current owner)
We can’t assign a new GUID because the asset is in an immutable folder. The asset will be ignored.
方案一(亲测可用):
在项目下的Packages文件夹内,把manifest 和 packages-lock 里的 “com.unity.collab-proxy”: “1.5.7” 去掉,重新开一下项目就好。这可能是collab更新后引发的与其他package冲突,应该会在后续版本修复。
方案二:
新建项目时不勾选PlasticSCM试试
方案三:
把文件AssemblyInfo.cs对应的AssemblyInfo.cs.meta删掉就好了,刚试过成功了
牛人
可以参考这个文章下面列出的人员名单。
https://www.zhihu.com/people/song-rui-feng
还有这个视频提及的YouTube博主:
宣雨松:
陈嘉栋:
https://www.zhihu.com/people/jiadongchen
冯乐乐:
https://candycat1992.github.io/
陆泽西:
浙江工商大学,还搞投资的
秦无邪OvO:
大族激光
https://www.zhihu.com/people/zs8861
安柏霖:
腾讯北极光工作室
https://www.zhihu.com/people/toughbro/posts
谌嘉诚:
UE4,做了《死寂》,B站出了很多教学视频
https://www.zhihu.com/people/chen-jia-cheng-82-27
杨栋:
Unity大中华区平台技术总监
著有《创造高清3D虚拟世界》Unity HDRP实战书
https://learn.u3d.cn/u/yang-dong-4
独立VR游戏开发者:
http://blog.runevision.com/2021/11/launching-eye-of-temple-this-was-my.html
做了很多Low Poly的游戏和教程:
https://www.zhihu.com/people/jeremy-36-55/zvideos?page=7
(精)樱花兔(几个文章都是干货):
https://zhuanlan.zhihu.com/p/432821194
一个角色最终呈现在引擎里,美术制作上的思考以及注意事项:
https://zhuanlan.zhihu.com/p/344991995
用Unity制作写实渲染,画面实现上需要注意的一些问题:
https://zhuanlan.zhihu.com/p/349846781
炫酷效果
视觉系:
https://www.bilibili.com/video/BV1Rp4y1a7dB/?spm_id_from=333.788.recommend_more_video.-1
演示视频:
参考资料
如何学好Unity:
https://www.zhihu.com/answer/46815232
官方文档:
https://docs.unity3d.com/cn/current/Manual/UnityManual.html
(精)同济大学做的展厅(光影和物理很棒,关键是web端的):
这是展厅的技术讲解:
稚晖君的无人驾驶自行车也用到了Unity进行仿真测试(第七分钟开始):
(精)脚本生命周期:
https://docs.unity3d.com/cn/current/Manual/ExecutionOrder.html
UnityLearn:
Unity中文课堂:
学习路线:
https://www.bilibili.com/video/BV1WK4y1a7Hq/?spm_id_from=333.788.recommend_more_video.1
(精)戴森球计划技术介绍:
https://www.zhihu.com/question/423211989/answer/1700841044
https://www.zhihu.com/question/442555442/answer/1711890146
(精)Unity制作智慧城市的流程介绍:
https://tob.design/#/works/detail/357
视频教程:
清华计算机系学生的2021教程:https://www.bilibili.com/video/BV1WK411V7dn/?spm_id_from=333.788.recommend_more_video.0
全:https://www.bilibili.com/video/BV12s411g7gU?p=280&spm_id_from=333.788.b_636f6d6d656e74.6
短:https://www.bilibili.com/video/BV1Yh411h7zk?p=2&spm_id_from=pageDriver
2DGameKit:
3DGameKit:
https://learn.unity.com/tutorial/kuai-su-ru-men?uv=2020.3&projectId=5facfd33edbc2a002016d49c
Unity资源分类(阿里的,他弄这个干嘛?):
https://www.zhihu.com/people/ud-27-49
找动作:
去mixamo这个网站下载,然后Unity中通过Humanoid就可以使用了
还有一家很好的动作商:WeMakeTheGame,提供了很多战斗动画
(精)一个人花四个月做的游戏Demo及感想:
https://www.bilibili.com/video/BV1EV411o7rg?spm_id_from=333.999.0.0
(精)黑暗之魂教程:
https://www.bilibili.com/video/BV1Fu411r7W7?p=1
如何用9周的时间做一个简单的游戏小场景:
https://www.bilibili.com/video/BV18U4y1L7AV/?spm_id_from=autoNext
Unity Shader - 水体交互(水波效果):
https://zhuanlan.zhihu.com/p/447311831
擅码网视频教程:
http://www.mkcode.net/html/luxian.html
辣眼睛的少女版求生之路:
https://zhuanlan.zhihu.com/p/447835717
houdini-电影特效制作的No.1:
Unity(WebGL)与JS通讯2021最新姿势(做大屏的时候很有用):
https://zhuanlan.zhihu.com/p/372323716
资料合集:
https://zhuanlan.zhihu.com/p/50876776
(精)如何制作地形:
https://www.youtube.com/watch?v=ddy12WHqt-M
(精)如何制作地形-带小屋:
https://www.youtube.com/watch?v=DXh7yeCFD5Y
卡丁车(Karting)demo项目:
3D游戏套件:
https://learn.unity.com/project/zi-yuan-guan-li-qi-3d-you-xi-tao-jian?uv=2020.3
(精)3D创作的全流程:
https://www.bilibili.com/video/BV1tp4y1p7fe?spm_id_from=333.999.0.0
水木非凡境:
Unity实时渲染电影短片:
https://zhuanlan.zhihu.com/p/64859107
(精)一个从零开始做独立游戏开发的人的文章:
https://www.zhihu.com/people/zhou-xiao-hao-12-12/posts?page=2
如何让素材的制作成本降低下来:
半小时学会AE:
https://www.bilibili.com/video/BV1o7411y7pH/?spm_id_from=333.788.recommend_more_video.5
常用插件:
https://www.zhihu.com/question/519924857/answer/2383473127
使用 Unity 引擎时有哪些禁忌?
https://www.zhihu.com/question/61642141/answer/597451261
(精)战神飞斧教程:
God of War's Axe Throw | Mix and Jam - YouTube
(精)元气骑士3D版,里面有球形闪电教程,他这一系列的整个想法很nice (2分钟左右):
(精)拼凑做3D游戏的坑(拼凑会导致性能极差):
(精)网易雷火新人练习项目,介绍了整个开发流程,值得学习:
https://zhuanlan.zhihu.com/p/498576422
(精)MonoBehavior和生命周期讲解:
Unity中的MonoBehaviour_mb60e5417d375b8的技术博客_51CTO博客
植物大战僵尸,有很多经验技巧:
神经网络3D可视化:
https://www.youtube.com/watch?v=qtGEB-TtEP4
GitHub - maderix/NetRunner: NetRunner is a simple neural network visualizer created in Unity3D.
神经网络3D模拟合集:
https://www.youtube.com/watch?v=3JQ3hYko51Y&list=RDLV3JQ3hYko51Y&start_radio=1&t=16s
Youtube的Unity3D标签:
https://www.youtube.com/hashtag/unity3d
Unity引擎植入原生App渲染:
https://mp.weixin.qq.com/s/qyseETx9M5f0ObcjpSivYA
将Unity作为一个库嵌入其他平台:
将“Unity 用作库”用于其他应用程序 - Unity 手册
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-ios-app.685219/