|
|
本课程会带领大家从0到1的开发一款强联网卡牌游戏:斗地主,不容错过哦。
z1 W, q( \$ {3 I) T; x# i" R) Y服务器采用:c# 开发 0 u) P% O. l2 l8 t" p3 D
客户端采用:Unity2017
) L# M! T& z( y3 {3 d2 ^8 B1 F* X9 P$ J$ {& S* i) I1 J5 d
学完并熟悉掌握本课程会熟悉网游开发模式,独立设计并开发出一款不错的网游。
1 v5 I3 j' q i5 q' l+ n4 d" ~课程每天会有更新,难免有一些特殊情况望理解。* y5 D0 d" k+ R" _
个人独立开发,素材都是从网络上搜集,如果瑕疵,请见谅。4 n9 W z* H1 X8 ~) F( [+ g
5 i+ L9 K6 n. O. p5 [
严格意义上来说,本课程应该是两个课程合二为一了。
+ e' w! |, n4 X) a! T. v第一个课程就是《从计算机网络都服务器编程》。& H2 d0 t' n+ A7 x& R0 s
关于服务器,很多初学者都不了解,就觉得它很神奇,而且一接触它的代码就会发蒙,就是看不懂。为什么呢?因为不了解,所以我觉得应该从计算机网络这一层次开始说起,比如:1 L# D/ x! I+ @( A
什么是因特网?' i( u: e5 h' F& V
什么是协议?# F u5 l( h- k: v5 ]0 D! @- X
什么是应用层?应用层协议?
/ \+ a4 O3 H% r* u+ `/ ~# _什么是运输层?运输层协议?# O7 h6 N% @4 I: Q# W! f
什么是TCP协议?什么是UDP协议?* {# v9 q" z, @3 s ~6 E: w& \9 G
等等···8 [- w* b1 V1 `0 W/ c0 w3 ~
(很深层次的知识,大家根据兴趣来进一步自己学习)
+ [3 j# p b, k* o; H知道了这些之后,就可以开始进行服务器编程了,包括协议订制,数据传输等等。其实大部分.Net都给封装好了,我们只是调用一下而已。最后做出来的使用方式和Photon Server基本一致,如果学过我之前课程的话那应该就会使用,不会配置一些乱七八糟的东西,而且调试错误可以直接断点,很方便。由于Photon Server适合某些特定的开发者使用,面试或者一些公司应用不广,而这个socket就很通用了。" R( d: @. f0 }' y
# I N& R- m* J# g) X第二个课程就是《斗地主》的游戏开发部分了,通过实战来教大家服务器怎么使用,怎么实现多客户端的同步。
; L7 Z9 H6 d0 f% J: F斗地主大家应该都不陌生,所以这一部分就不用过多介绍了。客户端的架构是使用的之前的课程《基于消息机制的框架》,采用消息中心的思想,开发类似发邮件、收邮件的机制,来彻底杜绝脚本之间强耦合现象。
$ J& D' b! I* }# S8 ?6 U% V7 H* x$ {( g+ u3 y, p
/ ?' w. |& @9 s: i
001-课程介绍
( ~- D& ~' R3 n003-因特网和协议
% ~& p! O; H, ` @) m/ R004-分层体系结构: R: q% q% I# N" b: }- d6 f
006-进程和套接字. x6 C( r/ D. q9 m- Q. G6 ]
007-运输层协议TCP和UDP
1 O1 j' A) R0 t008-应用层协议HTTP
1 d) ?8 f# G* L0 w4 ^3 Y* A009-socket服务端
' x" d4 C3 S/ o7 y: ^1 p010-socket客户端7 ~; n+ U8 Y5 s6 M6 [0 z
011-验证连接) G$ Q0 x( ?- r) i
012-SocketDemo
' Z+ A1 N" V1 n8 ?/ ?013-实现接收连接的异步事件
1 i0 v5 ]; Z: Q% M& C014-添加限制连接数的信号
$ y5 A' m- r4 ^5 s015-封装客户端连接对象和编写连接池
D2 w4 S9 j# }' ?) ~4 F016-GameServer(8-1)
, ^+ g- w5 Z5 Z0 A$ Q0 d7 X017-粘包拆包问题介绍
* x+ G, h& w( n018-采用包头+包尾的方式解决粘包和拆包- I% Y8 ^7 Q1 a2 {
019-GameServer(8-3)- B- K9 Z( X$ X
020实现异步网络接受数据6 L* ~; \3 T, B$ l
021-客户端对自身接收的数据进行解析/ \: s) g3 q( g/ u% P4 @6 X
022-构造SocketMsg负责网络消息的传递) V! ]: d) r+ X9 |- l( n& ?+ s
023-实现soceketMsg与byte[]的转化6 Z' r% f: U! U m6 \/ {' a0 M5 D
024-对象的序列化和反序列化# n X; W( l) L$ Z- _# M
025-GameServer(8-3)_2
( X3 K/ `- k3 p: Z& Z" f9 M( F026-实现客户端断开连接
0 j8 E% r( o# y M4 ?5 ]% T. `7 i027-实现发送数据
- B+ k& y9 j% I$ S3 K; T2 E/ `* u K$ O028-助学篇:带大家回忆一下所开发的内容2 k7 t2 d/ X2 y9 o
029-抽象出应用层+ V$ k& q1 J1 j% j& b
030-GameServer(8-4)
+ D) v% Z5 s0 T! p031-开发定时任务功能(计时器),编写任务模型4 x$ V- o9 M3 B' [
032-创建计时器管理类,监听到达间隔触发的事件
, x4 I: f( A: F+ o% s5 Y7 ^033-控制定时任务(计时器)的触发时间
% P- D8 y$ j3 \, g( j& q034-开发线程安全的INT类型. W$ d. D: f7 _5 l8 L( U1 X
035-GameServer(8-6)& N% j/ ]" K |9 D3 a0 O# W
036-实现单线程池1 @: H' ]7 @* ^) e! C& M4 L; v; p
037-Unity2017下载8 t' h/ u) e6 k5 d% m
038-创建工程导入素材
+ u9 \+ p1 I( A# S039-Res
4 Y& p$ ^. K, P. c" s040-Card(8-7)8 q; K1 ~1 u' ^' |
041-GameServer(8-7)2 U5 c6 [, l1 Y2 R
043-根据策划创建面板
5 f1 f* U" r5 R044-导入客户端框架,创建PlayPanel脚本
' o$ e6 y& M3 q' U045-完成开始面板: s) m2 C0 Z$ i8 R F/ L" ]+ U
046-完成注册面板2 x0 X {8 _! R& p& U8 o
047-Card(8-8)
/ m, Y& u! s3 G4 J049-服务器架构介绍
/ ?% o! B' Y% i& O' F3 Q/ T, ?2 `050-按照架构实现服务器- A+ Q- `; H4 j( g; b! y+ m
051-在客户端封装Socket,使其连接到服务器
& f9 X9 v. ?; l T; U- {052-测试客户端服务器的连接
; H& B/ u( F; O* d3 }2 e" i9 I053-解决BUG) c9 |3 P. g" m
054-Card(8-9)6 X6 U0 R3 {, `. @+ g/ T) n9 d! e# C
055-GameServer(8-9)
* R" Q, y9 p1 T9 B& t' S7 n! e8 Y056-修改客户端的链接方法
/ {1 y' \* j: P% E! G056-修改客户端的链接方法_20171124142335! ]4 z. i9 F# ]" z
057-定义操作码、子操作码,演示客户端如何给服务器发送请求
2 G6 [% n/ U$ J- h5 e058-测试数据传输是否正确
# ^$ P" @; ?7 e- D059-Card(8-10)
) M9 d, D5 H5 b' h3 ~# G3 }060-GameServer(8-10)5 Z, \) H5 {) R$ f" p8 S' B" }4 c2 e
061-创建账号缓存层,实现注册的一些方法
7 b I( C- i$ p4 I. j061-创建账号缓存层,实现注册的一些方法_20171124142334
; [: \, a E/ Q4 p r0 z062-完成账号缓存的所有方法3 G% B; Q) B& N
062-完成账号缓存的所有方法_20171124142334. j# r1 m1 D1 m0 g R- d
063-实现账号逻辑层9 z- T5 S) t& |! {' r4 y" P7 G& g
064-解决今日BUG a1 I0 O g/ c8 ]) [
065-Card(8-11) N4 R7 K8 Z5 v) R8 G0 q* t5 R
066-GameServer(8-11)1 I& O% Y( O# F5 K; ?( e" R) B$ B
067-开发提示面板0 Z( ~2 Z4 B2 U# g: `3 C4 C
068-给登录和注册面板添加提示
; J* p6 k! n, q) N- g0 J7 o069-处理接收到的服务器发来的消息、优化发送网络消息的方法7 k: [7 i# N7 q, }
070-实现客户端的账号处理、怎样和服务器交互(后面调个bug)5 j' J7 m) Y$ B: v
071-优化服务器,改变传输结果: q5 f6 i$ t) r
072-Card(8-14): z- P/ V1 r: p8 o' K* ?
073-GameServer(8-14)
/ L- z5 a: j r7 u P T074-初步实现场景管理器,融入到框架中2 t# Z w* M. ]) S* I3 ?
075-增加当场景加载完成的时候调用的方法6 C7 g6 q; J5 @7 U% D
076-实现登录成功跳转场景
+ q6 y. T/ c5 X# n( S$ @& u077-设计UI之主界面的信息面板
1 _: f' f6 N( t0 H/ ]$ I! S! `+ W078-设计UI之主界面的匹配面板
$ s4 e" S5 ~! U( }( s8 G% W079-设计UI之主界面的设置面板
+ \* J% ~( M R% u X: x4 {080-设计UI之主界面的创建面板
3 u' B( b1 Q! y( X8 G' f" _081-Card(8-15). A8 K. q1 }+ \+ y+ S8 M7 k
082.编写信息面板
/ x% X' a( z K! W9 D083开发匹配面板5 g: S3 \7 L9 l. f1 j3 L
084.修改默认创建的脚本
3 i( O. |, B1 E$ V085.开发设置面板' y8 O. s6 W; v/ q% z$ O
086.开发创建面板, H9 {, U% G; X* A# K
087-Card(8-16)4 k3 |! p0 b# P c- K v8 G
088.创建角色数据模型. s! f! v$ ?3 e2 z7 E4 B0 c2 `
089.开发角色数据的缓存层
r, |+ _+ S' C8 t5 e i0 G090.完成角色数据缓存层+ x, p- @- j$ M6 E. ^- Q1 m
091-GameServer(8-17)0 x8 G3 t, H( G* Z
092创建有关角色的操作码8 `- U8 q- W/ v/ S/ U) W* p8 X
093.实现用户逻辑层: R7 n, d& o. {' C; ? m
094.向服务器获取信息,在客户端创建用户处理类
( N2 o1 v& n; ~6 o6 O" b095.客户端处理获取角色信息的响应
7 D2 d, o9 R3 y+ }7 l096.保存接收到的角色信息并且处理角色上线响应/ i O- d% U l( g, c
097.发起创建请求和处理创建响应 x' J+ `; m1 Q6 A
098.演示本日BUG
4 K- e; z( G+ f/ [0 f0 G, f: b099-GameServer(8-20)
% j5 E9 T+ s% e. S5 ]100-Card(8-20)3 c' C+ M6 Q' \- W
101.更新客户端视图
6 t9 T4 \, s$ y7 H102-编写匹配操作码
5 {* B2 ]9 H; T103-定义匹配房间的数据模型% r. G9 j' [" x' q
104-创建匹配缓存层,实现进入匹配队列
+ Y; a% A, v2 C u& R6 x105-实现匹配缓存其他所有的功能
1 K/ w/ E4 s+ k! T$ l$ w7 m6 {106-创建匹配逻辑类,实现进入匹配房间功能
7 s$ y! I# o5 M: r107-优化服务器之群发消息
4 B s- H: X; D5 R# \- o108-创建匹配房间的传输模型,在逻辑层进行构造
" d/ e" G2 R6 V" l109-实现离开匹配房间功能# q$ f9 n3 K$ M% Z& X a# o
110-GameServer(8-24)
9 y0 i1 T+ o6 A9 R" l1 s111-实现玩家准备3 x5 E) y) \% N+ x3 ?% ^9 A6 `
112-在客户端发起匹配请求; `- T9 y3 {; h& f+ E5 _
113-GameServer(8-25)9 j) J# r" w/ q
114-Card(8-25)
9 Q0 O' d4 I* y( s+ a! r115-创建MatchHandler,接收服务器的响应& ] }/ ?( ` R* c& I
116-保存房间信息,他人进入房间广播处理
: f& K* i3 o: o; r5 [4 C117-玩家离开8 ?$ u4 s) b# ]5 S/ m% }7 x
118-玩家准备和开始游戏的处理; i9 h' i! F& r5 x4 c
119-GameServer(8-29)
8 {* a* N4 V% t# Y! I; d0 _& T- ?; R120-Card(8-39) (1); a& s1 F- N; [$ x1 C# Y! i
121-搭建战斗界面的左、右角色状态面板
2 U2 _3 _5 |# |6 m/ {122-搭建战斗界面自我的状态面板
$ j2 S( {: m) a# V" s' A123-搭建战斗界面上边的底牌面板: q: f7 L# |; V* }. H. E+ g) b
124-搭建战斗界面下边的快捷聊天面板. V% e& ` y* p& ]* _$ c
125-搭建提示面板和结束面板7 j4 x V3 t3 G5 i; s
126-Card(8-30)6 s0 y) E$ G2 G E0 A+ e) C. q3 H
127-创建出牌点,实现进入房间按钮功能3 r( m8 g" W" j. A
128-控制底牌显示,编写代码
, r; i( [8 j' p$ A# `5 @129-在服务器工程内创建卡牌的传输模型类
$ C! l `& m9 o- m4 n3 Z$ }% |130-分析并创建状态面板的基类(有很强破音,别戴耳机,老师的麦又坏了)+ {- t- ^2 `% _7 Q+ X
131-分别创建左、右角色的状态类(有破音)8 E0 G0 x3 A/ f+ V
132-ard(9-2)5 a9 d+ E8 A6 {( i8 n6 K$ [1 }! G
133-在匹配网络处理类里面和左、右角色的状态类互相相应(有破音)9 s" v" \5 F2 C* z+ U
134-如何控制玩家左、右玩家位置?(有破音)! `: c; a# H$ f9 t8 {% D: i
135-进一步修改匹配处理类和左、右角色的相互响应(有破音、)" d0 D; ^& R9 V% d$ b
136-Card(9-4)
% S$ {/ v$ W4 `137-GameServer(9-4)
5 G* G8 d% K n! X& q8 f138-解决左、右的代码重复部分
9 S/ R& Y, ?1 P" v3 w) M' \139-创建自身的状态面板(有破音)
% S; d4 R, [& ]6 ~9 D8 {7 a# F140-完善自身进入更新状态面板
' K" i' b9 A! m$ n- W0 A" z3 Q+ d141-CardGame(9-5)" ^8 {* ~8 J( v. J' `: U' g3 Z
142-找之前的BUG(一)
3 r; E1 m: I+ u' z2 P" o143-找之前的bug(二)0 W2 V5 c+ ~( @& f' @8 B1 ?$ G% E' n
144-Card(9-6)" R: f. [. Z" {! b" ?
145-GameServer(9-6)$ L0 ] ^$ R1 L! {. o( C
146-发送自身准备的请求3 g6 H& S1 s1 F4 t, w0 \/ @, w' M
147-创建下边的面板的脚本
1 Y+ C# v' D! |( Z3 `148-Card(9-7)- f/ {' n7 S: G9 T" R6 {; q
149-创建聊天操作码,在客户的发起请求
8 j2 v2 \( L( o1 G150-服务器处理聊天的请求,创建聊天传输模型
, f; m2 M1 i5 g+ H p* d! R3 ^9 l t151-创建聊天文字的常量类
* N; H- f5 Q! ]9 n0 B152-Card(9-9)
) d: V# o- F: g0 u9 w# o153-GameServer(9-9)
& ]+ n( C+ c3 e7 [1 ]154-客户端接收响应,显示聊天文字) {+ }0 X) M4 }0 `- s
155-聊天声音的播放
8 s9 x# _ G- h6 r156-测试聊天BUG
- i% _$ G* N, G# Y, K157-Card(9-10)
8 V8 \- B1 O) m, p/ [" F _158-GameServer(9-10)
, k+ E! W7 W4 A+ Y" }$ w/ k159-所有人准备完毕开始游戏,使用中介者模式触发+ K% g! `9 r7 v0 o7 n3 d2 q
160-逐层分析,创建玩家数据的传输模型
7 O( O3 A1 n% T161-创建并初始化牌库,创建花色的常量类4 e( D# B% s; p& v# r
162-创建权值的常量类,完成创建牌库的过程
6 G1 n3 V/ z# T0 W9 |! `8 ~3 f. d163-洗牌算法,完成牌库类% G# j3 a) S5 J! n
164-创建回合管理类
8 J% P8 i; K' h4 G* h165-GameServer(9-12)
9 g! ~3 q; x% }8 x' ]* W/ Q166-初始化战斗房间,添加第一个方法:转换出牌# ~+ _$ k+ `) R# P G/ g
167-创建出牌类型,判断能不能管牌
+ f" o+ |5 C" W! a3 C+ M$ u168-如果出牌判断成功就移除玩家的手牌
, q3 ?# q# x$ p; T, N! M! c9 z169-增加倍数和更新回合信息
0 S8 o: a$ V8 g$ t# e170-发牌
1 Z( B( m& O6 z; I6 K" _2 ~) [- j171-设置地主身份,创建身份的常量类9 ^/ `3 {& v5 s8 A0 t' [
172-补充一些辅助方法,完成战斗房间所有内容+ V/ X }0 F: a+ L9 P, {' O
173-GameServer(9-13)7 j' h6 z% d" b' Y. u5 D
174-创建战斗缓存层1 ^& m- a+ i0 K' C7 [0 [0 l7 P3 T* U0 m
175-定义战斗的一些操作码0 L3 n/ T. T, e! p- _$ L7 p+ n8 }) L0 r
176-编写开始战斗的逻辑
' U) O9 N) s2 `2 V177-关于发送卡牌集合还是卡牌id的解释
! o9 e4 B2 H- a( ^! c1 M178-GameServer(9-16)
9 p2 t2 G/ {. x3 q& {179-实现抢地主的方法( |! f9 C* G+ w, e/ }
180-创建出牌的传输模型,获取选中牌的权值: V8 Z* @, V& {2 s; v3 f
181-判断各种卡牌类型
/ B% \9 p: L. b( t* h182-完成编写出牌的传输模型! ^3 p/ W2 y4 u
183-GameServer(9-18)
, v, `! t% _- y* `184-玩家出牌在服务器的处理: }6 ?& w; j/ M0 Q& o S/ K
185-转换出牌的实现
4 y4 h0 o9 V* x* M186-游戏结束的处理
$ e% p1 i2 V& m- H187-不出的处理
) s; H8 @. [3 T/ p) B) j, J188-玩家掉线的处理
9 @( J) s) ^3 f- G$ D& s189-GameServer(9-20)
/ g3 s b! t; ^& w2 B& V1 T# P190-在客户端创建战斗的处理类,编写获取卡牌的处理( K3 {& p; c! O% O
191-创建客户端的卡牌控制类
0 h) P7 ]. o& H9 \$ u: K: h. m192-创建自身角色控制类,管理卡牌的创建
) b$ j; B8 ?7 k# y" b193-创建左、右玩家的控制类,管理卡牌的创建4 _% K% F) h6 N- @9 q
194-Card(9-21) r8 W1 N% e, V' F, ~4 V
195-给大家录制BUG过程
$ @& ]3 ?. B6 U0 e' A7 f2 Y196-GameServer(9-23)
5 M2 h5 z% h! K9 x4 `9 n& z197-开始处理抢地主的响应& S! S, X$ A9 k' L- I
198-发送抢地主请求和抢地主成功的处理
, O: G. I6 x: j$ F$ l& e- N6 f199-自身的玩家添加三张底牌的处理* @4 G& y6 q% q. Q! D
200-抢地主成功的处理完毕
* ~" r* A+ B0 T, K$ O201-测试抢地主并修改BUG8 ^ {/ Z( z% k: \: s; ^7 ]
202-Card(9-24)
+ X* B+ l+ Z# B. M# x4 w$ M203-GameServer(9-24)% U* U1 x& p7 F7 W. ^
204-接收来自服务器的出牌命令
* U) F! ?- \8 B2 v! h L, i3 _7 n205-客户端出牌的处理- E, B9 n7 ]+ {+ o, F5 b2 h
206-向服务器发送不出的请求% ~: e3 o3 E( o5 b" g3 V* o6 h: r1 m3 j
207-GameServer(9-25)
$ `) J0 J5 t$ J4 G" j! S u208-Card(9-25)/ @, i$ F% p% _, @+ s% G" I& x
209-给卡片添加碰撞器让他能点击& H( P% |. m" V5 `' ~
210-解决出牌BUG
\) m+ q+ `0 z% D% K7 V' c211-移除出完的手牌3 _5 G7 V' S$ O
212-管理桌面的牌显示; K$ m' W5 Z4 B2 _7 K
213-出牌特效声音的播放
2 o' `2 h1 T/ P* U2 o/ r! X' H0 i' B214-GameServer(9-27)* `) K8 {9 E& \+ e) A1 k- g A
215-Card(9-27)1 y! t; t8 g: x( K# n! R2 m; }
216-测试出牌BUG 上部
! v( b3 q& G) k2 M; i* o217-测试BUG 下部
; o3 K4 T$ ~+ `7 `3 s. l b218-客户端+服务器(9-28)0 m' ?1 E" `& k5 C0 |) {5 i
219-创建OverPanel代码脚本: [( e- H; ]0 V2 i: s2 O0 j
220-通过消息机制表现客户端的结束
- h6 t9 W8 q" [221-测试游戏结束' x6 z, f; u4 C) I n+ g3 @
222-创建背景音乐播放控制脚本; Q2 O: ]. ]# X
223-给前两个场景添加背景音乐
1 |4 j# p; k. S# ^% Q$ g7 z224-完结与未完 L6 P4 ^" |9 ^2 u8 A: N9 \
225-Card(9-30)
; B" |$ I8 l& w% g226-GameServer(9-30)
1 W [ k& {' C9 W+ ]0 v9 B227-扩展课之ProtoBuf% I- u3 T. s; V" ]& ?9 l% D
228-扩展课之ProtoBuf(10-15)下载地址:
' b2 L5 m9 J! e& s
* R$ \: e8 k* W
" U; f e$ S; q4 l$ |3 l- q3 W( W: c$ l \; {- ^& |* q3 w% D, P
|
|