Administrator
发布于 2025-01-27 / 21 阅读
0
0

暗黑战神中涉及的文档

lesson1 基本设置

Unity中关于光源的mod

https://docs.unity3d.com/2017.3/Documentation/Manual/LightModes.html

烘培光照,环境光设置,全局光照的区别和联系

Unity光照相关知识和实践 (烘焙光照,环境光设置,全局光照)_unity使用bakery打光烘焙-CSDN博客

lesson2 UI架构

1.如何使生成的脚本带上日期和署名

UniTask

Unity 自动添加头注释代码后无法创建新脚本_unity onwillcreateasset-CSDN博客

2.使用和加深对异步操作的理解

精选Unity-Github开源库分享 最完美的异步操作解决方案 UniTask (一)简介和安装_哔哩哔哩_bilibili

3.AsyncLoadScene 异步加载的场景

Unity异步加载场景SceneManager.LoadSceneAsync与AsyncOperation的使用-CSDN博客

Unity3D RectTransform使用详解:布局、属性、方法、设计 - 知乎

4.playerprefs

Unity本地持久化类Playerprefs使用详解 - PlaneZhong - 博客园

5.让龙重复飞翔动画

Unity中Invoke和InvokeRepeating的使用_unity invokerepeating-CSDN博客

6.在消息队列中上锁

C#--lock线程锁 - 让挑战成为习惯 - 博客园

7.音频消息爆FBS错误的在线修音频网站

FSBTool ERROR

8.如何让表格显示属性:用xml语言编一个样式,在excel中的开发工具加上一个xml原再映射就行了,表填完还能再导出xml的格式

xml脚本,会有ID ,man ,woman三个栏

XML在C#与Unity3D中的实战运用 - PlaneZhong - 博客园

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<Item ID="">
		<surname></surname>
		<man></man>
		<woman></woman>
	</Item>
		<Item ID="">
		<surname></surname>
		<man></man>
		<woman></woman>
	</Item>
</root>

lesson3 网络通信

C#开源网络通信库PESocket的使用 - PlaneZhong - 博客园

PEProtocol协议:

GameMsg 定义网络传输的内容,对象和数据

网络协议对于客户端和服务通用 Req和Rsp表示客户端到服务器和服务器到客户端

基于框架PESocket开发而成

   public class GameMsg:PEMsg
   {
       public ReqLogin reqLogin;
       public RspLogin rspLogin;
   }
   /*这里想要网络传输东西,不可能逐字段检验,不然太冗长了*/
   /*添加一个cmd和对应的类非常重要*/
cmd是已经在PESocket中封装好了
  public static readonly string obj = "lock";

  /*这里加锁是因为每次的传来消息的线程id是变化的,多线程*/

  //*网络接受用多线程是因为快,网络是IO,或者逻辑写多线程最后改数据加锁也行*//

  private Queue<MsgPack> msgPackQue=new Queue<MsgPack>();

PECommon:服务和公共类,封装后不用每个程序都加头文件

    public static void Log(string msg="", sssType tp = sssType.Log)
    {
        LogLevel lv = (LogLevel)tp;
        PETool.LogMsg(msg, lv);
    }

Server服务器内容

ServerRoot:服务器初始化定义

ServerStart:服务器启动,并且while来一直读取服务器

NetMsg:定义服务器会话ServerSession内容,和服务器的包,消息队列,加锁防冲突,并实现对消息的添加方法,以及消息的分发

ServerSession :继承自ServerSession : PESession<GameMsg> 并实现对与网络会话的功能,链接,接受,断开

    protected override void OnReciveMsg(GameMsg msg)
    {
      PECommon.Log("客户端收到请求:" + ((CMD)msg.cmd).ToString());
      MsgPack pack = new MsgPack(this,msg);
      NetSvc.Instance.AddMsgQue(pack);
    }

LoginSys:登录系统,大部分的登录的操作

Cache:缓存,实际上是多个字典来快速的对应玩家-密码-账号数据

lesson4 数据库的开发

    查询
MySqlCommand cmd = new MySqlCommand("select * from account where acct = @acct", conn);
    cmd.Parameters.AddWithValue("acct", acct);
    reader = cmd.ExecuteReader();
            
    id = reader.GetInt32("id"),
    name = reader.GetString("name"),
    lv = reader.GetInt32("level"),
    exp = reader.GetInt32("exp"),
    power = reader.GetInt32("power"),
    coin = reader.GetInt32("coin"),
    diamond = reader.GetInt32("diamond")

try 和 catch,finally的用法

  finally
  {
      if (reader != null) 
      {
          reader.Close(); //必须关掉不然一直在这一步,就是不会继续执行下一步
      }
  }

//对于快速的要求来说就是数据一单缓存就立刻返回到客户端

//保证缓存的内容一定能写入数据库,因为数据库可能会返回失败

服务器服务启动与运行逻辑

服务器启动过程:

1.服务器启动过程包括完成各个服务及数据层、业务层的初始化在SeverStart中。

2.服务器在update中驱动网络消息检测,收到消息后分发到各个业务系统。

3.登录系统处理登录及重命名相关逻辑。

客户端运行与登客户端运行与登录流程录流程

客户端登录与运行

1.客户端运行过程包括在GameRoot中初始化各个服务模块系统,进入登录场景。

2.登录场景加载过程中更新进度条,加载完成后打开登录界面。

3.输入账号密码后点击登录,触发服务器通信

登录请求:登录请求处理流程

1.客户端发送包含账号密码的网络消息到服务器。

2.服务器通过缓存模块判断账号是否上线,若不存在则查询数据库创建新账号。

3.服务器将账号数据缓存并返回登录回应消息到客户端。

客户端登录回应处理

客户端回复

1.客户端接收登录回应消息,并保存到中。

2.判断回应数据中的名字是否为空,若为空则打开角色创建面板。

3.玩家在创建面板中确定名字后点击登录,发送名字到服务器进行验证。

4.服务器处理名字验证,检查名字是否已存在,并更新缓存和数据库。

服务器和客户端的区别就在于数据的缓存

1.客户端发送包含账号密码的网络消息到服务器。 2.服务器通过缓存模块判断账号是否上线,若不存在则查询数据库创建新账号。 3.服务器将账号数据缓存并返回登录回应消息到客户端。


评论