|
|
本课程会带领大家从0到1的开发一款强联网卡牌游戏:斗地主,不容错过哦。( c; S; Y$ Y! M- t
服务器采用:c# 开发
a0 i! z; V1 U$ g9 O; |客户端采用:Unity2017# s r2 C! ~& g8 J+ Z
9 Y- v; x/ X& l% x学完并熟悉掌握本课程会熟悉网游开发模式,独立设计并开发出一款不错的网游。, c6 L2 e, a' }9 W g- [/ Z
课程每天会有更新,难免有一些特殊情况望理解。
' W( I4 H/ \5 t) M, K- v" s个人独立开发,素材都是从网络上搜集,如果瑕疵,请见谅。7 n$ N) w$ _+ ]; X
' J+ _! l) J3 b7 b' f
严格意义上来说,本课程应该是两个课程合二为一了。
5 Q8 }: x8 X' ]+ r; f第一个课程就是《从计算机网络都服务器编程》。
5 Y$ B' _ O2 K9 m$ E$ M关于服务器,很多初学者都不了解,就觉得它很神奇,而且一接触它的代码就会发蒙,就是看不懂。为什么呢?因为不了解,所以我觉得应该从计算机网络这一层次开始说起,比如:
% P3 q0 A& _6 z( e+ @什么是因特网?$ s" c( s; B7 K0 _, e$ @6 @
什么是协议?
5 j* Q1 V# T; G( s- O什么是应用层?应用层协议?
4 ` N$ l9 m; L4 {( A什么是运输层?运输层协议?3 H. o8 U3 x2 U/ d0 U* l# Z
什么是TCP协议?什么是UDP协议?$ h8 @$ H$ G0 p& |
等等···
* q* V+ A7 N$ {' F9 ~6 ~(很深层次的知识,大家根据兴趣来进一步自己学习): ?" }; c) E' n8 _$ y
知道了这些之后,就可以开始进行服务器编程了,包括协议订制,数据传输等等。其实大部分.Net都给封装好了,我们只是调用一下而已。最后做出来的使用方式和Photon Server基本一致,如果学过我之前课程的话那应该就会使用,不会配置一些乱七八糟的东西,而且调试错误可以直接断点,很方便。由于Photon Server适合某些特定的开发者使用,面试或者一些公司应用不广,而这个socket就很通用了。( [5 u, }$ `$ K7 ], d8 ]
b0 Q4 P* c4 b# r' @; U" ?
第二个课程就是《斗地主》的游戏开发部分了,通过实战来教大家服务器怎么使用,怎么实现多客户端的同步。
" g; X6 l4 ]7 k- H斗地主大家应该都不陌生,所以这一部分就不用过多介绍了。客户端的架构是使用的之前的课程《基于消息机制的框架》,采用消息中心的思想,开发类似发邮件、收邮件的机制,来彻底杜绝脚本之间强耦合现象。7 G' B' ^9 t* M
3 W* t9 \8 g4 l- \2 ~0 m* k; ` O) [5 h6 s# U
001-课程介绍' s$ a: C: h9 S: m
003-因特网和协议" Z2 O! S% r; Z& F4 a
004-分层体系结构
. N# r( N# \) o! S$ Y$ y006-进程和套接字, N7 h# m4 y1 L* C
007-运输层协议TCP和UDP! T- g; s$ t0 d, K s) K, J
008-应用层协议HTTP3 i6 L& X, q4 ~4 ]1 D; t4 b
009-socket服务端) p2 I4 W( }1 D/ |3 r: f; G
010-socket客户端
/ N! q! S+ m6 E( D4 X& }011-验证连接
& w! e1 W) b& L: b012-SocketDemo( O! C4 R5 U6 Z# T6 _2 A# C
013-实现接收连接的异步事件
; M# v8 G* s2 U u' D014-添加限制连接数的信号1 q& N: i8 z; c" y1 }9 O5 s
015-封装客户端连接对象和编写连接池: W* L* I6 u3 R: ^. r- M2 T
016-GameServer(8-1)
, I+ Y" W8 k W: |2 e. [4 F7 u/ @017-粘包拆包问题介绍0 R/ O$ H4 ]6 T$ n( g- v. |) C
018-采用包头+包尾的方式解决粘包和拆包
1 A% C& _: k( N: T+ F* v019-GameServer(8-3)
8 M5 j0 T- @8 ?0 z020实现异步网络接受数据6 f) b$ W: X: z5 [) P6 P2 B
021-客户端对自身接收的数据进行解析
6 F& a* z8 R; } b1 _6 J022-构造SocketMsg负责网络消息的传递; K+ m2 m+ R+ x( I
023-实现soceketMsg与byte[]的转化
. t8 c4 P/ g9 d0 I024-对象的序列化和反序列化
. S% E# ?/ W) w! l! c8 D" P025-GameServer(8-3)_2+ ^1 k. x; p% h' ]3 i q
026-实现客户端断开连接1 N+ O7 W% r; E8 a+ z
027-实现发送数据
" k5 e0 [8 {, e028-助学篇:带大家回忆一下所开发的内容% B9 y* l: e$ V+ W/ S
029-抽象出应用层, {! N: Q3 ?- \& o# n9 l
030-GameServer(8-4)
8 j6 m. W4 e$ Y$ ~+ G- E' o031-开发定时任务功能(计时器),编写任务模型
( ]2 ?9 `8 a8 L+ ~2 f v; d032-创建计时器管理类,监听到达间隔触发的事件
+ V$ \; D/ k6 I1 G8 r; @# `( ?033-控制定时任务(计时器)的触发时间* U: `* S8 X" l% A s" i
034-开发线程安全的INT类型& D' E7 r5 F: d3 a6 {+ Z a. [
035-GameServer(8-6)1 {- m' u: _6 A9 i1 ^8 d) ^
036-实现单线程池
) w' u/ E3 l$ Z& l037-Unity2017下载1 g8 U1 M: }0 g f% m
038-创建工程导入素材3 ~1 R8 i( S" o0 i; p
039-Res5 _1 H! ?7 r- x1 U* N% t
040-Card(8-7)
# M# h+ W5 A( c5 S041-GameServer(8-7)
0 g( l8 f @ K2 {043-根据策划创建面板
7 c4 g3 o" h* P/ Z$ a& g) Q. }6 U044-导入客户端框架,创建PlayPanel脚本0 P0 k& g# N; t3 b, W
045-完成开始面板; D; y3 d! ~3 ~* Y, ]" w
046-完成注册面板
0 k( P' e: [: Z x% v) @047-Card(8-8)6 g. R2 |! g$ }
049-服务器架构介绍
9 j6 D% ^" l4 R* s9 S: m- J: s050-按照架构实现服务器9 e8 ^) S3 ^* m2 d) ?7 Q- r$ @
051-在客户端封装Socket,使其连接到服务器) q9 O f* n8 x8 @+ q! ]( K
052-测试客户端服务器的连接3 ^0 Q/ O9 h p$ Y$ l J, R( g
053-解决BUG
8 w' N$ [" R' j9 `054-Card(8-9)$ V3 `& N! C/ s7 C) E
055-GameServer(8-9)
9 g& a9 C; D0 o! Y056-修改客户端的链接方法3 C8 \; D8 ]9 \7 b2 t0 j/ d
056-修改客户端的链接方法_20171124142335
- u+ f$ l( h: x# V; {057-定义操作码、子操作码,演示客户端如何给服务器发送请求
: R3 L% |6 V5 p' n8 z- U058-测试数据传输是否正确
" g+ u2 T. w: g9 o5 p6 [& `059-Card(8-10)
: e0 B; y$ E1 ^* O- l: V060-GameServer(8-10); d& A8 v% p6 V8 @( S9 J5 Q
061-创建账号缓存层,实现注册的一些方法& y' G# A3 }% Q F9 [% U% Z& d
061-创建账号缓存层,实现注册的一些方法_20171124142334% f- e( D' |! F1 V) F
062-完成账号缓存的所有方法
* f; {3 N: `+ ?: }( a+ N7 g062-完成账号缓存的所有方法_20171124142334
4 m/ ]; A; m. c# F3 D- i063-实现账号逻辑层
# q5 d0 E. i1 q, \- H2 C; |064-解决今日BUG
& S& |4 y x# [065-Card(8-11)
: C& k6 u9 E5 e+ F2 F" {& o3 g$ ^) I7 T066-GameServer(8-11)
9 J# I5 }& p$ u7 t/ \067-开发提示面板
# {! N# F$ |$ R! y) P068-给登录和注册面板添加提示0 T; l% ]0 K+ Q* y
069-处理接收到的服务器发来的消息、优化发送网络消息的方法2 }6 A/ s6 ?3 R4 X, s: l& `
070-实现客户端的账号处理、怎样和服务器交互(后面调个bug)- q& l# W* s' J; Q2 m( I5 @% ?: J
071-优化服务器,改变传输结果& b- ^1 g8 b* p2 C; @1 `# {" m
072-Card(8-14)7 _" G8 B& l9 E
073-GameServer(8-14)( e5 Z% n5 h; e1 `
074-初步实现场景管理器,融入到框架中
4 |+ @1 j+ Z& M( f+ ~4 f075-增加当场景加载完成的时候调用的方法, ^1 G& K& w$ @& u2 E3 n) ^
076-实现登录成功跳转场景
' H; _4 A3 ]0 P! A077-设计UI之主界面的信息面板
4 w4 `+ L" O3 M) w: L, J078-设计UI之主界面的匹配面板
' W. L% d# ]: I+ d079-设计UI之主界面的设置面板
1 p1 q( B: M+ {) ]: W4 h080-设计UI之主界面的创建面板
) c q) O2 e# P( w& D- v% ], M081-Card(8-15)
5 O2 o1 w/ Z- {4 Z2 c0 [ F082.编写信息面板
) T% E# o/ d# s8 i083开发匹配面板
! J- ^/ n, M: J- M( q: I' A5 x- L7 j0 X084.修改默认创建的脚本
% G5 `6 Q- M& Q9 K7 J L085.开发设置面板. d+ u4 m8 k2 x" I( ^; k) q$ ^+ ~
086.开发创建面板
5 w8 o% [6 x% [) s8 r+ _087-Card(8-16)
" s" w3 ~' e3 k088.创建角色数据模型
; B' \ c; W7 k6 C- d$ R$ u7 |089.开发角色数据的缓存层
0 ]5 w, Q" r+ H2 L090.完成角色数据缓存层+ `/ y/ m, _1 p6 X5 n* [4 c1 _) |4 x
091-GameServer(8-17)
$ K* @* l3 Q* S, f092创建有关角色的操作码: T9 q- [) M0 A& {6 u1 s$ G, @" }* \
093.实现用户逻辑层
: Z. d) Y% l: N8 L4 E094.向服务器获取信息,在客户端创建用户处理类
+ x* q2 L. n0 C0 A. p- _' `* [6 i! `095.客户端处理获取角色信息的响应9 i, A( K2 {( y9 @
096.保存接收到的角色信息并且处理角色上线响应
0 U! Z! `' J+ G' s097.发起创建请求和处理创建响应! J7 p- T# t: [; _) y; X
098.演示本日BUG+ u6 x/ p# O `$ T: E
099-GameServer(8-20). F* R- D. Z' M5 E( ~+ U
100-Card(8-20)
- F/ @9 [% u( ]1 s! z101.更新客户端视图
2 M; N- {! h# ]/ k102-编写匹配操作码
( I. q, j v2 M# Q0 V103-定义匹配房间的数据模型
' ]! p" Q) N4 Q: b4 @( A( v104-创建匹配缓存层,实现进入匹配队列* [6 }& _+ O- G% X* {
105-实现匹配缓存其他所有的功能, h/ x# j4 T$ z- I" B# \4 d' J
106-创建匹配逻辑类,实现进入匹配房间功能
/ i: p- P }2 q1 k' j% y, `107-优化服务器之群发消息" N) g- ~! Y! a: ^4 u" F" D
108-创建匹配房间的传输模型,在逻辑层进行构造
/ A1 t4 T8 L# w: R4 N% B( o109-实现离开匹配房间功能. l0 `' I% w( M0 D$ T; D
110-GameServer(8-24)
5 y4 x3 e+ F+ b8 U5 p111-实现玩家准备
0 R* }6 g- W2 `0 x( S3 u112-在客户端发起匹配请求
/ ~% @: g! P& b% Z/ k113-GameServer(8-25)
1 J5 s% R. S8 U3 S114-Card(8-25)/ s p b8 o9 U6 ^8 p' ?; Z) J `
115-创建MatchHandler,接收服务器的响应2 ~& x. G R1 E
116-保存房间信息,他人进入房间广播处理
7 L( c) N7 H& I* ^ |; v% Y7 Q* n! [117-玩家离开3 ~ q8 \0 G; f& X( w, y- J- v- m
118-玩家准备和开始游戏的处理# ]2 |1 k1 {% f; D4 R
119-GameServer(8-29)
' w. y7 g2 D, s. n% J120-Card(8-39) (1)
4 Y8 _7 t5 x1 A; G9 Y, Q7 f1 \121-搭建战斗界面的左、右角色状态面板
7 _1 V& \$ ]9 v122-搭建战斗界面自我的状态面板
" o( O8 s% P% h2 c o! c123-搭建战斗界面上边的底牌面板4 O& @0 k) K# M- ?
124-搭建战斗界面下边的快捷聊天面板
7 x; C6 O& z+ O1 u. x125-搭建提示面板和结束面板* \9 M- I& N! M6 c
126-Card(8-30)
/ n' n: _: A! O5 u, d$ q# F- s ]127-创建出牌点,实现进入房间按钮功能6 K, x" V8 {8 ^0 j: l5 |
128-控制底牌显示,编写代码9 R7 _) E) S$ q9 W
129-在服务器工程内创建卡牌的传输模型类
' x8 x5 [/ D2 f# r: a; D- P; S4 @130-分析并创建状态面板的基类(有很强破音,别戴耳机,老师的麦又坏了)
$ d/ r* Y6 E! S9 |- U131-分别创建左、右角色的状态类(有破音)
# f8 x& X; ~" x$ t ^: J2 h132-ard(9-2)& m( H4 N+ ]: N* y
133-在匹配网络处理类里面和左、右角色的状态类互相相应(有破音)- R2 e8 h' A; G, |6 u; u/ v' W
134-如何控制玩家左、右玩家位置?(有破音): E1 W) I8 A/ _- N0 {
135-进一步修改匹配处理类和左、右角色的相互响应(有破音、)
) \8 Y( c) ?0 p) W( R& S( O" c136-Card(9-4)& v) W8 Q* [! T* _# U" R
137-GameServer(9-4): g( |6 Q) A+ z5 r1 ~
138-解决左、右的代码重复部分& M- {, N2 s4 l- R% A+ R
139-创建自身的状态面板(有破音)
) a3 z# t$ E+ q6 S" ?140-完善自身进入更新状态面板
; \* N# N% B* E R141-CardGame(9-5)
: I* f5 y( Y) @# R3 E142-找之前的BUG(一)
: h/ M+ |: i3 V1 c* a143-找之前的bug(二)
% \5 X6 p' J. u2 O _- @) I# u0 z) K144-Card(9-6)
$ u; {# v& }" U! ]1 P& }145-GameServer(9-6)
, S" D a4 v- z6 G146-发送自身准备的请求
8 P/ ~' C. s. J. X% o9 G; \- V147-创建下边的面板的脚本
/ d$ ]- e) Q! } O/ ^: U+ w$ ]148-Card(9-7)! d/ [' O" J1 d9 i3 j. k
149-创建聊天操作码,在客户的发起请求
% ~! T8 U( ]# [150-服务器处理聊天的请求,创建聊天传输模型
+ _- L* \4 F; T$ {151-创建聊天文字的常量类
: w" x* a; y5 h' o1 y9 f5 I152-Card(9-9)
9 |; f" t1 i& N- p153-GameServer(9-9)' W F. c/ d; `3 X. m' T8 X
154-客户端接收响应,显示聊天文字' H: t7 s/ J+ L2 q/ g
155-聊天声音的播放6 l; [4 T( r8 _' z% }2 j
156-测试聊天BUG1 `* i% I& d0 d
157-Card(9-10)
( Y: l0 m$ W* {. b& i5 J- d! R L) y158-GameServer(9-10) N2 y [8 E8 t! ^- ?) ~* i8 a2 l
159-所有人准备完毕开始游戏,使用中介者模式触发1 s% G7 B. ?+ I
160-逐层分析,创建玩家数据的传输模型6 `2 j6 J/ B( ]' H% I8 V
161-创建并初始化牌库,创建花色的常量类5 |% `$ n3 ~+ X
162-创建权值的常量类,完成创建牌库的过程1 a! n3 g m5 e( j% q3 ^8 e9 {; e
163-洗牌算法,完成牌库类6 _! {+ B( F; b3 e: y( I
164-创建回合管理类
8 h2 j3 ?7 d8 a0 R- a# X165-GameServer(9-12)3 A; |9 ?( g5 C X" f6 y
166-初始化战斗房间,添加第一个方法:转换出牌
# y, m& {, n/ e. v# K% g% P% S/ w167-创建出牌类型,判断能不能管牌" ~4 Z1 h# z4 b# g# v
168-如果出牌判断成功就移除玩家的手牌: F# f: l! h9 [ z& z7 g& |
169-增加倍数和更新回合信息0 c9 s/ H% l! L" M
170-发牌% f' k$ F6 I, D
171-设置地主身份,创建身份的常量类
) P; {+ U5 c! V; L; {172-补充一些辅助方法,完成战斗房间所有内容
6 |. c; N b/ s" k9 j5 z& x0 k, T173-GameServer(9-13)8 D6 K! p6 L, E* X, i7 ?
174-创建战斗缓存层
9 a2 E/ ?, w/ D, u0 I6 L8 m175-定义战斗的一些操作码1 ^5 E8 L; _ m3 a$ }, k
176-编写开始战斗的逻辑
$ Z& Q( e' |* C( k' l' E5 Z2 o1 Q177-关于发送卡牌集合还是卡牌id的解释
* @1 y: d, O+ Q+ ^8 g178-GameServer(9-16)
' w$ x! v2 s2 H0 E& W! N179-实现抢地主的方法
+ o, e4 ]0 K0 T; t( t/ Z# d180-创建出牌的传输模型,获取选中牌的权值 H! e$ }9 F" o' B m
181-判断各种卡牌类型
, s9 `' X2 y" G182-完成编写出牌的传输模型. l0 g- T7 R4 c! @" o
183-GameServer(9-18)* H6 I* u5 ?' L3 D1 s4 o
184-玩家出牌在服务器的处理
% s2 b; T$ Y& w J7 s9 C185-转换出牌的实现
' U+ T1 c( T- W/ ^3 o/ y" B186-游戏结束的处理
' ^4 E0 k }9 a5 J6 ?: B% v9 D187-不出的处理
' I+ ^& S o I8 }) u188-玩家掉线的处理
& a, W0 F( C8 S4 p5 I! \189-GameServer(9-20)" D$ D; H: I8 c: x' ^
190-在客户端创建战斗的处理类,编写获取卡牌的处理! |0 I" C6 c6 P" ` Y6 y& e
191-创建客户端的卡牌控制类% j$ z, G; I4 H' [. g
192-创建自身角色控制类,管理卡牌的创建
5 A7 t9 c6 R# V1 ]# T9 L193-创建左、右玩家的控制类,管理卡牌的创建- M3 m* m# G1 T4 W6 ]
194-Card(9-21)& A, i% [5 U5 e6 {& Z9 ?# I
195-给大家录制BUG过程3 g: W: x$ N& [3 M
196-GameServer(9-23), H- J2 S) j& w* X
197-开始处理抢地主的响应, ]; k. j4 [1 X6 Y( T* b! D" O
198-发送抢地主请求和抢地主成功的处理
; c& S$ O& R, X; G3 ]199-自身的玩家添加三张底牌的处理3 X+ C4 ]: s8 i1 p9 v7 j6 Z4 B
200-抢地主成功的处理完毕' a0 S0 W [) X; X2 ^
201-测试抢地主并修改BUG
% u8 x' ?7 S$ k- b. s2 U/ Q202-Card(9-24)( {/ U: M9 f7 x
203-GameServer(9-24), t& d0 M/ a+ l& `; ~8 w$ N- S
204-接收来自服务器的出牌命令% n7 T. n/ T. [0 l, _" v
205-客户端出牌的处理1 O1 B9 n& e3 v. z! v
206-向服务器发送不出的请求/ {3 o p. z. r) c. @2 |: |" s
207-GameServer(9-25)1 t. D4 w0 U: w) [
208-Card(9-25)0 g7 H& a) P3 ?9 ]( j
209-给卡片添加碰撞器让他能点击0 d: m# ]2 r! R# O5 ~1 T) V
210-解决出牌BUG
' ~) p8 A" \( p" z g6 ~211-移除出完的手牌; a: h9 |, N" n' ]" E& S
212-管理桌面的牌显示
6 T5 u6 }. ^0 S4 N213-出牌特效声音的播放' l% @$ h/ U; I5 [
214-GameServer(9-27)
8 G6 w8 |& g! M; T# [( l9 a5 j215-Card(9-27)
" U' v2 w, p- G7 n9 c5 e( l216-测试出牌BUG 上部
3 {0 ~$ Q( U, X) E" d) w217-测试BUG 下部
- ?! @6 N8 @5 L |6 d+ M218-客户端+服务器(9-28)
4 e& p9 n8 J+ f3 V219-创建OverPanel代码脚本
- w$ F; h) w; t- R7 ?220-通过消息机制表现客户端的结束 p8 n% A2 E* O
221-测试游戏结束
5 i; l* x3 s) }, N% s% T4 \ \8 k/ J222-创建背景音乐播放控制脚本
8 K( r* b2 N8 D% N0 g223-给前两个场景添加背景音乐
0 r8 L% k, q |9 M/ p224-完结与未完
! { {6 {5 Z: k' |) e225-Card(9-30)$ l& s+ x# }2 f# |7 _
226-GameServer(9-30)/ t: g, O& v+ y' V8 G: K4 Z" s
227-扩展课之ProtoBuf+ q# ]3 S/ J+ p. ~5 u) u% m
228-扩展课之ProtoBuf(10-15)下载地址:7 Z/ U! E" l4 y. |* l) U, Q; E
" H/ ` @( ~' O5 f7 Q6 Y
1 a5 A1 I4 }' ?: Y* b0 L
( q; R3 d% x' D! z" v5 \
|
|