|
|
本课程会带领大家从0到1的开发一款强联网卡牌游戏:斗地主,不容错过哦。
* E+ n+ `' R6 o服务器采用:c# 开发
- O+ O' X, }0 d7 p9 U2 T2 w客户端采用:Unity2017
$ X* S% j/ f7 M6 Y: F/ Y4 {
! ], J/ G: ~+ F学完并熟悉掌握本课程会熟悉网游开发模式,独立设计并开发出一款不错的网游。
' l! N# N# L& N* ~2 `课程每天会有更新,难免有一些特殊情况望理解。1 u3 k1 G; C, c8 L
个人独立开发,素材都是从网络上搜集,如果瑕疵,请见谅。
: f7 i4 _( j+ A, E N3 A# T" A# P5 X6 w9 q" T5 C" H
严格意义上来说,本课程应该是两个课程合二为一了。) `% @- ?4 i& D) \' l
第一个课程就是《从计算机网络都服务器编程》。3 d5 W) b' o; R8 f% }
关于服务器,很多初学者都不了解,就觉得它很神奇,而且一接触它的代码就会发蒙,就是看不懂。为什么呢?因为不了解,所以我觉得应该从计算机网络这一层次开始说起,比如:- |3 a4 u( {4 Z- g( x6 \
什么是因特网?
) i1 N0 q# a$ h3 y' M- r什么是协议?# j3 ~' @9 ?! U
什么是应用层?应用层协议?. C/ L4 E* n. Y, A
什么是运输层?运输层协议?
) N+ K& F8 B Q' W+ s什么是TCP协议?什么是UDP协议?' U3 x# J1 @) h" {) n
等等···
+ ^2 Q5 M( z7 T(很深层次的知识,大家根据兴趣来进一步自己学习). u7 }! u V; N+ x$ q# A" P
知道了这些之后,就可以开始进行服务器编程了,包括协议订制,数据传输等等。其实大部分.Net都给封装好了,我们只是调用一下而已。最后做出来的使用方式和Photon Server基本一致,如果学过我之前课程的话那应该就会使用,不会配置一些乱七八糟的东西,而且调试错误可以直接断点,很方便。由于Photon Server适合某些特定的开发者使用,面试或者一些公司应用不广,而这个socket就很通用了。
1 h+ e, y, [" @; G
5 S2 E6 R+ { n- k9 O6 d第二个课程就是《斗地主》的游戏开发部分了,通过实战来教大家服务器怎么使用,怎么实现多客户端的同步。
8 T! p& A# g. ~7 a e! ~7 X斗地主大家应该都不陌生,所以这一部分就不用过多介绍了。客户端的架构是使用的之前的课程《基于消息机制的框架》,采用消息中心的思想,开发类似发邮件、收邮件的机制,来彻底杜绝脚本之间强耦合现象。
' Y( ^; u0 u; R* W. U t8 D
( \ Y) ]) R; E% `- V
4 m" K& \+ d% F3 f' W001-课程介绍
4 o2 P3 ^% I( A+ T+ q, \ q: r0 m ?003-因特网和协议8 v$ F& F! M' a! m# _
004-分层体系结构- C! w. [' ?( z- {
006-进程和套接字
) f7 b( T7 L# d s007-运输层协议TCP和UDP
9 n3 p$ T9 f8 e, h3 \& V- O- A008-应用层协议HTTP
: }' F( ?4 T) R) _( |) B' p5 ?1 f009-socket服务端
; |. D( o3 i$ u0 B010-socket客户端
9 q! g, \4 y4 p0 _# ^011-验证连接
8 B% ], t- c, t: V$ k4 O012-SocketDemo
/ }) C; ?0 B7 w2 ], D- Y013-实现接收连接的异步事件( \6 k, d. ? d |4 X7 g: W
014-添加限制连接数的信号
0 C4 x* U5 @) ~% _- G2 L015-封装客户端连接对象和编写连接池) F; [1 ]7 P9 w3 w3 T
016-GameServer(8-1)
, `& p+ V: V, f5 X' B0 E; G9 s$ X017-粘包拆包问题介绍5 a$ C4 } l+ W) Z
018-采用包头+包尾的方式解决粘包和拆包
% W2 M; M0 X6 I% t M! o. C3 j019-GameServer(8-3)1 \# V+ N* O% D$ m* Q# h# R+ b; x
020实现异步网络接受数据
+ Y& w, Z$ ?8 e& I021-客户端对自身接收的数据进行解析' }% v6 P* @6 i! I; |
022-构造SocketMsg负责网络消息的传递
9 G6 G! a' t* {1 _; V$ h' Z3 n023-实现soceketMsg与byte[]的转化3 [- s$ e# O& j5 G( ~
024-对象的序列化和反序列化3 O7 ?/ o% L5 a h8 v/ |
025-GameServer(8-3)_2* y& z1 R; b7 B1 q
026-实现客户端断开连接 E3 ~6 X" A. ~) l
027-实现发送数据
$ ], R( b3 e9 j3 I: A' c. H3 A028-助学篇:带大家回忆一下所开发的内容
/ h" m- _7 ?( B029-抽象出应用层
* G/ u+ I9 L9 C L/ p0 z030-GameServer(8-4)
* X$ l) w5 f( h& D031-开发定时任务功能(计时器),编写任务模型 a- f# ]( N0 c! A- i7 c
032-创建计时器管理类,监听到达间隔触发的事件3 [# S! g. X. K! l
033-控制定时任务(计时器)的触发时间! g2 k0 N; B5 M, A# z- I+ j" }& p
034-开发线程安全的INT类型
4 X1 k, w( R/ m1 P0 {7 o2 Y035-GameServer(8-6)* C3 r7 Y+ O8 R
036-实现单线程池# a6 x% m3 X( A/ y4 c
037-Unity2017下载
6 y2 A6 Y# G* Y* ?* a9 ~038-创建工程导入素材
* ^) a: d3 L+ _' r/ V; q) a039-Res* g w% ^4 x$ v# J2 E# x
040-Card(8-7)' ~& p! J+ R$ `9 L$ O5 o
041-GameServer(8-7)
1 b% R2 L9 h( R" d3 j( {+ @& s1 w043-根据策划创建面板 M. f" }* P4 f, a/ T3 x# z2 w- P
044-导入客户端框架,创建PlayPanel脚本
& W, t8 C5 O( V H6 f5 k* _, l; @4 Z045-完成开始面板
" U# d+ f% o( ]- \046-完成注册面板
9 g$ D R( [3 ?$ A047-Card(8-8)
9 H t; h0 |+ ?/ Y0 C049-服务器架构介绍
5 y& q4 @, {% p* ?; m/ s050-按照架构实现服务器( y; r4 R! E) M6 t8 H
051-在客户端封装Socket,使其连接到服务器* X# ^ Y$ A$ {$ E5 p i
052-测试客户端服务器的连接: M. M1 P4 W* U6 h/ r8 M' f) n" L* W8 j
053-解决BUG8 {' |2 D$ g) y+ G3 H* e
054-Card(8-9)
9 I0 h) T0 z, P, [ V055-GameServer(8-9)
, q9 T* A8 E1 f* N' P. I8 _056-修改客户端的链接方法
8 [: h5 F: Z2 ~056-修改客户端的链接方法_20171124142335
" ~: ?9 q0 J% V0 |4 a- t' U057-定义操作码、子操作码,演示客户端如何给服务器发送请求% V$ w# @: ^: K3 x7 R3 m; ^
058-测试数据传输是否正确
% Y6 w6 e- `% M' j059-Card(8-10)
F, F8 w. y% P% w+ z060-GameServer(8-10)" D1 ]1 c/ w% r( P
061-创建账号缓存层,实现注册的一些方法) ]1 s9 d! r' k, [# x, Q' P
061-创建账号缓存层,实现注册的一些方法_201711241423341 ^) r( z% O A0 f+ u5 \7 `
062-完成账号缓存的所有方法3 c" a$ `: g% Y! B1 r
062-完成账号缓存的所有方法_20171124142334
Y% `9 W% h/ B2 p4 @063-实现账号逻辑层
7 n# w% s# B" D- \* ]: }( B" z064-解决今日BUG
9 p3 b% ^& @1 ~ ]065-Card(8-11)
5 b' N1 S' i2 w# d066-GameServer(8-11)
( Q& W; Q1 a2 B' P- y4 f067-开发提示面板
+ |4 D9 v6 L; v1 b9 ^- z+ T- T. v068-给登录和注册面板添加提示8 s! R0 U( Q! a3 X1 d6 f* e1 o# o
069-处理接收到的服务器发来的消息、优化发送网络消息的方法1 v/ |% Q; R9 W. s& A; W) Z+ t
070-实现客户端的账号处理、怎样和服务器交互(后面调个bug)
7 _, g; I4 J; T071-优化服务器,改变传输结果+ k) @( v( k6 `0 W8 q4 O# @- O
072-Card(8-14), S1 T' w( ^4 ^7 w8 G
073-GameServer(8-14)
2 K+ X) [) @) D; A; ~ R3 n7 c2 O$ ?( ~7 z074-初步实现场景管理器,融入到框架中/ @% N b/ E+ L- g7 Y D) d8 T/ k
075-增加当场景加载完成的时候调用的方法$ c Z* a0 K5 }/ E4 |7 @: ^) k
076-实现登录成功跳转场景
7 }6 G3 Z0 M3 o2 U2 X0 `077-设计UI之主界面的信息面板; l4 a# ~7 c( k/ a
078-设计UI之主界面的匹配面板
$ S& a0 ^) U6 K$ n/ d- v079-设计UI之主界面的设置面板$ n+ q4 {2 v* D# f* V/ H. A5 n
080-设计UI之主界面的创建面板
8 n8 {/ r4 M$ Z$ b081-Card(8-15)/ O3 c" n, d" Z* \; k+ M m
082.编写信息面板% E1 s0 e, c$ A9 t7 w9 \7 U7 {$ O
083开发匹配面板
, r. |$ z1 e4 S9 j084.修改默认创建的脚本
4 `" T# V9 w1 o085.开发设置面板
2 a, K" u% \+ r2 H% E086.开发创建面板
7 k4 {, y/ ?! |0 G: ]087-Card(8-16) U9 B) T, E. g, n! M" @
088.创建角色数据模型
, X3 F! t$ c% S' C9 T% P089.开发角色数据的缓存层& f3 p8 ]/ g( z4 r |% s; W2 N+ U
090.完成角色数据缓存层
# j9 i2 J# D7 ?3 z091-GameServer(8-17)% J9 J/ P: ?; W' W l4 S5 l
092创建有关角色的操作码
" N g# h j5 l1 }( b093.实现用户逻辑层$ b g3 {8 i7 s$ {6 \) u4 y
094.向服务器获取信息,在客户端创建用户处理类
1 |' L0 P% [$ J- m095.客户端处理获取角色信息的响应
1 P9 v6 {% t& E# ~4 R% C; x1 d5 {1 f096.保存接收到的角色信息并且处理角色上线响应1 V8 Q6 N: |/ b5 D6 V
097.发起创建请求和处理创建响应3 \7 K2 M% k3 }- u. `5 k
098.演示本日BUG' Y% \. m, C, I( |0 d
099-GameServer(8-20)
- [: t1 W( q- w8 s f3 ?$ |100-Card(8-20)
! s8 Q9 q( H6 z; V) W3 O101.更新客户端视图
$ t4 a, K1 Q1 {( S' L102-编写匹配操作码% ?3 k6 b$ ~: T! l
103-定义匹配房间的数据模型
& i1 V7 ]9 W9 r Q1 [/ ?104-创建匹配缓存层,实现进入匹配队列
6 u% B7 M/ ?& V8 R; }: x$ B+ ?105-实现匹配缓存其他所有的功能
4 {' y0 k9 [/ L& h& L5 l106-创建匹配逻辑类,实现进入匹配房间功能7 r$ k6 j" p2 Q4 D0 f: r5 V
107-优化服务器之群发消息8 o: [% u% z0 Q6 i9 ~: j: ?9 R) x- x
108-创建匹配房间的传输模型,在逻辑层进行构造
1 ?+ F; q; o& w' J109-实现离开匹配房间功能$ m# U8 V0 d: y+ a& f4 }
110-GameServer(8-24)) f* \: Y# \* Q0 u. z! V
111-实现玩家准备
& s5 f/ c. F( R. d3 v112-在客户端发起匹配请求
2 R% a6 n. C) h4 L+ c113-GameServer(8-25)
: V+ Z+ |( g. A9 z114-Card(8-25)! k: I$ a' d% o$ ^* E& x& _$ e g
115-创建MatchHandler,接收服务器的响应
& `, y5 J* @! H. c7 G+ D& U: h( }& z116-保存房间信息,他人进入房间广播处理' K, ]2 ]' M! F# }4 J" g7 e
117-玩家离开
- h+ O* X2 G% H# R) X: |. z9 V118-玩家准备和开始游戏的处理
! I4 }, \: y0 n; T' O3 l: A119-GameServer(8-29)
! s5 ^3 }$ z6 j120-Card(8-39) (1)
; {: ?) f) R! x# W( R) q N121-搭建战斗界面的左、右角色状态面板
9 o: ~3 K1 F. p& J; ^5 F3 s s122-搭建战斗界面自我的状态面板
! b. c) g7 k' r7 A6 a123-搭建战斗界面上边的底牌面板
+ x5 ~- Z- ?0 y124-搭建战斗界面下边的快捷聊天面板* o) G% f. M \8 e; C& V w* d6 e
125-搭建提示面板和结束面板
6 O) f( G6 F2 k. P! o9 L126-Card(8-30)" }9 C; V# k: W" d
127-创建出牌点,实现进入房间按钮功能
# O8 n" I' x2 ]6 a128-控制底牌显示,编写代码
+ K2 M* x' q4 [' u% n129-在服务器工程内创建卡牌的传输模型类; p1 B/ O* Q6 ~* M$ Q- p, C& x
130-分析并创建状态面板的基类(有很强破音,别戴耳机,老师的麦又坏了)6 l% S: }& V! n: y3 J
131-分别创建左、右角色的状态类(有破音)3 B( f0 {) m, Q; E
132-ard(9-2)
9 p9 `+ Z9 G/ s H* s133-在匹配网络处理类里面和左、右角色的状态类互相相应(有破音)0 o! B1 g ?# Y. Z
134-如何控制玩家左、右玩家位置?(有破音)
- X x( u4 a* U! }, K135-进一步修改匹配处理类和左、右角色的相互响应(有破音、)
9 R5 h" K+ Z/ _) y136-Card(9-4)
& {# I: Q- G0 l' [137-GameServer(9-4)
1 ]4 ^0 C6 j0 R& q% y, H( P( f138-解决左、右的代码重复部分# t9 _% ]( r! {3 ?9 K
139-创建自身的状态面板(有破音)0 Z7 M j! ~" M
140-完善自身进入更新状态面板/ M5 x' Z( ^5 J" j) G
141-CardGame(9-5)% |* v- N7 s/ N, V; z$ M0 v" _. {
142-找之前的BUG(一)
0 q4 A) O. V7 W# o% K' w, K143-找之前的bug(二)/ t g4 [) q q5 u
144-Card(9-6)
9 p! V0 G* q/ x' E% D* [# g145-GameServer(9-6)
) b" _4 y' N4 t, V$ d1 k146-发送自身准备的请求
& m" ~$ l0 P+ Z o3 u- {147-创建下边的面板的脚本2 k$ h& ?: g/ i. b
148-Card(9-7)
7 \) U0 i6 f/ a- ?; Q ^: d$ |5 U149-创建聊天操作码,在客户的发起请求4 N' S: Y* k3 x+ N, c w
150-服务器处理聊天的请求,创建聊天传输模型
; A) C: j+ I4 ?- ?9 V151-创建聊天文字的常量类3 a$ z4 d! r: b, q
152-Card(9-9)
; a2 D% D% |) g1 c& ^4 p153-GameServer(9-9)' h$ A- E0 J" G- q9 a& Y# Z& T
154-客户端接收响应,显示聊天文字! P+ z1 ~# K( ]: ~
155-聊天声音的播放6 M) S0 l/ z& f0 x" T
156-测试聊天BUG
5 v. G* n9 W4 t, F g157-Card(9-10)4 J4 y6 n6 v% u, {; [
158-GameServer(9-10)
5 r- H( o/ T3 u0 U) C! ~" t159-所有人准备完毕开始游戏,使用中介者模式触发4 a4 F1 ]3 e4 u+ [: u2 g2 U
160-逐层分析,创建玩家数据的传输模型
/ [) `* O0 J7 M, k161-创建并初始化牌库,创建花色的常量类' d5 B2 a) B6 C: G4 _% h0 v$ q
162-创建权值的常量类,完成创建牌库的过程: Z! W; J0 B; w* m( F H
163-洗牌算法,完成牌库类
, g( e8 K6 @/ r( H6 R5 ~164-创建回合管理类
7 t- l+ M; c- ~6 l5 `8 R165-GameServer(9-12)
) m" u; I& h( ]3 r% M166-初始化战斗房间,添加第一个方法:转换出牌4 C- Q M/ d' h) [7 d
167-创建出牌类型,判断能不能管牌( t- d( ^& v7 }0 ~2 {& u
168-如果出牌判断成功就移除玩家的手牌4 Y0 e8 q3 J$ c/ K! N
169-增加倍数和更新回合信息, f! b8 f; r0 ?7 ^
170-发牌
9 m/ h" W. m/ q6 |171-设置地主身份,创建身份的常量类
) t Y- k. p% E6 h6 i% m& D8 y- B) W172-补充一些辅助方法,完成战斗房间所有内容
0 P/ H% _; p4 L- h173-GameServer(9-13)' f" \/ z+ K4 p8 ^6 @$ y
174-创建战斗缓存层1 J( T0 a! ^' ^! }9 b! e# {) w
175-定义战斗的一些操作码2 B, u8 L( J5 L$ c: X5 q4 Q$ q8 |: U
176-编写开始战斗的逻辑. O, Y5 t: N3 p' N( p
177-关于发送卡牌集合还是卡牌id的解释
}5 I! P4 r" q( `6 W, @" X178-GameServer(9-16)) h/ m2 w7 @ H: A" s+ X' N5 z
179-实现抢地主的方法7 E, b2 J/ t: d2 K
180-创建出牌的传输模型,获取选中牌的权值' r3 p; Q, o( T8 r0 o% i. M
181-判断各种卡牌类型
1 |* ]6 p( C4 m3 N182-完成编写出牌的传输模型, h8 |/ a0 m7 i# v5 {
183-GameServer(9-18): r' m- c$ d4 ?
184-玩家出牌在服务器的处理 P; m; A% F3 |! y6 P
185-转换出牌的实现
' U0 p" H: J X& z- c' T186-游戏结束的处理
6 k8 n0 g6 H; \. R! q2 X187-不出的处理5 e7 ]+ a7 e `- f
188-玩家掉线的处理
' J3 r# Z; g( {6 h9 Y7 y0 [189-GameServer(9-20); w7 ~! r, T* S4 {3 v9 G% Q
190-在客户端创建战斗的处理类,编写获取卡牌的处理) ?# [# r% F2 s. l4 W
191-创建客户端的卡牌控制类
* t2 {4 Z, I) U6 {7 p192-创建自身角色控制类,管理卡牌的创建
2 B" t' }4 L; q1 N- G; V193-创建左、右玩家的控制类,管理卡牌的创建
2 ?' T L, v' g194-Card(9-21)* u/ O3 M# `1 j
195-给大家录制BUG过程
8 F0 C: T8 M; A) R196-GameServer(9-23)5 d* f% {7 v( W5 |
197-开始处理抢地主的响应
) m) @3 M: |$ `/ ^198-发送抢地主请求和抢地主成功的处理
6 `4 O6 M) {& w+ y- P) a199-自身的玩家添加三张底牌的处理
4 p" N6 R+ B: @' {4 C( }200-抢地主成功的处理完毕2 l3 K1 l# p0 d) V
201-测试抢地主并修改BUG1 t) R+ g7 c4 [: h
202-Card(9-24)
4 Y5 b8 S4 R& A _1 V2 U k203-GameServer(9-24)# o' }1 `. G4 g( j% g
204-接收来自服务器的出牌命令
8 f; v( A( }3 \6 B205-客户端出牌的处理
+ g% X& O0 w2 b9 k206-向服务器发送不出的请求" ]' T( I# G' f+ C
207-GameServer(9-25)
+ _/ t4 h/ c1 x4 f/ |" }208-Card(9-25)' S2 G, W9 N$ x; O2 `
209-给卡片添加碰撞器让他能点击
. K9 A1 i) C# h210-解决出牌BUG
- V+ i- ~% r- w( i' x9 E211-移除出完的手牌
' y) D0 U0 ~) W, t2 y212-管理桌面的牌显示# v: i1 ?/ Q3 F6 \* ?+ {
213-出牌特效声音的播放8 Q6 u' o2 n# W- e% Q! c! H. z* X
214-GameServer(9-27)+ j1 v# z) N" x) d
215-Card(9-27)9 G% s9 ] w8 r0 d$ A5 c! {
216-测试出牌BUG 上部& u5 @" A8 `2 O) P2 D3 k- L$ y
217-测试BUG 下部" ]: Z. U; Q8 [ p
218-客户端+服务器(9-28)
9 |0 E' S+ @. K5 G2 Q& D3 x219-创建OverPanel代码脚本
) }+ |0 D: r! O5 T220-通过消息机制表现客户端的结束* G% _4 ?/ ~, |7 S- m6 u
221-测试游戏结束
0 i, B. N% I0 ^' T* X222-创建背景音乐播放控制脚本
$ C: q) }) w, O7 T223-给前两个场景添加背景音乐
1 C5 M( {+ J7 I6 L0 F+ A224-完结与未完
( S: ?; h, | [( }225-Card(9-30)
% O* h! H1 N1 z N' v' B8 W226-GameServer(9-30)
. k7 C. J! D* x( E227-扩展课之ProtoBuf- c! \5 `% ^9 K
228-扩展课之ProtoBuf(10-15)下载地址:
8 ]+ G+ Z" b5 Y
! e1 y! J7 C5 ]. A; G& r- N6 P3 T/ F, @2 W
, Y. `% ~5 H: k) W0 [! b" o) z$ p |
|