|
|
本课程会带领大家从0到1的开发一款强联网卡牌游戏:斗地主,不容错过哦。4 q( u2 Y' r* c1 F1 [$ i6 Q
服务器采用:c# 开发
. U$ ~5 w+ \& g4 e0 ]客户端采用:Unity2017
# J) R* h& C' j7 J7 P: }! E) w6 o; g/ }( [
学完并熟悉掌握本课程会熟悉网游开发模式,独立设计并开发出一款不错的网游。
3 |: i7 f2 V2 U5 A4 [* t课程每天会有更新,难免有一些特殊情况望理解。
. [9 ^6 V1 ^/ q5 d7 P个人独立开发,素材都是从网络上搜集,如果瑕疵,请见谅。7 {7 v% A6 E6 j% P
) a$ U/ H" b% \- c% b
严格意义上来说,本课程应该是两个课程合二为一了。
# P; I" |" P% g% d5 S第一个课程就是《从计算机网络都服务器编程》。) l5 J) [/ |# W3 ?# d0 R: U
关于服务器,很多初学者都不了解,就觉得它很神奇,而且一接触它的代码就会发蒙,就是看不懂。为什么呢?因为不了解,所以我觉得应该从计算机网络这一层次开始说起,比如:
, X d h' G6 ^" b什么是因特网?4 c4 e! d2 j3 h' a9 y$ k
什么是协议?
3 L3 ~0 P! ^+ K什么是应用层?应用层协议?
5 o- T9 G1 W% A什么是运输层?运输层协议?
7 w- [7 _, O( r; z" K2 Z什么是TCP协议?什么是UDP协议?( [3 p9 z# [8 C h* I
等等···8 i# G" f8 u2 b+ ~! k
(很深层次的知识,大家根据兴趣来进一步自己学习)9 c: c) g) b9 a9 X4 O4 K
知道了这些之后,就可以开始进行服务器编程了,包括协议订制,数据传输等等。其实大部分.Net都给封装好了,我们只是调用一下而已。最后做出来的使用方式和Photon Server基本一致,如果学过我之前课程的话那应该就会使用,不会配置一些乱七八糟的东西,而且调试错误可以直接断点,很方便。由于Photon Server适合某些特定的开发者使用,面试或者一些公司应用不广,而这个socket就很通用了。
7 W) }, k& x' o" U* P4 W$ m, A" m2 s# Z( Z
第二个课程就是《斗地主》的游戏开发部分了,通过实战来教大家服务器怎么使用,怎么实现多客户端的同步。2 d" v- I" P2 u
斗地主大家应该都不陌生,所以这一部分就不用过多介绍了。客户端的架构是使用的之前的课程《基于消息机制的框架》,采用消息中心的思想,开发类似发邮件、收邮件的机制,来彻底杜绝脚本之间强耦合现象。4 A1 t" z8 b% X* d& i7 |7 e
9 w" D0 A$ j4 D) b: e4 b$ X
3 b. [4 x1 v% f2 v9 X+ G001-课程介绍
& W" w( q6 X k: O$ I0 \3 S. F003-因特网和协议, ~" C1 U1 q% `. V! @) z
004-分层体系结构
, Y# A8 J2 n+ o* S. ?7 j006-进程和套接字
- [% y# [, H' V* R, W007-运输层协议TCP和UDP
: i3 C" m7 ?* B4 n! F008-应用层协议HTTP" J4 P* Y! Z1 c1 [9 T+ W
009-socket服务端 E/ o, q4 i* y$ @1 }+ Q
010-socket客户端
' c( }' l" k5 I# w% B" Z1 C d011-验证连接
$ A ^/ e0 H/ D* ~/ j012-SocketDemo. A2 N. k! [2 {, s0 P* t1 S
013-实现接收连接的异步事件
5 s! c. g. `. H3 x/ A- E+ w, F014-添加限制连接数的信号+ m) L' B7 d; a7 L) s8 J1 n/ L
015-封装客户端连接对象和编写连接池
6 u+ `' v2 F, D2 o5 _$ i1 }016-GameServer(8-1)( v. {* {' \8 B* o+ J7 r
017-粘包拆包问题介绍
" d/ V' H* E; f; Z$ C+ z, D018-采用包头+包尾的方式解决粘包和拆包0 c9 g% E5 ^7 d. d5 [
019-GameServer(8-3)) X& {! j) D1 t5 x
020实现异步网络接受数据7 Y0 \2 s5 v6 W# z0 e
021-客户端对自身接收的数据进行解析# f+ |6 w5 ]% a, `& ?' g7 q
022-构造SocketMsg负责网络消息的传递
j! O N/ W4 F023-实现soceketMsg与byte[]的转化
4 Z" F% x( ?# M8 t3 V+ y% h024-对象的序列化和反序列化: R1 o6 E2 }! H B$ z
025-GameServer(8-3)_2$ u; q8 }+ O* o/ g# u, e
026-实现客户端断开连接
( W. A; p/ K6 t O/ C. @6 t027-实现发送数据) _4 Z& ^5 s) v# q1 |9 l; D: \
028-助学篇:带大家回忆一下所开发的内容
( D9 k4 @( h' ?3 d. F029-抽象出应用层
b: a% k3 F" I030-GameServer(8-4)
) [" f* Z1 Y2 Z# B5 q5 J8 y031-开发定时任务功能(计时器),编写任务模型' [9 g. o9 z, ^3 c
032-创建计时器管理类,监听到达间隔触发的事件
7 g/ H& o g0 J0 R2 M) @; H- V: v, K8 z033-控制定时任务(计时器)的触发时间
K# H" ]2 y p6 e |034-开发线程安全的INT类型6 a5 O; @, L: E8 X
035-GameServer(8-6)6 y# X ?9 \* |( X- ~
036-实现单线程池
/ {1 ~' b' U) O7 v& l/ z037-Unity2017下载# z( o. @; Z* }6 c2 ?
038-创建工程导入素材
8 N2 G7 F( P/ x8 \& n3 w* y( p7 \039-Res
9 ^0 o- `0 U+ f! ?% m8 ?6 k* \040-Card(8-7)
! E" t& U/ W! }, W: S8 I041-GameServer(8-7). K% A5 N) h v( F' h
043-根据策划创建面板
3 e4 W: S4 z1 f! G044-导入客户端框架,创建PlayPanel脚本: {5 B: I$ D- z% |
045-完成开始面板
; n# h/ X+ {) z8 A+ Q2 L) V s046-完成注册面板5 R% T7 u5 U+ J' y( n
047-Card(8-8)
* q \4 L) q' i: K8 x. \049-服务器架构介绍
7 G8 s! d4 U" Z6 [( o050-按照架构实现服务器6 S2 T& L: O; O& W5 o! c% _; ]
051-在客户端封装Socket,使其连接到服务器1 P% q6 I# O" |4 C v% p: `0 p; e, V
052-测试客户端服务器的连接# a t7 a( p. l0 T
053-解决BUG" s- p' v% \. ]9 W9 W9 E; C
054-Card(8-9)
0 l; V+ h$ x; |, @2 O055-GameServer(8-9)
2 b% @) o5 m# F7 A% J. }3 o056-修改客户端的链接方法5 [$ ~& m( h( a0 _) E4 s; j( l
056-修改客户端的链接方法_20171124142335
* [/ t8 k5 b9 x/ R4 v5 I057-定义操作码、子操作码,演示客户端如何给服务器发送请求
( J( X9 |* g. o: @) }0 I9 {, k058-测试数据传输是否正确3 P, P" t/ ]; L0 o
059-Card(8-10)
! Z3 \% @; k& i. z4 s) Z7 B060-GameServer(8-10)
* p( B& ~% K: V1 x# U' ?061-创建账号缓存层,实现注册的一些方法
: `$ u. `# s$ f3 @# k0 a% h0 t061-创建账号缓存层,实现注册的一些方法_20171124142334 g. y. I+ l- M
062-完成账号缓存的所有方法
; c& D) h G' v- ?062-完成账号缓存的所有方法_201711241423344 v& _$ p3 f* Y' N% a- I0 h
063-实现账号逻辑层8 p6 R- n9 k& l* T% N4 J/ o
064-解决今日BUG" s9 T3 B! A. K4 `. z
065-Card(8-11)
, a( n5 }- ?0 ?( n" f( ^066-GameServer(8-11), C& N; D: t/ |. i
067-开发提示面板
. M- F6 b. G4 e# H; q; H8 j068-给登录和注册面板添加提示+ B% M! O" ^" a0 h& P% m0 F: Y
069-处理接收到的服务器发来的消息、优化发送网络消息的方法4 z! r f5 S' `, i
070-实现客户端的账号处理、怎样和服务器交互(后面调个bug)
& ^: r/ K! v$ y3 `4 Z. i/ h" a071-优化服务器,改变传输结果
2 w, p, p5 L$ D# U. o7 ^: S072-Card(8-14)
$ C9 f, M, U2 j3 X8 X' ^073-GameServer(8-14)3 _, j$ ]- d) b, A% V9 L, i- }! ?2 u
074-初步实现场景管理器,融入到框架中
1 M5 {! ]# j0 |% t& a( ^075-增加当场景加载完成的时候调用的方法
2 N, ~+ {' G9 f+ _7 Q+ w076-实现登录成功跳转场景. R8 l6 {: M7 J6 ^" Y/ F
077-设计UI之主界面的信息面板2 o2 ~: @- L h6 @% Q G2 H
078-设计UI之主界面的匹配面板: ]) m( k( _0 R/ n% F
079-设计UI之主界面的设置面板: I% v' y) d6 G1 F* @+ p* K% Q* }1 n
080-设计UI之主界面的创建面板& A# H: Y8 H( K8 j
081-Card(8-15)7 N+ W& _2 y1 g) F1 _% O
082.编写信息面板3 T* L" o4 a& K" I
083开发匹配面板" M8 P! v! v$ |3 a; W
084.修改默认创建的脚本. \7 w8 F0 t0 `6 n% X; G+ `* a
085.开发设置面板
4 q. x' ]# z4 H' x) _5 j6 a/ q; v086.开发创建面板
# |) I# N9 T/ G6 R1 `087-Card(8-16)
( F: J. e9 c# s088.创建角色数据模型: m: f: U F6 j. E0 g: \
089.开发角色数据的缓存层
1 `$ z7 g6 U! R6 P4 q; N090.完成角色数据缓存层
& f* l# B6 y7 x/ J: r; g091-GameServer(8-17)
7 j- O0 [# N0 l7 m3 D1 w092创建有关角色的操作码
2 V% |2 R7 {& n093.实现用户逻辑层; |9 ^+ _3 Y$ a3 K9 z( M* n& W8 \; q
094.向服务器获取信息,在客户端创建用户处理类4 e; S I3 p6 B, ~! q d1 v
095.客户端处理获取角色信息的响应6 G8 L. j8 ?* \4 \5 x0 e
096.保存接收到的角色信息并且处理角色上线响应- {: |* A* x8 g, E& h
097.发起创建请求和处理创建响应
* D( `3 E) Q; k2 L9 U098.演示本日BUG
, @3 f8 Q9 p, s9 c+ S( r099-GameServer(8-20)
- X; F9 V6 F/ ]. a q100-Card(8-20)! \& t% W. e2 T7 J: E; J0 J& f
101.更新客户端视图
& c; E( s) r$ F7 C102-编写匹配操作码
7 B% ^2 V+ n8 Z0 z$ P2 _( _8 M103-定义匹配房间的数据模型
- e* v& \, i/ ^. A8 N0 ?104-创建匹配缓存层,实现进入匹配队列& t. N1 a$ [; j- y& e5 `
105-实现匹配缓存其他所有的功能- ~, C4 W$ }; `; K- P' {
106-创建匹配逻辑类,实现进入匹配房间功能
- [/ x& M; v' s5 j: U" n2 V- p107-优化服务器之群发消息
/ s1 `6 }" Y8 o" c& o) {108-创建匹配房间的传输模型,在逻辑层进行构造
; Y1 V5 D3 }. P# s109-实现离开匹配房间功能4 @, Q2 w7 c ]6 m% G" s6 D
110-GameServer(8-24)* E Y' H8 w7 w6 y. H5 j: E7 o
111-实现玩家准备
; n/ W/ e6 }$ X( y% a112-在客户端发起匹配请求
* U% k) t3 r3 o& j, Q113-GameServer(8-25)
5 w# `5 s/ @5 r2 {% k6 f114-Card(8-25)
. G$ w4 u0 D) S) f5 [- Q$ p115-创建MatchHandler,接收服务器的响应( C7 w4 w. ~1 l
116-保存房间信息,他人进入房间广播处理0 j& ?* Z" r8 U z/ O
117-玩家离开) }) a! E1 J; n+ L ?( q0 \
118-玩家准备和开始游戏的处理: e# [4 X5 I# k( H1 s* ~2 S
119-GameServer(8-29). h4 C0 u; @( \) }/ V2 V5 L" Z: E, `, g% s6 w
120-Card(8-39) (1)/ T* u! u! v& \9 A. U" b; t" k
121-搭建战斗界面的左、右角色状态面板! l% X: p# B+ B& i# b& A
122-搭建战斗界面自我的状态面板
( U; z* b. E- Q/ N7 |8 S& }" m123-搭建战斗界面上边的底牌面板( a2 @6 F' i3 C. T( _$ |6 h
124-搭建战斗界面下边的快捷聊天面板8 u- c. ?7 a8 D: r6 z! K
125-搭建提示面板和结束面板$ A1 X1 Z g' k! I: Q( Y# @
126-Card(8-30); g. h, V5 p; j5 _8 b* {2 ^
127-创建出牌点,实现进入房间按钮功能
; o2 r$ G) n! _6 W) ^128-控制底牌显示,编写代码$ I* c5 ~" ]# p7 j! ?/ r! C4 e% L
129-在服务器工程内创建卡牌的传输模型类
2 A) i" [* X. h6 o. @8 \130-分析并创建状态面板的基类(有很强破音,别戴耳机,老师的麦又坏了)
' c3 k7 \% o4 b+ S# |: J. W. P131-分别创建左、右角色的状态类(有破音)0 }& V( {7 O# h C$ d
132-ard(9-2) `1 c0 S# o3 A& w
133-在匹配网络处理类里面和左、右角色的状态类互相相应(有破音)
# ]) i7 C" H. F; S1 ]0 D1 s9 T134-如何控制玩家左、右玩家位置?(有破音)
" h! t% k/ s( {135-进一步修改匹配处理类和左、右角色的相互响应(有破音、)! e% G$ P: N3 `* q8 s9 H) t/ {
136-Card(9-4)1 E& Y! Y) G2 M, f I, j2 {! @
137-GameServer(9-4)6 M8 _8 L% L7 r+ F6 K' {
138-解决左、右的代码重复部分; |, G4 {/ w; |
139-创建自身的状态面板(有破音), j" d6 U% j0 W3 ]; h. C( Y
140-完善自身进入更新状态面板
' ]5 K4 \0 z" E n' [141-CardGame(9-5)+ [( d$ r& p+ I: s( B# @; O
142-找之前的BUG(一)" f3 k. R, T6 h8 o* c( Q+ }! v* F, P
143-找之前的bug(二)6 E4 K0 }8 B, k6 v& X+ F
144-Card(9-6)2 @2 z8 M: X( K: B" V1 z
145-GameServer(9-6)
0 x6 \1 C% q% U. y7 Q146-发送自身准备的请求
8 F( B3 ~& }" S# G% X8 o; Q! q, C4 {/ O147-创建下边的面板的脚本
& z5 |6 L7 W9 e+ _* Y2 O' x148-Card(9-7)
! S0 C) u, V" f. G% Z+ z" l149-创建聊天操作码,在客户的发起请求
h( Z2 c r' R1 X2 H5 u150-服务器处理聊天的请求,创建聊天传输模型
7 u h) ~% L# F5 d; |151-创建聊天文字的常量类
3 U- t3 O! r# D7 e: k% k152-Card(9-9)
( y( Z/ }5 ?$ k% {" o0 I153-GameServer(9-9)
7 ?# M$ N# G9 \+ D* j: W154-客户端接收响应,显示聊天文字
) B5 C; ^2 O4 _+ t/ } t4 ~155-聊天声音的播放- I; [( h+ j% w% e" H" G
156-测试聊天BUG. b9 z# S. Y3 O
157-Card(9-10). _' |- T4 J% ~- Q4 q. [% J- ]
158-GameServer(9-10)
. U( X0 v9 y7 D+ h159-所有人准备完毕开始游戏,使用中介者模式触发
( x4 B6 Z* n# T& R1 p! X2 L4 }3 E160-逐层分析,创建玩家数据的传输模型) J3 J) A- q0 E
161-创建并初始化牌库,创建花色的常量类; h, `1 V- I" G& h: c& G
162-创建权值的常量类,完成创建牌库的过程2 X- s6 W' ~' I- t4 K e& ^
163-洗牌算法,完成牌库类
. |9 O; |; N* N) }7 I164-创建回合管理类
. i( q9 I7 P8 n( X! u2 I165-GameServer(9-12)" j% |% w1 @' j# Y
166-初始化战斗房间,添加第一个方法:转换出牌
* @ i7 O1 \3 b167-创建出牌类型,判断能不能管牌* g0 c* \1 h6 q% P Q `" u! l
168-如果出牌判断成功就移除玩家的手牌
" x" z( K, n) T4 l1 J$ r169-增加倍数和更新回合信息
4 h* `* Y: G/ i. C. Y3 Y170-发牌
1 G& y& @8 Q$ i5 X+ W8 }, Z171-设置地主身份,创建身份的常量类
# a$ S( H% k$ ?1 D172-补充一些辅助方法,完成战斗房间所有内容
6 r% L8 t3 c2 V5 H173-GameServer(9-13)+ a/ E$ d7 r9 J! d8 B
174-创建战斗缓存层' O( y6 X( E& o Y
175-定义战斗的一些操作码9 o9 `6 Z6 y y5 g6 O
176-编写开始战斗的逻辑/ n( j- V! N( a/ t$ c) p
177-关于发送卡牌集合还是卡牌id的解释
+ h* G, x, K& B0 p4 N2 }178-GameServer(9-16)
) u; w# @1 E( Z( A3 N9 A179-实现抢地主的方法4 o0 L2 r( [& F! N: M
180-创建出牌的传输模型,获取选中牌的权值
% `6 I2 ?$ l( |2 n" _& d181-判断各种卡牌类型( D6 Q! V1 V( ^5 i" [: Q; k
182-完成编写出牌的传输模型
) u7 k( b# M- q- D: G9 S& S$ e! L# a2 j183-GameServer(9-18)
6 k5 w6 Y7 S7 B& Y5 _ j& E184-玩家出牌在服务器的处理( U5 @3 `7 X- d+ @) G: t8 i
185-转换出牌的实现
# C+ V/ o( A& }4 ~4 A/ |& {+ } s" y186-游戏结束的处理! V! v8 y' t; k9 z+ ~8 _' ?, A
187-不出的处理 R" U! g& n% ^( f& T D
188-玩家掉线的处理# Y( ^. e; L% o0 ^) ]$ Z% }# s
189-GameServer(9-20)0 X1 V7 F+ j0 ~# u f
190-在客户端创建战斗的处理类,编写获取卡牌的处理5 `+ Y& Y4 z4 u' _" i6 p3 z; h7 b
191-创建客户端的卡牌控制类
2 M+ c# K$ e# }* U' ?9 y1 _192-创建自身角色控制类,管理卡牌的创建
3 S+ D& g; B2 C9 w% x193-创建左、右玩家的控制类,管理卡牌的创建
" O' Q3 f. F% B( D2 p: E& d194-Card(9-21)
/ Z9 b) r6 \8 D; R' F8 b+ H" S195-给大家录制BUG过程8 Q0 t4 @* p( V; y4 U
196-GameServer(9-23)2 r! x' F e; O7 v' q& o# W1 F- p
197-开始处理抢地主的响应
/ s. L) T2 @6 ~ h8 e! D198-发送抢地主请求和抢地主成功的处理, n* r$ Q) H; R! a. {( ~
199-自身的玩家添加三张底牌的处理; I" t+ O: @5 _/ X( A: u
200-抢地主成功的处理完毕
! J0 Z1 V* [! o$ f# S6 p201-测试抢地主并修改BUG
9 @; O7 P3 V' e202-Card(9-24)* `5 m6 C; ~, ]' f0 M2 Y
203-GameServer(9-24)
9 Q2 {: _5 A+ u/ b, m4 L) M s204-接收来自服务器的出牌命令
: M I7 K0 ]2 T205-客户端出牌的处理
: E5 K. T- l8 E4 u206-向服务器发送不出的请求2 l# F1 i9 p' ~3 v' j% N
207-GameServer(9-25)
% E8 v5 V' j A; S7 p208-Card(9-25)
* K- E3 [ f0 P4 {& }9 i. }1 }209-给卡片添加碰撞器让他能点击
, y: l Y; ~, X" Z/ x210-解决出牌BUG
% n* n$ F( T5 w- @) W' |211-移除出完的手牌
& y X5 {6 y+ G0 G( ~" I212-管理桌面的牌显示
: |- x+ W1 ~6 z' Q213-出牌特效声音的播放% A8 w0 i0 g2 N& x: W9 t
214-GameServer(9-27)
, u6 C' j/ M" S& d4 O% g3 k215-Card(9-27)) |+ W" h( }7 I" c2 E4 r: a
216-测试出牌BUG 上部6 f5 Y; A" j. I) y
217-测试BUG 下部
2 e8 C! A9 {" N$ r& L& w z+ P% w" r218-客户端+服务器(9-28)4 u& C1 J# X5 o8 `3 k
219-创建OverPanel代码脚本* R' k' B7 I" F& c% k) [$ W$ p
220-通过消息机制表现客户端的结束$ r6 l+ c) \- _% g
221-测试游戏结束. ~* N1 E2 s' G' \
222-创建背景音乐播放控制脚本
; y) x- K4 O0 Z2 ^; S9 U( h) F! s223-给前两个场景添加背景音乐
2 G5 @9 r* A( |, S224-完结与未完
9 r. t) \5 d+ q) O# l225-Card(9-30)
, O2 z( d7 H: b+ A226-GameServer(9-30)
2 |! U! b3 ~- \227-扩展课之ProtoBuf
$ g0 |5 z W }. F; W, l228-扩展课之ProtoBuf(10-15)下载地址:
% n: B( t9 [6 p1 T) ?
, D4 D# c0 z; `* u* x, h( f" ]% S
; E, w0 {" T$ n. E+ V7 y' X5 }+ q* C/ ]6 R+ l1 E# z1 h5 p
|
|