unity3d 回放机制

来源:互联网 发布:网络言论自由的利弊 编辑:程序博客网 时间:2024/04/30 15:28
开发设计思路分析 
通过找资料获得一些实现的具体思路,简单分析下各自的问题和方便性,其实总的思路就是"记录"+"解析",只是不同的方案在不同点记录不同的内容,记录不同的内容,导致回放处理逻辑不同而已(恩,这句算是废话...)
  1. 直接录屏将整个动画保存出mp4格式进行压缩 
    直接使用视频的优点很明显高保真,搜寻了一些使用录制屏幕插件,他们只支持PC端,移动端不支持,移动端如果想要录制屏幕,目前只能是每一帧进行截图保存到本地,录制结束,将这些图片拼接保存成mp4格式,针对不同的平台可能需要编写不同的图片合成方案。也尝试了Unity官方提供的EveryPlay插件,用于快速分享游戏内容到网站,这个插件使用简单,能够实现录制屏幕的功能,但是视频保存不到本地,通过视频方式保存虽然能够高保真,但是文件量和针对不同平台是两个比较大和需要考虑的问题
  2. 状态记录同步 
    记录每一帧所有角色状态,包括位置,旋转等,这种方式代码比较容易实现,文件量会比较大,3分钟视频,一秒钟30帧,需要36030 = 5400帧如果每个角色每一帧都进行记录至少要3M以上,如果角色少做一些简单的优化比如,只有发生修改的时候才记录会明显的降低文件量,但是对于移动端流量还是很有压力。
  3. 命令/状态驱动同步 
    记录初始状态和命令集合,命令集合包括了玩家全部的操作(攻击,逃跑等等),明显的优点就是数据量小,因为只记录了断断续续的玩家操作,针对编码实现起来会比较难,只能顺序播放,为了保证回放正确必须按照命令顺序严格执行,一般针对战斗规则一定的卡牌这种回放方式是最好的选择,一个输入,得到的结果是一定的。如果结果不一致,那么一定是战斗异常。针对这种设计方案再多思考一下

一种战斗回放简单的流程如下:
  • 角色初始化数据+该战斗使用的randomSeed(保证输入和随机数一致)
  • 交给战斗逻辑处理,每一个回合计算出战斗表现,交给表现层进行播放处理
  • 战斗表现的过程就是回放的过程

另外一种完全命令驱动的流程如下: 每一个回合记录下当前战斗发生的情况(比如角色A释放了技能S,击中角色B,角色B掉血100),每一个回合都通过"命令阐述"的形式记录下来,客户端有一个命令解析器(战斗表现)通过解析命令移动角色,释放技能造成伤害等等操作 
这种方式要比上一种"一个输入一个输出"要占用较多的数据量,这种可以"编辑战斗",可以通过配置,配置出一场战斗,因为,客户端就是命令解析+具体表现 
后补





0 0
原创粉丝点击