第五届字节跳动青训营讲师非常用心给大家整理了课前、中、后的学习内容,同学们自我评估,选择性查漏补缺,便于大家更好的跟上讲师们的节奏,祝大家学习愉快,多多提问交流~
课程:数据可视化基础
概述
本课程主要内容可以分为三个章节:
- 数据可视化的基本概念
- 可视化设计的基本原则
- 面向前端的可视化工具
本手册可以作为学生学习数据可视化的“学习指南”,按照手册所列内容,结合扩展资料进行系统的学习和实践。
本课程没有讨论更为前沿的可视化课题,比如智能可视化。
课前预习
课前需要学员尽可能对可视化有一个感性的认知,可以重点了解一下数据可视化发展简史,同时对不同历史阶段的一些经典可视化作品做扩展阅读,增加兴趣。
另外一些演示工具可以提前体验一下:
- TimeStoryTeller:timelinestoryteller.com/
- Facets:github.com/PAIR-code/f…
- Tableau:www.tableau.com/
学习资料(Learning)
基础理论
1.《The Visual Display of Quantitative Information》
- 《Visualization Analysis & Design》
- 《信息可视化交互设计》
4.《Making Maps: A Visual Guide to Map Design for GIS》
- 其他
编程实践
- 《Interactive Data Visualization for the Web》
- 《The Grammar of Graphics》
- 《Fundamentals of Data Visualization》
- D3.js : d3js.org/
工具体验
- TimeStoryTeller:timelinestoryteller.com/
- Facets:github.com/PAIR-code/f…
- Tableau:www.tableau.com/
课程:3D 游戏实战开发
概述
本节课程主要分为四个方面:
- 3D 游戏中的实体模型、材质与位姿
- 相机、光照、天空盒
- 游戏控制、刚体属性与物理碰撞
- 玩法逻辑与游戏UI
课前部分主要罗列课程中涉及到的概念。对于不熟悉的概念,同学们可以提前查询预习;课中部分主要罗列每一部分的关键思路,帮助同学们跟上课程的进度;课后部分是一些问题,帮助同学们在课后梳理本课程的重点。
课前
尝试在课前理解以下内容:
3D 游戏引擎初探
-
下载并运行 Unity 软件
-
熟悉 Unity 界面
- Scene(场景)面板
- Game(游戏)面板
- Hierarchy(层级)面板
- Project(项目)面板
- Inspector (检视器)面板
- Console(控制台)面板
-
理解 Unity 中的 GameObject (实体)及其挂载的 Component (组件)
- Camera(相机)实体
- Light(光照)实体
- Transform(变换)组件:位置、旋转和缩放
- Mesh(网格)组件与 Material (材质)组件
- RigidBody(刚体)组件:物理模拟
- Collision(碰撞器)组件:碰撞检测
-
Input(游戏输入)与 InputManager(输入管理器)
-
Tag(标签)、Layer(图层)与 Physics(物理规则)
-
Prefab(预制体)与 Instantiate(实例化)
-
在 GameObject 上挂载 Script(脚本)
-
GUI(图形用户界面)和游戏管理
-
下载 Unity 之外的另一款 3D 游戏引擎,在其中寻找以上概念在另一款 3D 游戏引擎中的平行概念。以下是建议的另一款 3D 游戏引擎:
- UE(Unreal Engine 虚幻引擎,UE4 或 UE5)
- Roblox(罗布乐思)
C# 编程语言
- 变量及作用域
- 数值运算、布尔运算和比较运算符
- 顺序结构、条件分歧与循环结构
- 函数与参数
- C#中的数组、集合与List
- 类与面向对象
- 代码调试
实时 3D 游戏开发中的概念
-
实时游戏
- 帧率
- 物理、逻辑与渲染
- 状态迁移
-
不同游戏平台的输入设备
-
3D 碰撞处理
-
AI 与 决策树
课中
引言
-
课程目标:通过此次培训,同学们可以利用 Unity (或其他3D游戏引擎)快速搭建电子游戏原型,参加 Game Jam 活动。电子游戏原型可以帮你完成下面的工作:
- 快速试验、否定或修改游戏机制与规划。
- 探索游戏的动态行为,理解由规则产生的可能结果。
- 确保规则和游戏元素易于被玩家理解。
- 了解玩家对游戏的情绪反应。
-
简言之:一名程序员,如何在没有美术的前提下,制作一个游戏Demo,让别人亲身体验以了解游戏机制。
-
课堂上我们通过制作一款射击游戏来带领大家了解3D游戏制作的基础知识。
游戏静态场景搭建
3D实体
-
3D游戏是由一个个具有形状的实体组成的。每个实体在空间中存在于特定的位置,有特定的姿态(旋转角度)。
-
3D实体的创建
- 通过加载3D模型创建,如 fbx、gltf、obj。
- 通过组合参数化的基本几何体创建。
-
3D实体的变换组件
- 位移变换:三维向量。你所用的游戏引擎是左手坐标系还是右手坐标系?
- 旋转变换:俯仰角、偏航角、滚转角
-
-
- 3D实体的材质、颜色与纹理设置。
预制体
-
预制体
- 什么是预制体?
- 预制体与实例化对象的关系是什么?
- 如何创建预制体?
- 如何在游戏运行过程中根据预制体实时实例化对象?
场景氛围渲染
相机
-
Clear Flag。
-
背景颜色。
-
Culling Mask。
-
投影类型
- 透视投影:far、near、fov
- 正交投影:far、near、size
如何根据相机参数沟通2D屏幕与3D场景之间的联系?
一个场景可以有多个相机吗?
光照
-
类型:点光源、平行光、聚光灯、面积光。
-
颜色。
-
强度。
-
阴影类型。
- 软阴影。
- 硬阴影。
天空盒
-
概念:游戏中的天空盒是一个包裹整个场景的立方体,可以很好地渲染并展示整个场景环境。
-
学习配置天空盒:
- 相机的清除标志设为“天空盒”。
- 窗口-渲染-照明-环境-天空盒材质设置。
让场景中的实体动起来
3D 实时游戏的执行时序
-
实时游戏的运行帧
- 帧率60可以流畅运行,帧率30差强人意,帧率20及以下会感受到明显卡顿
- 帧率60意味着每一帧运行时间16.67毫秒
- 一帧内,需要执行物理计算(含运动学与动力学计算、碰撞检测)、用户输入检测、游戏逻辑执行、渲染画面,如果时间还有富余,停顿到16.67毫秒。
- 游戏中的实体有静态的实体,也有动态的实体。对于动态的实体,我们需要为其设置刚体属性、碰撞/触发属性或执行脚本。
- 游戏的优化主要是减少物理、逻辑或渲染中的运算量。例如减少无意义的碰撞检测,用更少的计算量达到相同的执行目标,在用户感知不到差异的前提下尽可能裁剪渲染。
刚体组件 RigidBody
- 概念:刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。现实生活中,刚体受力后,运动状态会发生改变(牛顿第一定律);相互作用的两个物体之间的作用力和反作用力总是大小相等,方向相反(牛顿第三定律)。
- 但是在 3D 游戏中,刚体的性质遵守游戏设定的规则而不是牛顿定律。例如悬浮在空中的踏板、空气墙、无论多大的力都推不动的石子、不受重力作用的裙子。
- RigidBody 组件中的 Use Gravity:顾名思义,指示当前刚体是否受重力作用。
- RigidBody 组件中的 isKinematic:是否受脚本规则影响运动而非受牛顿定律控制运动状态。
- RigidBody 组件中的 Constraints:是否在某个坐标轴上冻结位移状态或旋转状态。
碰撞盒组件 Colider
-
碰撞盒之间进行碰撞检测,当碰撞盒A与碰撞盒B碰撞时,会调用碰撞盒A所在对象的 OnCollisionEnter 方法,并将碰撞盒B作为参数传入;同时也会调用碰撞盒B所在对象的 OnCollisionEnter 方法,并将碰撞盒A作为参数传入。
-
如果将碰撞盒的 Trigger 勾选,那么这个碰撞盒会成为触发器,不会碰撞其他碰撞盒或给其他碰撞盒施加力,会穿过其他碰撞盒,仅检测是否与其他碰撞盒重合,触发的事件为 OnTriggerEnter 。
-
可以通过配置图层 Layer 与 物理规则 Physics 来指定哪些实体之间会进行碰撞检测,减少碰撞检测次数。
- 菜单栏中执行 Edit > Project Settings > Tags and Layers 命令可以设置项目中的Tags或Layers。
- 菜单栏中执行 Edit > Project Settings > Physics 命令可以设置项目中不同Layers之间的碰撞规则。
- 可以选中 GameObject 设置其 Tag 和 Layer。
输入管理器 InputManager
- 概念:InputManager 是 Unity 设置输入响应方式的管理列表,它的位置在 Edit > Project Setting > Input 中。
- 用户的输入在不同的平台会有不同的物理媒介,比如在电脑上通过键盘与鼠标进行输入,在主机游戏上通过手柄输入,在移动端通过虚拟按键输入……InputManager 方便用户把不同的跨平台输入方式作为黑盒,针对同一类输入信号用统一的算法进行逻辑处理。比如水平移动信号,可以通过键盘上的a键或左方向键(向左,沿x轴负方向运动),也可以通过键盘上的d键或右方向键(向右,沿x轴正方向运动),也可以通过手柄或虚拟手柄的x轴方向手柄来输入。
- Unity 的输入管理器中可以设置多个输入信号(InputAxis),Input.GetAxis() 可以读取用户是否输入这些信号。
- 每次调用 Input.GetAxis() 都会返回一个 -1 到 1 之间的浮点数值。0代表没有信号,1代表正向信号,-1代表负向信号。
- 灵敏度(Sensitivity)与重力(Grivity)分别代表用户按下或松开按键后,从无信号状态到满信号状态的过渡时间。例如灵敏度为3,那么当用户按下a后,x轴方向的输入信号从0过渡到-1需要1/3秒过渡。如果重力为3,意味着用户松开a后,x轴方向的输入信号从-1过渡回0需要1/3秒过渡。
Unity 脚本:派生自 MonoBehaviour 类
-
Unity 脚本可以作为作者的自定义插件挂载在 GameObject 上,每一帧游戏逻辑的执行阶段,会依次运行每一个有脚本的 GameObject 上的所有脚本。
- Start() 在首次调用任何 Update 方法之前在帧上调用 Start()。
- Update() 每帧调用 Update()。
- FixedUpdate() 用于物理计算且独立于帧率。具有物理系统的频率;每个固定帧率帧调用该函数。
- LateUpdate() LateUpdate 在每一次调用 Update 函数后调用。
- OnDisable() 该函数在对象被禁用时调用。对象销毁时也会调用该函数。
- OnEnable() 该函数在对象变为启用和激活状态时调用。
完成游戏逻辑与游戏GUI
- 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。
- 学会配置相机、光、天空盒。
- 理解实时游戏update的时序机制。
- 通过Input.GetAxis()与InputManager监听玩家输入。
- 用Instantiate()动态生成游戏实体实例。
- 从Camera.main获得相机参数,设置场景中的物体在画面中的位置。
- 利用标签、图层管理器区分实体种类并设置物理规则。
- 通过 Collider 组件与 OnCollision、OnTrigger 函数添加碰撞与触发事件。
- 通过图形用户界面(GUI)管理游戏界面。
课后
1962年,麻省理工大学(MIT)电脑·图像专业的 Steve Russell 在大学的研究室里用显像管作为游戏的场域制作出世界上第一款电子游戏《Space War》。从此打开了实时游戏的大门。
1972年,Nolan Bushnell 成立“雅达利公司”,发售大获成功的传奇游戏《Pong》。在此后的数年里,获得相应成功的游戏全部是对“挡板与球”这一游戏形式的变体。球体与立方体形状的刚体之间通过碰撞事件推动游戏的发展与走向。例如 1976 年发行的《打砖块》,1978 年诞生的《太空侵略者》,1983年发行的《太空战机》,1985年诞生的《超级玛丽》将“挡板与球”的游戏形式推向了一个新的高度(把马里奥、敌人看作是球,可踩踏的地面、箱子是砖块)。
假如我们回到那个百花齐放的上世纪七八十年代,利用本节课学习的内容,同学们能用球和挡板做出什么创新又好玩的游戏机制呢?同学们在课后快试一试吧~
参考文献
- 游戏开发:世嘉新人培训教材
本书由世嘉一线开发者执笔,并被选为世嘉新人培训教材,荣获游戏开发者奥斯卡CEDEC AWARDS 2009著作奖。全方位介绍游戏开发者必须掌握的基础技术,包括游戏编程、数学和物理等,内容充实,帮助读者建立起一套扎实的知识体系。
- 游戏设计梦工厂
《游戏设计梦工厂》是南加州大学互动媒体及游戏专业的系主任特雷西•弗雷顿教授的经典著作。作为一本将现代游戏工业与先进教学体系完美融合的书籍,通过《游戏设计梦工厂》你将学会“以体验为中心”的设计哲学和围绕这一核心的一系列设计方法及工具。
- GAMES 101 - 现代计算机图形学入门-闫令琪 (中级)
从计算机图形学的角度学习游戏制作的数学基础,有助于同学们了解位姿变换的具体数学实现方法(在引擎中只需要调用方法即可),了解相机、光照的数学模型。有助于初学者更好地理解游戏引擎中的某些功能的底层实现。
- GAMES 104 - 现代游戏引擎入门必修课-王希 (高级)
包含现代游戏引擎各个模块的算法与原理的大观概览。对于游戏制作者理解现代3D游戏引擎的实现原理有非常基础的帮助。
- GAMES 202 - 高质量实时渲染-闫令琪 (技美专用)
对于想要了解渲染原理或有志于做技美的同学建议通过这门课程学习。比如:想要通过写shader的方式做真实感或非真实感的游戏渲染,了解粒子系统、后处理或使用显卡加速游戏渲染的方式。