Skip to content
woctordho edited this page Apr 27, 2024 · 8 revisions

演出系统的设计

小演出与大演出

  • 小演出:涉及少数game object、线性或简单的非线性动画,可重复使用,用Nova的动画系统实现
  • 大演出:涉及多个game object、复杂的非线性动画、粒子系统等Unity的各种功能,一般不重复使用,封装在一个prefab里,一般用Unity的时间轴控制

动画系统

  • 一“组”动画由许多“段”动画(AnimationEntry)以树状结构组成,挂在一个NovaAnimation下面
    • 一段动画可以与另一段动画同时开始(兄弟节点,并行播放),也可以在另一段动画结束后开始(父子节点,串行播放)
  • 一段动画可以改变位置、颜色、音量等属性(AnimationProperty),执行各种Lua代码(action),或者只是延时
    • Nova不能避免两段动画同时修改一个属性,游戏制作者需要负责避免这种情况
    • AnimationProperty用一个参数value对这个属性的开始状态和结束状态进行插值,而AnimationEntry.EasingFunction用于实现非线性动画,把时刻映射到value
  • 演出用到的动画主要分为对话内动画(per dialogue animation)和持续动画(holding animation),由NovaAnimation.type设置
    • 对话内动画只能在一条对话之内播放,点击鼠标时动画会终止(如果游戏设置中选中了“点击终止动画”)
    • 持续动画播放的过程可以跨越多条对话,比如一盏灯不停地闪,或者走路时背景移动。点击鼠标时动画不会停止,必须用脚本停止
  • 动画的无限循环通过尾递归实现,详见animation_high_level.lua中的loop
    • 如果需要有限次数的循环,可以在创建动画时用for循环等方法创建,也可以在无限循环中设置终止循环的条件
  • 自动模式下,等待(文本动画结束 且 对话内动画结束 且 语音结束) + 一段时间,再进入下一条对话
    • 如果对话内动画有无限循环,只考虑循环一次的时长
  • 快进模式下,每条对话中的所有动画一开始就终止

转场与特效

  • 转场与特效用shader实现,可以添加在sprite或摄像机上
    • 如果需要把多个game object(比如角色和背景)当作一整张图片,对它们同时添加转场或特效,就要添加在摄像机上
    • 摄像机支持多层特效(post processing stack),sprite目前不支持
    • 角色立绘目前不支持特效
  • 转场分为第一类(trans)与第二类(trans2
    • 第一类转场的shader接受两张贴图,将转场前的画面渐变到转场后的画面
    • 第二类转场的shader只接受一张贴图,通过多段动画,先让上一幅画面消失,再把贴图换成下一幅画面,再让下一幅画面出现

存档与读档

  • 保存每条对话所对应的游戏状态时,我们不能保存AnimationEntry,因为它可以执行任意代码
    • 所以我们用checkpoint and replay的方式恢复动画的状态,详见存档系统
  • 读档时,先停止所有动画,再恢复目标对话的动画
  • 对于对话内动画,存档中记录的状态是目标对话的代码块运行之前的状态,因此在读档完成后再开始播放目标对话的动画
  • 对于持续动画,读档时先跳到持续动画开始时的那条对话,播放持续动画,再快进到目标对话
    • 在目标对话时,玩家看到的一般是持续动画刚开始播放的状态,与正常进行游戏到这里再存档时看到的状态不同
    • 事实上,不同玩家推进剧情的速度不同,在每条对话看到的持续动画状态也会不同
    • 游戏制作者不应该让玩家在意这一点,持续动画的整个过程应该都要符合剧情,比如走路时的背景移动应该不会影响剧情

其他与时间有关的内容

  • 文本动画的大多数行为与对话内动画相同,但是即使游戏设置中没有选中“点击终止动画”,文本动画也会在点击鼠标时终止
  • 音效与动画并行播放
    • 如果要等待音效播放结束,可以根据音效的长度写一个延时
    • 如果要用脚本停止音效,或者改变音效的音量,应该用AudioController而不是SoundController来控制,如bgs
Clone this wiki locally