-
Notifications
You must be signed in to change notification settings - Fork 82
Choreo
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