04-战斗系统框架与本地数据模拟

模拟服务器跳转战斗

战斗开发时,帧同步实际上做操作命令的中转,开发战斗时可以省略,直接客户端本地模拟这个过程,将战斗部分开发完成之后,在对接起服务器。即可省略选人匹配等过程。

在初界面添加Button

战斗管理入口

用更加简洁的场景进行开发

开始战斗加载场景,相应的英雄角色用List存。在EnterBattle()中取出,在开始战斗时进行初始化。SceneLoadDone()中加载角色以及资源

//初始化战斗
fightGO = new GameObject
{
    name = "fight"
};
fightMgr=fightGO.AddComponent<FightMgr>();
battleAudio = fightGO.AddComponent<AudioSource>();

加载配置地图,配置生成小兵以及小兵频率等等

//小兵出生间隔
public int bornDelay;
public int bornInterval;//一个小兵之间间隔
public int waveInterval;//波数之间间隔

//配置具体数据,商业开发可配表应对繁杂的问题
case 101:
    return new MapCfg
    {
        mapID = 101,
    
        bornDelay = 15000,
        bornInterval = 2000,
        waveInterval = 50000
    };
default:
    return null;

创建FightMgr

public void Init(List<BattleHeroData> battleHeroLst,MapCfg mapCfg)
    {
        //初始化碰撞环境
        //防御塔
        //英雄角色
        //小兵

        //delay 以后 出生小兵,隔一会儿创建小兵
    }

战斗系统框架介绍

帧同步的逻辑运算都是在本地,每个客户端都进行独立的计算为了确保结果的统一,它整个逻辑的驱动是通过服务器推送的数据帧进行驱动的,这样就需要高频的网络通信。Demo中使用的是每秒15个逻辑帧的帧速率进行驱动客户端进行逻辑计算。

15帧:网络通信在性能上面的考量,与客户端逻辑在实际操作上反馈的一个平衡,网络通信而言是非常高频的通信,但对于显示层的表现而言15帧的帧速率就很低,肉眼可见的卡顿。既逻辑层不可使用15帧的帧速率,在显示层就需要对于15帧的逻辑帧速率进行差值运算,把差值运算的表现结果运用在表现层层面,这样就能实现平滑的效果表现。

一个人物角色在场景里面移动以15帧的帧速率运行既像僵尸一样一跳一跳的,但通过这样显示层层面对它15帧进行差值运算,比如说差到了60帧或者是一个其他的数据,这样整个看起来就会非常的平滑,这就是为什么要做逻辑与显示分离的一个原因。而帧同步在网络的驱动逻辑帧速率上面是比较低的,尽管对网络通信开销很高,但对于显示层的表现而言这个增速率太低了,

做了逻辑与显示的分离以后就可以实现差帧的运算。

逻辑层不停的提供数据给表现层,表现层依赖于逻辑层传递的数据进行更新

逻辑层每一个在游戏里边的逻辑实体,一个buff或者一个子弹,一个英雄角色,防御塔……都是个逻辑实体,所有的逻辑实体必须继承自逻辑单元LogicUnit,逻辑单元实现了一个接口,这个接口里面是三个函数,分别是初始化Init()、Update版Tick()、反初始化UnInit(),tick通过服务器那边传过来的数据帧进行驱动的

也就是服务器t3时间段(帧同步示意图)传递信息驱动进行计算

从右往左看

两个主要的部分,一是主逻辑单元,另子逻辑单元,主逻辑方面包括英雄,小兵,塔等这些带有生物角色。有很多攻击行为各种表现等,包括移动释放技能等等这些属性。以及关键字partial,可以把属性、移动、技能分到不同的文件里,做一个模块的划分,也可以把它写成一个组件,使用C#的高级特性就可以把它分到不同的文件里,调用起来也很方便。

对应到表现层,表现层表现单位ViewUnit,塔的表现英雄的表现小兵的表现一一对应起来。通过逻辑层把数据传递过来。比如一个英雄角色从a点跑到了b点,会在15帧的帧速率上不停的把它的位置信息传递给英雄的Perfab,获取了它的位置属性的数据以后就不停的进行差帧运算,把它的位置更新到引擎场景,将其显示出来,这样就能看到平滑的运动。

而子逻辑单元,主要是buff,子弹的飞行等,逻辑数据的运算没有主逻辑单元多。主要是一个位置的变化,buff的控制。也是同样的原理

表现层、逻辑层实现了完全分离,依赖的数据也是单向。逻辑层上不会去获取到表现层任何数据,因为这个数据很多是基于浮点数,是不可靠的。逻辑层是一个可靠的定点数运算的。通过这样的方式就可以实现在不同的平台实现完全的同步,这也就是帧同步的核心。

fightGo将所有的管理器加载在其上,通过fightGo进行战斗的控制。提供入口将BattleSys调用,所有战斗相关的FightMgr进行开发,不同的战斗由不同的战斗管理器进行管理

 //初始化战斗
fightGO = new GameObject
{
    name = "fight"
};
fightMgr=fightGO.AddComponent<FightMgr>();
battleAudio = fightGO.AddComponent<AudioSource>();
MapCfg mapCfg = resSvc.GetMapConfigByID(mapID);
fightMgr.Init(heroLst, mapCfg);

基础逻辑单位

搭框架,配置基本信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值