|
|
本课程会带领大家从0到1的开发一款强联网卡牌游戏:斗地主,不容错过哦。+ e+ L8 E7 _3 v; b
服务器采用:c# 开发 + [" E* H( h1 @
客户端采用:Unity2017+ R% t$ `# L/ F, ^- w2 L
5 n4 S5 Y2 ~6 W2 ?) Z学完并熟悉掌握本课程会熟悉网游开发模式,独立设计并开发出一款不错的网游。) }' g3 R4 w+ F5 d: _
课程每天会有更新,难免有一些特殊情况望理解。
/ r& _# Y4 k5 ^$ H# |0 C个人独立开发,素材都是从网络上搜集,如果瑕疵,请见谅。
3 N% J8 M) |# Q' K3 J0 v+ _. L; T! D1 M2 _% S& J5 v) b7 x
严格意义上来说,本课程应该是两个课程合二为一了。7 ~" A8 o2 a" Q1 Q
第一个课程就是《从计算机网络都服务器编程》。# Y$ h1 y* W& ~2 N$ N& P1 i
关于服务器,很多初学者都不了解,就觉得它很神奇,而且一接触它的代码就会发蒙,就是看不懂。为什么呢?因为不了解,所以我觉得应该从计算机网络这一层次开始说起,比如:
" C1 h" ~/ J# j+ }8 C: ?1 V, y什么是因特网? m E2 {7 g) b1 B
什么是协议?' {7 z2 _& V9 R: {; m
什么是应用层?应用层协议?
- H3 j. c1 n5 w9 B3 C X6 z什么是运输层?运输层协议?
: r) R# F3 S. b6 {9 M什么是TCP协议?什么是UDP协议?3 N- m/ b9 i$ a" y1 [, K
等等···
F# \5 z m9 l& ?3 c% J(很深层次的知识,大家根据兴趣来进一步自己学习)
7 i9 Y7 \( t" M5 @7 f7 C知道了这些之后,就可以开始进行服务器编程了,包括协议订制,数据传输等等。其实大部分.Net都给封装好了,我们只是调用一下而已。最后做出来的使用方式和Photon Server基本一致,如果学过我之前课程的话那应该就会使用,不会配置一些乱七八糟的东西,而且调试错误可以直接断点,很方便。由于Photon Server适合某些特定的开发者使用,面试或者一些公司应用不广,而这个socket就很通用了。+ {8 ?$ g3 w5 \( n c6 j0 g
, O& z6 d4 o7 {2 y4 n第二个课程就是《斗地主》的游戏开发部分了,通过实战来教大家服务器怎么使用,怎么实现多客户端的同步。2 l7 y* ~4 H7 B( l
斗地主大家应该都不陌生,所以这一部分就不用过多介绍了。客户端的架构是使用的之前的课程《基于消息机制的框架》,采用消息中心的思想,开发类似发邮件、收邮件的机制,来彻底杜绝脚本之间强耦合现象。
9 } ?0 Y' f* N$ }$ E5 J
; H# j( L) c: k/ s7 M: |* |0 Q, U
* e+ q" i4 Y% C, Y8 S) m% u001-课程介绍( t1 H9 V2 r% n$ U' x* I+ T9 x
003-因特网和协议+ @5 j* N' ], U( g) P) G
004-分层体系结构; z. I) e) R# ?9 y( s% |1 b
006-进程和套接字# ~- o8 e- u! e
007-运输层协议TCP和UDP# V9 i- F O& ]$ f @( i# Y! `. B
008-应用层协议HTTP! U" Z Z6 _; ?( b
009-socket服务端5 ?+ E L" w @ U/ Q, u
010-socket客户端: H S& t5 M" ]% O8 B& f; l; W
011-验证连接
/ l F/ D$ E4 v/ p, Y& T' v6 _012-SocketDemo1 ^- J1 u5 F) I+ t2 |
013-实现接收连接的异步事件- O, A& ]4 p1 f2 ?: F
014-添加限制连接数的信号
, V- S) r' |5 m015-封装客户端连接对象和编写连接池
4 e7 Q, f& }8 Q. ^5 W016-GameServer(8-1)
1 K$ `* O2 B: N! @8 q( |8 R9 C017-粘包拆包问题介绍" K6 {4 n2 R) f* q3 }' D5 S
018-采用包头+包尾的方式解决粘包和拆包6 o$ L8 t! D N- x: d9 ^& \
019-GameServer(8-3), Z$ _3 n3 i9 w% g
020实现异步网络接受数据
3 d. L. e5 O% b, E* v021-客户端对自身接收的数据进行解析
* P8 l$ W5 Y5 ?5 V022-构造SocketMsg负责网络消息的传递
+ k1 x" d+ P; a2 { P( E- T }023-实现soceketMsg与byte[]的转化* ?" D+ U- w4 J" \+ j3 ~' D: o
024-对象的序列化和反序列化8 p& O, l% u; ^0 a2 Y( n* x
025-GameServer(8-3)_2
$ h( Z9 w2 f/ {026-实现客户端断开连接
; L/ s1 N8 B& ~7 z2 N027-实现发送数据
j P3 E+ c- K! b7 z8 ^028-助学篇:带大家回忆一下所开发的内容
! i$ x( Y' k9 a6 [029-抽象出应用层0 i' {7 L' W% g" R1 i1 v+ a
030-GameServer(8-4)& A) O0 k( e+ n' I: b5 W
031-开发定时任务功能(计时器),编写任务模型! Z( C- [) w! X, U& V/ H5 V
032-创建计时器管理类,监听到达间隔触发的事件
/ P5 f6 n1 X) ^- r" } W. V4 n \033-控制定时任务(计时器)的触发时间
- T1 }0 P" u8 B$ ~# X) `' `034-开发线程安全的INT类型
' n: z5 b5 Q K& M. t035-GameServer(8-6)
' r) i* W6 i% f036-实现单线程池4 Z* u: u+ v; P3 C6 J8 p/ t- t
037-Unity2017下载* A$ [9 Z, ~! V U: T6 L. ^% `; q7 y0 J
038-创建工程导入素材- z/ `! B* F, b, X
039-Res
8 u$ ~, I5 Z1 N# i+ n% k- h+ Z040-Card(8-7)& J2 \" L a/ _; O
041-GameServer(8-7)2 f D2 G2 a+ Y5 { z4 Q
043-根据策划创建面板; X& j# d! A' {; Y
044-导入客户端框架,创建PlayPanel脚本
. n7 S7 [/ @( P* }6 w l: x045-完成开始面板
5 { T4 N8 }& l: g) x; @& j5 D046-完成注册面板
* l; v' m0 U# ?# A) Z0 z9 o. g& _$ c047-Card(8-8)
$ h3 Z+ \9 a8 a' f7 F049-服务器架构介绍
& L, N: e9 d* |0 }$ `% `0 T050-按照架构实现服务器) I8 x- b- o/ ^2 k6 L N
051-在客户端封装Socket,使其连接到服务器
" e! k1 P. ?2 n052-测试客户端服务器的连接
9 ~, l8 P8 s5 H053-解决BUG
0 [3 {" h- n6 ?! O' m054-Card(8-9)5 x4 j) ?" ?4 p3 g( @: d* [2 R
055-GameServer(8-9)
( J; h0 p& T' n% c |/ N' a056-修改客户端的链接方法
8 L: |- ?/ [# v4 E4 H. o0 \/ ?056-修改客户端的链接方法_20171124142335
/ P: g; I5 R# n% {' J' n R' ^057-定义操作码、子操作码,演示客户端如何给服务器发送请求
& y, Z; d: b) n058-测试数据传输是否正确
0 Z; a2 {# L$ @059-Card(8-10)
* e, Y/ H. J. X+ H/ K060-GameServer(8-10)
: ]/ Y* |/ Y) W% d# M8 v' a061-创建账号缓存层,实现注册的一些方法
, h& `1 d! [ x! K+ t: M# m% ^061-创建账号缓存层,实现注册的一些方法_20171124142334
' j& T. l* O! [062-完成账号缓存的所有方法& j) @+ G1 f( a+ G: K1 ]2 z: L E, I. Q
062-完成账号缓存的所有方法_20171124142334. ~+ n2 M v; U( T: w2 @2 M3 }4 ?
063-实现账号逻辑层
5 D2 c9 d3 p. M2 y7 H7 f7 `( r& B064-解决今日BUG
" [7 z9 |& I/ U065-Card(8-11)
4 T2 U% M6 v) A066-GameServer(8-11)
; a% c6 I, p: Z. h6 p r4 M067-开发提示面板/ T* i2 ^6 S- n: Q" J* T
068-给登录和注册面板添加提示
/ Q5 L( o. y: C1 g- N069-处理接收到的服务器发来的消息、优化发送网络消息的方法' Q& \$ b" \: k" A
070-实现客户端的账号处理、怎样和服务器交互(后面调个bug)# b J: c W: u7 e) W
071-优化服务器,改变传输结果
- z5 y4 _2 P2 F( [072-Card(8-14)* l3 S. W& C# p4 \* L
073-GameServer(8-14)+ ]+ l5 ^1 k3 ?+ [+ Y
074-初步实现场景管理器,融入到框架中6 I) K( G/ \. o; o& }- v8 K* b+ {4 y v
075-增加当场景加载完成的时候调用的方法
: D7 c! e3 J/ H; G( A) S076-实现登录成功跳转场景: c4 U: C6 U) j b) {" l
077-设计UI之主界面的信息面板
8 {& c2 B4 }& W0 A' M- Q, |$ d078-设计UI之主界面的匹配面板
+ D2 F6 _( p# T079-设计UI之主界面的设置面板
! m$ E f# y; @# \, X080-设计UI之主界面的创建面板5 W) ]5 l- f! l, D
081-Card(8-15)
2 ~2 Q W1 p$ e; c E082.编写信息面板
, h$ @: C/ W+ \* U, a7 e3 z083开发匹配面板
# n5 a% l* C" i084.修改默认创建的脚本! D' n3 I+ i% a% r- H2 H' ^
085.开发设置面板
' Q4 w9 S1 e& N086.开发创建面板
( o* i8 p6 t& {2 o/ b087-Card(8-16)
* I: g6 M" ]$ p- j) p088.创建角色数据模型
2 N$ w5 E( b G" _9 A$ M* W+ a089.开发角色数据的缓存层
- G, j$ x2 I, U# e$ C3 i! F090.完成角色数据缓存层3 g l9 |$ |( O2 R
091-GameServer(8-17)
/ f/ v5 B b% v6 g1 x6 p+ u: f092创建有关角色的操作码
+ ?' V. X% Y" G093.实现用户逻辑层2 N( _6 Z4 t* n' \! U- S! ~0 ^
094.向服务器获取信息,在客户端创建用户处理类
( J' y& H, c' Q3 {9 D095.客户端处理获取角色信息的响应
g5 L# M6 u' n6 i3 h# V+ g3 [% f096.保存接收到的角色信息并且处理角色上线响应
6 U; M- h' b# a: n+ O- R097.发起创建请求和处理创建响应
- ~+ N. c" v2 ~0 |- p) j8 x098.演示本日BUG/ O2 p- M. Y% w4 m1 r9 ^
099-GameServer(8-20)
' }2 x; V7 }% D100-Card(8-20)1 \7 P5 I' q+ ~3 G+ \, P5 m
101.更新客户端视图
2 Y3 R" G& q. A6 v5 B- u102-编写匹配操作码
$ Z' G4 c# @2 f+ J. h) i103-定义匹配房间的数据模型6 w8 B- P1 R5 X' e. j$ s, Q+ }2 ^
104-创建匹配缓存层,实现进入匹配队列
# z* }5 @0 @/ `( s) ~% w# j" i105-实现匹配缓存其他所有的功能& H6 i1 B% ]! T2 [% a" U; h* n) R! d
106-创建匹配逻辑类,实现进入匹配房间功能
4 U: K) C* }7 t$ W0 k107-优化服务器之群发消息1 ?1 J$ _4 ]+ h1 C! u$ |5 ^0 ?
108-创建匹配房间的传输模型,在逻辑层进行构造
( x& _5 J6 ~7 h1 y% O109-实现离开匹配房间功能4 k: H/ K' K! `0 X0 F5 S% h
110-GameServer(8-24)$ ^& o% ^; M, |, y+ c; d
111-实现玩家准备 H. U, v, r3 u
112-在客户端发起匹配请求
D6 G. j% I3 i: H. {113-GameServer(8-25)! }3 t0 M& n7 |4 G0 Y# ]
114-Card(8-25)
( x% {4 Z/ r$ o/ Q o0 u115-创建MatchHandler,接收服务器的响应
, T! a6 O% f; }* V% k( _7 _0 p116-保存房间信息,他人进入房间广播处理2 M J7 K$ t c$ b
117-玩家离开7 \+ L% s+ \ z6 V
118-玩家准备和开始游戏的处理. D; G/ ?0 t0 b# ^7 g1 x% N
119-GameServer(8-29). A9 i; f4 r! V6 ~. R
120-Card(8-39) (1)
/ O" n/ y* f, }0 u3 D A121-搭建战斗界面的左、右角色状态面板% L7 w: w+ S$ z# m1 ^; x& |
122-搭建战斗界面自我的状态面板
" b: K2 M7 d. p, M3 a/ v3 @9 m123-搭建战斗界面上边的底牌面板7 l4 r. ?: Z6 U
124-搭建战斗界面下边的快捷聊天面板4 x+ X7 V7 P* z* f
125-搭建提示面板和结束面板) `+ T0 y$ h4 w* d$ n
126-Card(8-30)
+ G) B" d' _6 {. \127-创建出牌点,实现进入房间按钮功能
" K: U6 F) f9 }, V* B9 M# c128-控制底牌显示,编写代码4 H2 W0 K, u" A# ?
129-在服务器工程内创建卡牌的传输模型类
; w' K h7 o0 ~, m& v: B+ M' W9 \; G130-分析并创建状态面板的基类(有很强破音,别戴耳机,老师的麦又坏了)
. `3 h# L% x8 h5 I/ Q, r, k131-分别创建左、右角色的状态类(有破音)
# A2 J# f1 u- D5 s/ @7 z132-ard(9-2)$ o* j5 y; t v: i% W% k: ^3 K( w
133-在匹配网络处理类里面和左、右角色的状态类互相相应(有破音)
6 f" [/ J, R% i& K) J7 w134-如何控制玩家左、右玩家位置?(有破音)
% t& s- @! J) U' B& z( |135-进一步修改匹配处理类和左、右角色的相互响应(有破音、)
$ l: X0 X/ q- N; a1 V" I0 J- y0 l136-Card(9-4)
& b9 T1 p) ?+ A" H137-GameServer(9-4)2 A( |5 t) @; Q3 Z+ V S1 ^
138-解决左、右的代码重复部分
7 u) F# {9 L& g( w& D, N3 I- i2 j139-创建自身的状态面板(有破音)" ]" ]; l% \8 v& I: a, l3 Q) j
140-完善自身进入更新状态面板
; {- q9 Q$ X' d& y141-CardGame(9-5)$ R8 z3 T+ b0 f# }& }" K
142-找之前的BUG(一)4 K* B& w }, p
143-找之前的bug(二)1 l( J% T3 Y6 f0 p2 f
144-Card(9-6)
' L$ Y% u0 r0 I. B7 }& F8 e7 ^145-GameServer(9-6)" K* H5 e R! ]4 o& l
146-发送自身准备的请求( @! ^% |3 S' T# |$ M, M
147-创建下边的面板的脚本
: R+ u+ T# |& ?' U j/ o0 }148-Card(9-7)
1 h- t. u5 L7 U6 u+ ~- f$ G j7 c$ {149-创建聊天操作码,在客户的发起请求. t! q; F) z+ s, C9 y1 z
150-服务器处理聊天的请求,创建聊天传输模型
4 a2 b/ D: H/ k* E' _( z151-创建聊天文字的常量类
( r5 r, ?7 C+ [% i: N152-Card(9-9)
. }6 U8 G% y3 B/ c1 M1 \! L153-GameServer(9-9)* p& M# Y0 U/ A1 [: E7 M" h4 W
154-客户端接收响应,显示聊天文字
' f6 p" H) P5 D" r8 l0 I5 W155-聊天声音的播放
0 h, q" T+ w8 F& X1 O156-测试聊天BUG5 Y; e( L. K+ D3 d' Q
157-Card(9-10)9 `& E% R5 y* K
158-GameServer(9-10)( Y2 f6 [3 x: p' z1 j
159-所有人准备完毕开始游戏,使用中介者模式触发
% Z5 A/ W( P3 p, [- |% T* o, z160-逐层分析,创建玩家数据的传输模型! M& G7 M0 E6 i7 }
161-创建并初始化牌库,创建花色的常量类
+ E* H) p9 d: c% \- `" _* t162-创建权值的常量类,完成创建牌库的过程+ p5 S% S4 U$ t; @% l- ?6 l
163-洗牌算法,完成牌库类
; M) u& ^& R6 m/ z8 e164-创建回合管理类+ `( k2 M" i' D
165-GameServer(9-12)1 z2 o ?& L: E0 e) {
166-初始化战斗房间,添加第一个方法:转换出牌! T& ]4 Z5 F/ _' C: {
167-创建出牌类型,判断能不能管牌
. X X; Y; Z+ h( j& g0 q168-如果出牌判断成功就移除玩家的手牌
* c9 }( `9 |; {5 M% G% n169-增加倍数和更新回合信息% D* T0 {2 Y" b$ A# d2 D/ \- q" q, Q
170-发牌/ }* V8 w v$ _5 J& q: X- D# ~- x% X
171-设置地主身份,创建身份的常量类- I% `1 F2 ^0 F& t. C# o3 [" ~( \1 N2 b
172-补充一些辅助方法,完成战斗房间所有内容
. e" b- J) J7 S% w% R, n: q173-GameServer(9-13)+ n9 T0 Y' `; L& l: W+ Y9 c- F! _: m
174-创建战斗缓存层# Q- f' Z/ \# U( e8 h% T7 P- o+ q [
175-定义战斗的一些操作码
' I% D0 h( [' |0 m2 ^0 Z( u) K176-编写开始战斗的逻辑
7 m) S. w2 H3 A* q& x177-关于发送卡牌集合还是卡牌id的解释$ V8 z/ n, K: K& X
178-GameServer(9-16)+ l8 s( l- V8 @
179-实现抢地主的方法* T$ C7 e9 I/ a7 ^
180-创建出牌的传输模型,获取选中牌的权值
a$ h" ]* f8 @! v6 p# e181-判断各种卡牌类型
% e& U% s1 p, R; s' z182-完成编写出牌的传输模型# y) u/ q$ z% J; Z! k! n
183-GameServer(9-18), J8 ^& |3 t' A$ c* t+ P- w
184-玩家出牌在服务器的处理& S, r& F( b, G2 Q2 ~, [
185-转换出牌的实现$ I! |9 r; O: Y! E& l8 h0 w
186-游戏结束的处理
% r- f8 Z5 j& t& f' Q7 f187-不出的处理. @7 o2 r& }8 v- o+ g
188-玩家掉线的处理0 A, {$ t" z9 [
189-GameServer(9-20)
7 W$ e9 q e! `1 R190-在客户端创建战斗的处理类,编写获取卡牌的处理" j( b9 h j3 J! V
191-创建客户端的卡牌控制类" H5 }# k3 P. H, _1 o
192-创建自身角色控制类,管理卡牌的创建
+ i7 `8 f( v) d" d9 @& t193-创建左、右玩家的控制类,管理卡牌的创建
: c- H V$ S% x) u, B z# z. d194-Card(9-21)
! ]0 i) t, k* u8 M5 r$ B; l* Y. y195-给大家录制BUG过程
# {9 p' Y+ u1 Z% H196-GameServer(9-23)
5 m# Q% f: B/ D! Q* |197-开始处理抢地主的响应# \! S+ }% E& s7 F+ F, a1 e/ G
198-发送抢地主请求和抢地主成功的处理
4 Z h# q0 D7 R2 F199-自身的玩家添加三张底牌的处理* U s# Z* ~3 r# p$ b& P- B* ^
200-抢地主成功的处理完毕
, b' p5 s) z& q5 T. O2 Z# [; Y201-测试抢地主并修改BUG& Y0 N0 Y+ ?1 X* V5 Z# }+ c' t
202-Card(9-24)
' q4 {- m, ]+ }) }, K5 ]* \7 y203-GameServer(9-24)
. o2 P: [0 Y' q, q( B204-接收来自服务器的出牌命令
$ M, a; [6 q* }: N0 Q: |! ^4 m6 G6 r# `205-客户端出牌的处理
& s: E( c Y+ m4 ?8 z206-向服务器发送不出的请求8 A# n+ @1 o1 E
207-GameServer(9-25)
+ @' `0 V& M4 V6 G% Q; ~* `& ]208-Card(9-25)& v }0 l* d/ V( y- _( ^
209-给卡片添加碰撞器让他能点击
1 W. b: G- d$ E8 [* e0 `210-解决出牌BUG5 |5 f, D" _4 d6 q
211-移除出完的手牌& f" y( b- R7 @
212-管理桌面的牌显示
0 S! T" a K+ C4 Z213-出牌特效声音的播放
5 ~8 v: q1 E% z214-GameServer(9-27). r; w" E D3 s) `- n m. e/ w
215-Card(9-27)
( G* R3 ^$ x! I216-测试出牌BUG 上部
) p6 X) S5 w# ] \( \217-测试BUG 下部. L: c: g! ^2 w1 y/ B
218-客户端+服务器(9-28)
4 S# S) m( v G3 r- u219-创建OverPanel代码脚本
& m; e+ F' j$ X2 D- @/ P220-通过消息机制表现客户端的结束2 N: H, x% q1 N- d/ `- A" y4 S
221-测试游戏结束
9 U! w: O& e& N+ P' [9 p222-创建背景音乐播放控制脚本
8 k3 l% C% B* W _! P3 h223-给前两个场景添加背景音乐/ ]/ B1 c* d. h( n- C8 x
224-完结与未完1 s b+ e7 g0 o7 i5 F
225-Card(9-30)
: C" b, C2 B1 i! p! M) W226-GameServer(9-30)
0 \; y9 z: ]0 p$ g% W$ t6 S227-扩展课之ProtoBuf# C! z0 ?7 _- L- o7 c
228-扩展课之ProtoBuf(10-15)下载地址:
3 q7 b1 t0 m, ?% Y# F! K A
6 f7 B: W0 r( A6 ~' h! ?8 M* P6 p
" a% ^% u" M G3 A0 [
9 b, ^) s `9 w: C1 a1 G, u |
|