「从零开始游戏开发研修 2021
花村老林 #鱼苗夏令营#
一个与技术无关的开场小问题
「什么是游戏?」
「什么是游戏?」
A Game is
A closed, formal system that
Engages players in structured conflict and
Resolves its uncertainty in an unequal outcome.
本次大课程内容
PART 0「开篇:技术开发的现状、框架和挑战」
PART 1 「原神渲染与引擎技术简析」
PART 2 「ECS实战入门指南」
PART 3 「关于引擎框架Setup的思考」
Q&A,小作业点评
友情提示:本课程预计长达数小时,请自备茶水、点心、和三连 ~( ̄▽ ̄)~*
PART 0「开篇:技术开发的现状、框架和挑战」
A. 开发岗位现状:分工、职责、技术栈、发展路线
B. 技术框架入门:人人都应该有的基础架构和工具箱
C. 如何应对困难和挑战,以及如何成为专家
A. 开发岗位现状
分工、职责、技术栈、发展路线
A 开发岗位分工
「客户端」
处理美术、音乐、输入等与玩家直接交互的部分,一般运行在玩家设备上。
客户端设备平台迭代很快:家用游戏机、PC、页游、手游、VR……
客户端程序需要跟引擎打交道,与美术配合也很密切。
「服务端」
处理玩家远程数据、玩家之间交互,
以及系统级功能,一般运行在服务器上。
服务端程序需要长时间经验积累,
技术换代较慢,稳定性高于一切。
A 开发岗位发展路线
「技术路线」初/中级程序 -> 高级程序 -> 技术专家 -> 技术总监 ...
「管理路线」初/中级程序 -> 程序组长 -> 主程 -> 项目主管 ...
「创作路线」程序 -> 制作人
「邪道路线」程序 -> 技术美术(TA)
A 开发岗位职级体系5.0(客户端/服务端)
A 开发岗位工作内容和职责
「客户端」架构、引擎、逻辑
「服务端」架构、逻辑
架构、逻辑、引擎的知识点、技术栈、思考路径可能「完全不同」!
请在广泛深入了解之后,谨慎选择自己的学习和发展方向。
「架构」平台体系结构,并发模型,异步计算,网络同步方案,中间件……
「逻辑」数据结构算法,输入输出控制,UI/UE,数据/协议管理,战斗管理……
「引擎」计算机图形学,GPU体系架构,光照模型,美术资产工具/优化……
Q:逻辑就是写写背包、任务之类功能么?
A 关于逻辑开发的两个小例子
FlowField+Steering 实现多单位寻路
参考【HowToRTS
手动编辑方向+自动生成 FlowField
SDF(Signed Distance Field)
A 关于逻辑开发的两个小例子
在横板单摇杆射击游戏中,实现冰墙技能操作手感
冰墙是技巧型技能 (攻/防/位移)
需要移动中尽可能精确释放
单摇杆天生少一个操作维度
不能直接复刻瞄准/右摇杆操作
参考
https://ow.blizzard.cn/heroes/mei
A 公司项目组技术栈(客户端/服务端)
A 公司项目组技术栈
请在广泛深入了解之后,谨慎选择自己的学习和发展方向。
「客户端」
Unity c#开发,MVC架构或ECS架构。上手快,性能和表现受开发者影响大。
Unity c#+lua开发,上手快,代码可热更,性能较低。
UE4 蓝图配合c++开发,学习难度较高,有成熟的框架和工业级表现。
「服务端」
erlang 函数式语言,优雅的Actor模型,高并发,稳定,极限性能一般。
c/c++ 学习难度陡峭,历史最悠久,性能高,初学容易翻车。
go 新一代系统级开发语言,为并发而生,性能高。
golua 结合了go的高性能+lua的热更新能力。
skynet 结合了c的高性能+lua的热更新能力。
B. 技术框架入门
人人都应该有的基础架构和工具箱
B 面向对象的问题
面向对象编程的灾难:是时候考虑更新换代了!
https://zhuanlan.zhihu.com/p/81551537
Erlang之父:为什么面向对象很糟糕
https://zhuanlan.zhihu.com/p/25165797
面向对象编程的弊端是什么?
https://www.zhihu.com/question/20275578/answer/26577791
设计模式的滥用,让OOP的问题和矛盾更加凸显
B 客户端架构(初步)
「基础结构」
数据、逻辑、表现三者的关系
如何解耦,如何通信?(MVC、MVP、MVVM其实并不重要)
B 客户端架构(初步)
Input
Logic
Render
Entry
Timer
Data
模版数据 vs 实例数据
可靠、高效的组织 - 数据结构/算法
常见的数据文件:excel、csv、xml、json
常见的数据组织:list、dictionary
B 客户端架构(初步)
Input
Logic
Render
Entry
Timer
模型、贴图、UI
音乐音效
表现管理是客户端最重要的功能之一
原则:逻辑执行不依赖表现
资源的有效利用和管理
需要和美术配合优化完善
B 客户端架构(初步)
「战斗逻辑」
通用的战斗数据和逻辑(单位/生命/移动/技能/飞行物/Buff等)
基于可视化/数据配置的的技能体系
OOP继承体系 -> 组合优先 -> EC架构(Unity) -> ECS架构(Unity DOTS)
《守望先锋》GDC2017技术分享
https://www.lfzxb.top/ow-gdc-share-table-of-contents/
B 服务端架构(初步)
「核心」一种基于事件的高并发消息处理框架
一般为多进程协调工作:高并发、高吞吐、高可用
「并发编程」
Actor、CSP、coroutine
go, c/c++/lua(skynet)、erlang、node.js
「网络层」iocp、epoll等现代IO机制
「持久化」mysql(MariaDB)、mongodb、redis
B 网络同步(初步)
B 基础工具箱
「通用工具」对象池,消息队列,反射库,时间管理,状态机等
「数据处理」json、csv、xml,二进制数据,ScriptableObject
「资源管理」AssetBundle打包,异步加载和资源管理,资源更新等
「UI库」FairyGUI(推荐) 或 UGUI
「协议处理」Protobuf,Json等
「网络同步」Mirror,MLAPI,MGOBE
「ECS框架」Entitas(推荐Entitas-Lite),Unity DOTS
「优化工具」Profiler,UWA,PerfDog
B 可视化编程
「适用」快速原型开发和迭代。对代码和性能要求不高,美术和策划也容易上手。
「工具」Unity:Bolt,VisualScripting(2021+);Unreal:蓝图。
Bolt入门教程 https://www.bilibili.com/video/BV11a4y1a7DX
B 迷你项目技术流程
「开发平台」Unity 2020.3 LTS,虚幻4.26
「代码仓库」熟悉git(GitExtensions,SourceTree
如何处理冲突(commit-pull-merge-push)
线上仓库 coding.net 或 gitee.com,权限配置
「协作平台」TAPD(可选)
「框架选型」针对项目类型构建基础的代码结构
「工具箱」准备必要的、较为熟悉的工具箱
「协作流程」配置表导出工具(策划),美术资产制作标准(美术)
「其他约定」编码规范(写成.editconfig)
C. 如何应对困难和挑战
以及,如何成为专家?
C 困难与挑战
易上手,难精通,意难平
平台更替,技术演进,美术进化
设备适配,兼容性,稳定性,性能优化
热更新,深度学习,TA技术,程序化生成
玩家越来越高的要求
策划越来越大的脑洞
C 应对挑战 —— 态度
「兴趣爱好 vs 工作需要」
我是否热爱游戏行业?我平时玩不玩游戏?玩什么类型的游戏?
我如何安排游戏时间?我是真的喜欢自己做的游戏么?
「技术研究 vs 功能开发」
我更擅长技术还是功能开发?我愿意往哪个方向发展?
搞引擎/技术是不是更牛逼?做功能/逻辑是不是有点low?
「代码整洁 vs 快速原型 」
我是否有代码洁癖?我是否是完美主义?
我是交付可用的代码还是好的代码?我是否掌握重构的基本技能?
「职责明确 vs 补位意识」
做好份内事不给他人添堵,出现问题时主动沟通协调?
C 应对挑战 —— 方法
「如何学习新技术/知识?」
扎实的基础(数学、英语、逻辑)。
权威可靠的网站、社区、行业动态。
教科书法 vs 实训法。
博闻强识 vs 领域专精。
「如何有效地搜索?」
尝试不同的中英文关键词。关联链接,判定有效性。
避免被某些技术博客误导。尽可能不用百度和CSDN。
「如何做技术选型?」
实用主义 vs 前沿技术。
拿来主义 vs 自造轮子。
「如何解决复杂问题?」
大/复杂问题 - 分解 - 小/简单问题。
C 前沿研究领域和方向
ECS架构优化
Unity DOTS实战难点
可视化编程及可视化配置
Houdini 程序化生成
基于深度学习的AI和情景交互生成
Serverless及服务中间件
GPU Driven Rendering Pipeline
软光栅化 + Visibility Buffer
https://zhuanlan.zhihu.com/p/382687738
UE5!!!
C 部分推荐书和资源
《注重实效的程序设计》
《游戏感:游戏操控感和体验设计指南》
《腾讯游戏开发精粹》
《游戏编程精粹》全系列
《Unity Shader入门精要》
《游戏设计梦工厂》
《任天堂哲学》
《U3D商业化网游架构课程》https://b23.tv/QgqcUP
《Unity从入门到入土——收藏这一篇就够了》https://zhuanlan.zhihu.com/p/151238164
《如何成为一名优秀的设计师:罗子雄》https://www.bilibili.com/video/BV1AE411H7iD
C 部分推荐书和资源
「技术网站、公众号」
知乎,stackoverflow,Github
引擎官方视频号(B站、油管),官方论坛
UWA(网站/公众号/专栏/付费课程)
知名大V(如宣雨松,韦易笑等)
腾讯游戏学院,腾讯GWB游戏无界
「游戏行业媒体」
机核、触乐、indienova,手游那点事、游戏葡萄、游研社,STN
「常用素材网站」
引擎官方素材商店,itch.io,opengameart,humblebundle
「10000小时」
人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断
的努力。一万小时的锤炼是任何人从平凡变成超凡的必要条件。
—— 格拉德威尔《异类》
谨祝各位早日从平凡成为专家
PART 1
「原神渲染与引擎技术简析」
PART 2
「ECS实战入门指南」
PART 3
「关于引擎框架Setup的思考」
什么是引擎框架Setup?
游戏引擎开发者预设的设计思路,体现在代码组织、逻辑架构上。
有的从软件工程思路出发,有的从实际项目抽象而来。
工程的实践和设计的美感,有时需要相互妥协。
Unity vs Unreal
Unreal 工具链优秀,框架完备;Unity 提供轻量灵活的底层。
「Unity」引擎+framework bus
没有约定gameplay框架,只提供了EC结构组织。
对新手友好,小项目优势明显,大型项目需要从头定义框架和工具链。
Unity的未来是DOTS,但是向下不兼容,不确定性很大。
倾向于优化灵活性和编程范式,把提高游戏上限交给游戏公司。
「Unreal」引擎+framework
框架定义合理详细,游戏抽象完备,围绕之上做出了工具链。
学习过程需要按照它的Setup去理解概念,背后有很多专业领域知识,存在一定门槛。
倾向于加入最先进的功能,优化工具链,拉高游戏产品上限。
Unity Setup
Object
<- GameObject (active/layer/tag, transform, 组件, 消息)
Object
<- Component
<- Behaviour (enabled)
<- MonoBehaviour (生存期回调, 各种消息回调, 协程)
生存期:Awake/Start, Update/FixedUpdate/LateUpdate, OnDestroy ...
奇怪的知识点
GameObejct类型的变量在对象被删除后会自动变为null?
生存期函数并没有定义为接口,是如何被自动调用的?
Unity Setup
「常见套路」
Manager,一般是全局唯一,管理多个同类对象,常用单件模式。
EventBus,通用事件队列,用于Manager或游戏单位之间的通信解耦。
Controller,一般挂载在游戏单位上,负责相关单位逻辑。
Unity事件处理,如输入和碰撞等,常依靠Tag来区分游戏单位类型。
GameFlow,流程管理,对应场景切换,常用FSM实现。
「八仙过海」
官方 FPS Microgame https://learn.unity.com/project/fps-template
GameFramework https://github.com/EllanJiang/UnityGameFramework
ET框架 https://github.com/egametang/ET
Unity Setup
「DOTS」
ECS:identity (entities), data (components), behavior (systems)
Job System
Burst compiler
DOTS介绍2019 (by 宣雨松)
https://www.bilibili.com/video/BV18J411t7G8
UE4 Setup : GamePlay框架
《Inside UE4》 - 知乎 | 大钊
UClass
<- UObject (元数据、反射生成、GC垃圾回收、序列化等)
<- AActor (Replication、Lifecycle、Tick)
在UE早期,纯OOP的Actor继承体系很容易导致复用膨胀爆炸,
于是UE4从隔壁借鉴了Component结构,形成了继承+组合的混合结构。
然而依然有一些神奇的接口 AActor.OnTakeAnyDamage
╮(╯-╰)╭
UE4 Setup : GamePlay框架
UObejct
<- UActorComponent
<- USceneComponent (Transform及层级结构)
<- UPrimitiveComponent
Actor
TSet<UActorComponent*> OwnedComponents
TArray<UActorComponent*> InstanceComponents
USceneComponent* RootComponent
UInputComponent* InputComponent
UE4 Setup : GamePlay框架
Object->Actor+Component->Level->World->WorldContext->GameInstance->Engine
UE4 Setup : GamePlay框架
AActor
<- APawn(可被Controller控制, PhysicsCollision, MovementInput)
<- ADefaultPawn,ACharacter(人形)
为何Actor也能接受Input事件?
UE4 Setup : GamePlay框架
AActor
<- AController (控制Pawn, 可独立存在, 有数据状态, 同步)
<- APlayerController, AAIController
Component-Actor-Pawn-Controller结构
思考:哪些逻辑应该写在Controller中?
Pawn固有的功能写在Pawn里
可替换或者可用于多种Pawn的逻辑,写在Controller
需要超出Pawn生存期的逻辑
其他请自行学习研究:AInfo, APlayerState, AGameMode, AGameState,Subsystem(4.24+)
热身小作业点评
模仿解谜游戏《Baba Is You》核心玩法,复刻一个有若干关卡的小游戏。
主要考察如何用合理的数据结构和算法来实现游戏的核心玩法规则。
无需完整复刻游戏所有机制元素,也无需过于关注美术画面表现。
可以在各大视频网站观看《Baba Is You》的游玩录像。
如果条件允许,也可以在Steam平台购买游戏本体进行体验。
《Baba Is You》以极具颠覆性的玩法设计,
曾赢得下2017 Nordic Game Jam,2018 IGF Awards,
2019金摇杆和TGA最佳独立游戏等一系列顶级荣誉。
Q&A
「问答环节」
下课!
「THANKS」