进度展示
前言
上一篇的两个问题已经理清楚,还在整理笔记中,届时会放到笔记分享中。其次呢,我改一下文章的撰写方式,先把一章的进度列出来,然后不断迭代,直至完成文章,这样既可以知道自己的进度,又可以及时把遇到的问题抛出记录。
进度(完成的会在后面打“√”)
- 技能类编写 √
- 技能配置面板编写 √
- 技能逻辑流程编写 √
- 计算攻击目标 √
- 技能释放,受击特效生成 √
- 技能伤害计算 √
- 怒气值处理 √
- 吟唱型技能 √
- 弹道型技能 √
- 配置管理编写 √
- 英雄配置加载,死亡处理 √
- 战斗回合逻辑处理 √
- 英雄攻击顺序和攻击流程处理 √
- 回合界面动画制作 √
遇到的问题
人物动画和特效不一致 (已解决)
仿DNF课程里的思路,在编辑器里写了一个Spine动画的加载,这样就可以通过拖动进度条的方式来计算出前摇和释放特效的时间。
这个过程中,还发现Spine动画如果想在编辑器里弄的话十分麻烦,因而想到了直接用一个空场景运行,然后在同一帧进行动画速度的改变,最终实现了拖动进度条的方式播放动画。
关键代码
SkeletonAnimation anim;
if (skillOwner.TryGetComponent<SkeletonAnimation>(out anim))
{
ownerAnim = anim;
// 获取当前所有的骨骼动画数据
var animationObjects = anim.skeletonDataAsset.GetSkeletonData(false).Animations;
animationNames.Clear();
// 将所有骨骼动画的名字写到animationNames中
foreach (var VARIABLE in animationObjects)
{
animationNames.Add(VARIABLE.Name);
}
// 将配置中的动画名字与当前AnimationState中的动画名字对齐
animName = anim.AnimationState.GetCurrent(0).Animation.Name;
}
// 获取当前动画轨道
TrackEntry currentAnimation = ownerAnim.AnimationState.GetCurrent(0);
if (currentAnimation != null)
{
// 计算新的时间点
float val = (float)animRate / 100;
// 根据比列算出当前动画播放节点
float newTime = currentAnimation.Animation.Duration * val;
// 更新动画时间
currentAnimation.TimeScale = 1;
currentAnimation.TrackTime = newTime;
// 修改帧逻辑的数值,用于计算动画时间
logicFrameCount = (int)(newTime / LogicFrameConfig.LogicFrameInterval);
currentAnimation.TimeScale = 0;
}
小补充
可以通过这个办法,做到在编辑器下运行Spine,链接: 编辑器模式下运行Spine动画
消息转发问题 (已解决)
由于并不是完全跟着帧同步课程写的缘故,在这个项目里用的是铸梦老师ZMUI框架写的,在创建英雄血条的时候,是用消息发送的形式去创建的,由于我对于Action的内部运行顺序不太了解,这块感觉是要去弄清楚顺序的。
答:通过Debug模式跑了一下之后,明白了框架在分发事件后会立马进行调用,而且从代码中可以看出事件是用List存储的,因而会根据加入的顺序来决定响应的先后,这个在之后多个事件监听的时候要注意下是否存在顺序关系。
特效加载卡顿(已知,可留到最后优化做)
因为现在是同步加载,可以考虑预加载或者异步资源加载的方式,前者会简单些,后者的话,现在感觉逻辑和渲染耦合性较强,要是考虑异步加载的话,估计得重新理一理。
人物在移动时被遮挡 (已知,可留到最后优化做)
第一时间想到的是,在英雄回合行动时把骨骼动画的OrderInLayer修改到更上面的Layer层。
然后英雄回合行动后把骨骼动画的OrderInLayer设置为原来的。
状态
完结撒花🎉