GithubHelp home page GithubHelp logo

wankcn / junglewars Goto Github PK

View Code? Open in Web Editor NEW
2.0 1.0 0.0 50.06 MB

使用Socket/TCP开发服务器端,U3D进行客户端开发,Mysql存储玩家数据的Unity3D网游

C# 57.83% ShaderLab 41.98% TSQL 0.19%

junglewars's Introduction

JungleWars

Unity3D开发网络游戏

使用工具:MacOS10.15/Unity2019/Rider2020/MySql8.0/Navicat15

开发进度

6月29日

完成TCPServer服务端和TCPClient客户端

实现服务端对一个客户端的连接,只能发送接收一条消息

6月30日

使用异步完成了服务端和多个客户端之间的互连

7月1日

  1. 解决粘包、分包问题(使客户端传输数据之前都加上数据长度)

  2. 测试字节转换

7月2日

  1. 完善了客户端发送数据
  2. 完成了服务端解析数据
  3. 完成数据库测试
  4. 构建游戏分层结构

7月3日

  1. 开始游戏服务器端GameServer的开发
  2. 创建Server类,Client类,Message类
  3. 创建类库Common,开发控制层
  4. 客户端多个request对应服务端一个controller,一个request负责发起一个请求并处理这个请求的响应

7月4日

  1. 采用中介者模式,创建controllerManager管理所有控制器
  2. 通过ControllerManager进行请求的分发处理
  3. 客户端请求的响应处理
  4. client接收消息后转发给ControllerManager进行管理
  5. Message单一职责原则,只负责处理解析消息
  6. 完善对消息的处理以及传递给ControllerManager,controller处理完请求之后会有返回值,controllerManager会根据这个返回值判断是否需要给客户端响应。如果不为空,调用server.SendResponse给客户端响应。

7 月5日

  1. 完成了ConnHelper对数据库的连接,在客户端与服务端建立连接时创建的client中连接数据库,断连时也先断开数据库。

  2. 开始Unity客户端的开发

  3. 导入资源(UIFramework框架和Res游戏资源)

  4. 游戏客户端架构分析图

7月6日

  1. 分析游戏客户端架构写成文档(对扩展开放,对修改关闭)

  2. Scripts-(Manager/Net) 脚本文件分为两类

  3. GameFacade放在场景当中,其余Manager不需要挂载在游戏物体上,由GameFacade直接进行管理

  4. 修改UIFramework中的UIManager符合现有框架

  5. 完善了客户端框架

    以框架为基础开发游戏,开发ui时是登陆与注册页面,需要发起请求,所以先开发网络模块(与客户端的连接,request的管理)

  6. 开发ClientManager,完成了与服务器端的连接和关闭

7月7日

  1. 为Unity项目更新common.dll动态链接库
  2. 完善客户端向服务器端发送消息的功能 Message/ClientManager
  3. 完善接收服务器端的消息并解析
  4. 修改BaseManager,为它提供一个GameFacade的引用用于各种管理器方便访问GameFacade
  5. 创建请求基类BaseRequset,用来发起请求。
  6. 完善了Request对象的管理(修改GameFacade单例模式,中介者模式,gameFacade调用RequestManager,BaseRequest调用GameFacade方法)

7月8日

  1. 完善了ClientManager处理响应,中介者模式通过facade调用RequestManager的处理响应方法HandleResponse

    完成了前期准备工作:服务器端架构与客户端架构的开发

  2. 开始游戏逻辑的开发

  3. 控制场景的视野漫游动画作为菜单界面背景

  4. 开发登陆按钮

  5. 设计登录面板

7月9日

  1. 设计注册面板和提示信息面板

  2. 创建面板脚本使他们继承自BasePanel

  3. 创建面板预制体,修改json文件和枚举类型

  4. 开发提示信息模块

    让Message的方法在其他地方可以进行调用:为BasePanel提供可以访问到UIManager的成员uiMng,使每一个UI面板都可以访问到UIManager,UIManger管理所有面板,面板与面板之间不进行交互,减少耦合。

  5. 初始化DOTween插件并测试

7月10日

  1. 开发游戏开始界面和登录面板进入的动画效果(使用DOTween)
  2. 动画优化(点击登录按钮,弹出登录面板,登录按钮消失;关闭登录面板,登录按钮显示,重复此过程)
  3. 修复bug(未控制动画的Normal状态,导致登录按钮点击两次以后无法消失,修改Button,在Normal状态下修改Scale为1,使它保持为1的状态)
  4. 处理登录请求(在客户端输入用户名和密码,点击登录获取到信息,通过Request发送到服务器端,在服务器端进行校验,正确允许登录,不正确返回错误信息。)
  5. 设计用户表和战绩表

7月11日

  1. 处理客户端LoginPanel登录按钮点击(根据输入错误的用户名和密码反馈不同信息)

  2. 修改客户端代码(与解析处理相关的所有RequestCode都改成ActionCode,使一个ActionCode对应一个Request类)

  3. 创建LoginRequest类和RegisterRequest类,分别对应ActionCode中的Login和Register

    RequestCode里的User对应UserController

  4. 在客户端发送登录请求

    服务器端创建登录请求对应的RequestCode和ActionCode,添加枚举类型,并在LoginPanel的OnLoginClick()增加发送客户端登录信息

  5. 创建UserController,完成DAO层与Model层的创建,完成登录信息数据库校验方法

  6. 在服务器端发送登录的响应,建立返回类型的枚举类,返回字符串

  7. 在客户端处理登录的响应

  8. 测试登录流程并处理Bug(从客户端发送请求到服务器端,服务端处理请求给客户端响应,客户端处理响应)

  9. 注册面板的显示和隐藏设计

7月12日

  1. 完成在客户端发送注册请求
  2. 完成在服务器端处理注册请求(判断用户名是否存在,存在则注册失败,不存在注册成功)
  3. 在客户端处理注册的响应
  4. 开发声音管理器
  5. 开发播放控制按钮点击声音(将GameFacade注入到所有面板中,使它持有播放声音的方法,BasePanel父类持有facade对象,中介者模式实现在其他面板调用播放声音的方法)

7月15日

  1. 设计房间面板,显示个人信息(创建房间面板空物体,添加imageUi,左边为个人信息,右边为房间列表)

  2. 设计房间列表

    添加滚动面板,在滚动面板上添加空物体,使用Vertical Layout Group垂直排序

    设计房间条目 取消Chilld Force Expand的Heigh取消勾选从上往下排列

    为ScrollRect增加mask和image设置与背景色相同,隐藏超出布局的面板

  3. 开发房间列表的滚动条和按钮

7月16日

  1. 控制房间列表的显示,即登录成功后显示面板
  2. 解决Socket关闭后连接问题(接收之前判断释放,clientSocket等于空或者没有与服务器连接的时候,不再进行接收)

7月19日

  1. 面板加载各种动画的开发

    调用BeginAccept()修改服务器端进行循环接收客户端消息

    登录成功进入房间列表登录面板进行隐藏

    循环关闭房间列表弹出登录面板

  2. 解决页面跳转Bug(登录面板登录成功显示房间列表,关闭房间列表显示登录面板,重复操作两次后,不会弹出登录面板,而是弹出登录按钮)

把OnClick事件放在Start方法里面,保证代码只执行一次。

  1. 修改LoginPanel和RegisterPanel面板的Start方法

7月20日

  1. 建立Model-Result类
  2. 创建ResultDAO对Result进行增删改查
  3. 修改服务器端对登录请求的处理UserController

7月21日

  1. 在客户端处理响应保存战绩
  2. 在GameFacade添加用户数据的get与set方法,中介者模式。

7月22日

  1. 显示个人战绩

  2. 创建RoomItem控制一个房间项的显示和点击处理

    将RoomItem制作预制体

    添加RoomItem自身脚本处理自身显示以及按钮点击

  3. 动态创建房间列表

    在RoomList里处理RoomItem的加载,加载到ScrollRect-Layout-VerticalLayoutGroup

    根据房间加载的个数来设置布局的高度

    (Anchor只有在父物体的宽高发生变化的时候,才会对自身产生影响)

    center修改为pivot,pivot设置y为1,占百分之百高度,解决点击加载房间在屏幕正中间的问题,即修改layout的中心点

    center是视觉中心点,pivot是计算坐标的点,是一个比例

7月23日

  1. 服务器端创建与房间相关的类与成员
  2. 制作房间界面UI

7月24日

  1. 开发房间面板的动画行为和按钮监听

  2. 控制房间列表和房间面板的切换显示

    监听创建房间按钮

    添加UIPanelType枚举类型并修改Json文件

7月25日

  1. 发起创建房间的请求,在服务器端保存房间信息

    服务器端处理请求

    客户端处理响应

  2. 更改服务器端Client的回调函数(客户端强制关闭时,有时候正在进行结束接收,此时的socket已经关闭的话会出现异常)需要判断client是否为空,是return

7月26日

控制房间列表的加载,在服务器端获取房间列表信息并包装字符串发送给客户端

  1. Client 每次登录战绩既保存到服务器端也保存到客户端,因为需要去的房间信息的时候,此时的战绩是别人的战绩不是自己的,在需要在服务器取到别人的战绩。在client保存两个参数,User和Result,即账号和结果。提供set方法用来设置,在UserController登录时候进行设置。

  2. Room提供方法用来得到房主信息

  3. 将client获取的房主信息组拼成字符串方便传输

  4. 房间与房间之间的信息用“|”分割,房主信息用逗号分隔,将这个数据返回给客户端,客户端解析字符串创建房间列表(此处对数据进行包装是处理数据末尾的多出来的“|”,用if-else进行判断如果是空串返回0,客户端判断是否为0,如果是0就是空的房间列表,如果有列表就删掉字符串的最后一个字符“|”)

7月27日

  1. 在客户端解析房间列表信息

    在RoomListPanel发起请求,需要在OnEnter中进行判断,因为OnEnter执行在Start之前,页面重新激活刷新列表重新发起一次请求

    RoomListRequest中处理服务器响应,根据列表信息加载房间列表

  2. 测试加载房间列表UI成功

7月28日

  1. 为房间添加id,处理加入按钮点击

    加入房间的时候明确自己要加入的房间,将房间id从服务器端传送到客户端,在这里将userid作为房间id,通过房间id区分不同的房间

    修改客户端解析代码

  2. 修改创建房间请求的发起时机为点击创建按钮时创建

    进入房间面板有两种方式(1:通过创建房间的方式 2:加入房间)

  3. 注册刷新按钮完成刷新房间列表功能

  4. 完善处理客户端与服务器断开连接时,将房间关闭需要判断是否是房主,是房主关闭,不是房主保留

  5. 加入房间请求的发起和服务器端的处理

  6. 更新客户端共享工程,在ReturnCode加入了NotFound

  7. 处理加入房间的响应,显示房间玩家战绩

  8. 解决bug,当客户端关闭时,房间列表里的房间还在

7月29日

  1. 服务器端进行新玩家加入消息的广播(房主创建房间后,玩家加入时显示面板信息,但是房主房间页面并没有显示玩家信息)新的玩家加入到房间的时候,在房间里发送一个BroadcastMessage进行消息的广播,广播给其他玩家的客户端,其他玩家进行房间UI界面的更新
  2. 在客户端接收广播消息,更新界面。创建UpdateRoomRequest脚本添加在RoomPanel面板上。重写接收服务器响应。
  3. 处理退出房间功能(房主退出房间,直接直接销毁房间;非房主的话,将玩家移除,房间还在。)

7月30日

  1. 房间退出时,更新到其他客户端界面
  2. 处理房主退出房间的功能(首先向其他客户端发出消息,发出一个QuitRoom,让其他客户端依次退出房间)

7月31日

  1. FixBug.当房间销毁以后,非房主刷新房间列表,房间还在。(当返回空的房间列表的时候,data数据为0,这是往LoadRoomItemSync里传递一个空的集合UdList)
  2. 开始游戏请求的发起和处理(添加新的GameController控制游戏相关)
  3. 添加倒计时面板
  4. 处理开始游戏功能--添加游戏显示倒计时功能
  5. 服务器计时,下发同步到客户端,在服务器端进行开始游戏的计时
  6. 在客户端显示倒计时效果

8月1日

  1. 开发角色的动画状态机(Main Camera设置初始位置)

    先完成移动控制,在完成视野跟随,在完成攻击功能

  2. 控制人物的移动

  3. 设计玩家射击箭的Prefab

  4. 控制人物攻击(PlayerAttack不需要挂在人物身上,要使用动态挂载的方式,每一个角色在多个客户端都存在,房主只在其中一个客户端被控制,在另一个客户端被同步。移动与攻击只需要挂在需要控制的人物身上,其他客户端的角色不需要挂载,只进行位置的同步)

    角色处于Grounded状态才能进行攻击

  5. 修改移动为有键按下的时候才能进行移动控制

  6. 为箭身上添加刚体,通过刚体来控制键的移动,不需要使用重力;为箭添加SphereCollider(球体碰撞器)用来做碰撞检测,通过EditCollider缩小球体碰撞器,移动z轴到箭头的位置

  7. 创建RoleData管理所有的角色信息,使用RoleData保存角色信息,PlayManager里存放集合保存游戏里有哪些角色,方便的根据角色类型加载角色

  8. 每一个模型的角色类型、模型所在路径、箭所在路径创建单独的类统一管理

8月2日

  1. 完成控制相机跟随角色移动
  2. 控制相机视野跟随和漫游的切换

CSDN开发笔记

  1. TCP服务器端与多个客户端连接的C#代码实现

  2. TCP协议中的粘包分包问题

  3. 字节转换

  4. 粘包、分包问题解决办法

  5. C#连接MySql数据库进行测试

  6. 游戏客户端架构分析

  7. 游戏的数据库设计

junglewars's People

Contributors

wankcn avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.