Skip to content
woctordho edited this page Jun 5, 2021 · 9 revisions

演出系统

小演出与大演出

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

动画系统

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

转场与特效

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

存档与读档

  1. AnimationEntry不能被记录在存档中,因为可以执行任意代码
  2. 读档时,先停止所有动画,再恢复目标对话的动画
  3. 对于对话内动画,存档中记录的状态是上一条对话结束后、下一条对话开始前的状态,因此目标对话的动画在读档完成后开始播放
  4. 对于持续动画,读档时先跳到持续动画开始时的对话,播放持续动画,再快进到目标对话
    • 在目标对话,观众看到的一般是持续动画刚开始播放的状态,与存档时看到的状态不同。事实上,不同观众推进剧情的速度不同,在每条对话看到的持续动画状态也会不同。游戏制作者不应该让观众在意这一点,持续动画的整个过程应该都要符合剧情

其他与时间有关的内容

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

Clone this wiki locally