# 标签 ## 设置标签事件 有时候我们需要大量重复地完成一些特效,例如轨道和房间的循环移动等,每次都是好几个移动事件作为一组。如果每次都是大段大段地复制粘贴,那么事件栏里面的空间就会变得非常拥挤。 尽管紫色版块的空间已经近乎无穷大,但还是有一种让事件栏变得清爽的方案。只要把一组事件都添加一个标签,那么接下来想要运行这一整组事件,只需要再添加一个**标签动作**事件即可。 ```rdview 18 3 g 1 0 4 2 #ff0{ g 0 -1 0 3 #08f[]{}; MoveRow [tag=action]; MoveRow 1[tag=action]; MoveCamera 2[tag=action]; Flash 2.5[tag=action]; HideRow 0 1[tag=action]; SetVFXPreset 1.5 1[tag=action]; SetVFXPreset 2 1[tag=action]; HideRow 3 1[tag=action]; g 5 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=action]; g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ g 0 -1 0 3 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; MoveCamera 2[]; Flash 2.5[]; HideRow 0 1[]; SetVFXPreset 1.5 1[]; SetVFXPreset 2 1[]; HideRow 3 1[]; }; }; g 9 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=action]; g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ g 0 -1 0 3 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; MoveCamera 2[]; Flash 2.5[]; HideRow 0 1[]; SetVFXPreset 1.5 1[]; SetVFXPreset 2 1[]; HideRow 3 1[]; }; }; g 13 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=action]; g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ g 0 -1 0 3 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; MoveCamera 2[]; Flash 2.5[]; HideRow 0 1[]; SetVFXPreset 1.5 1[]; SetVFXPreset 2 1[]; HideRow 3 1[]; }; }; }; ``` ### 基本操作 要给事件添加标签,首先需要选中一个事件,点击左上角**小节**两个字(或者按下快捷键`Shift + 0`),这时就能看到事件的上方多了一个名为标签的栏目。在里面填好自己设置的标签名,例如move。这个时候应该能看到轨道移动的图标左下角多了一个黄色的小三角(如上图所示)。 ![](../images/tag-settag.gif) 有了标签之后,再去紫色的版块添加**标签动作**事件。在标签栏同样填写move。 ![](../images/tag-runtag.png) 这时播放一下音乐你就会发现,带标签的轨道移动本身已经不生效了,只有时间轴走到“标签动作”的对应时刻才会让标签动作生效。 如果有多个事件都设置了同一个标签名,那么标签动作也就会按照这些事件的相对时间顺序依次生效。 ![](../images/tag-tagusageexample.gif) > 相同标签的一组事件允许横跨多个小节,但这在早版本的编辑器里是不允许的。 ### 特殊标签 另外,标签开头可以附加有特殊标签,如下表所示。这些标签会在满足特定条件时被自动调用,而不需要使用标签动作手动调用。 ![](/images/39-14.png) | 标签 | 条件 | | :-------------------- | :------------ | | `[onHit]` | 每当有节拍被击中 | | `[onMiss]` | 每当有节拍被错过 | | `[onHeldPressHit]` | 每当有长按拍按下判定被击中 | | `[onHeldReleaseHit]` | 每当有长按拍松开判定被击中 | | `[onHeldPressMiss]` | 每当有长按拍按下判定被错过 | | `[onHeldReleaseMiss]` | 每当有长按拍松开判定被错过 | | `[row0]` ~ `[row15]` | 使特殊标签只作用于特定轨道 | 对于`[rowX]`标签,X是从0开始计数的。例如,标签`[onHit][row0]`会在每次第一条轨道上有拍子被击中时被调用。如果输入的轨道编号不存在,则会应用于所有轨道(即这个特殊标签会被忽略)。 > 编辑器是支持只输入特殊标签的,但不推荐这样做;最好在特殊标签后都加上自己设置的标签名。 ### 标签递归 如果这组事件需要在**固定周期**下循环触发,可以在这组事件循环周期完全结束的时间点上再放置一个标签动作事件,并且给这个标签动作事件添加标签,那么这个标签事件就自带循环。需要停止时再放置一个标签动作事件,动作选项中选择**禁用**。 ```rdview 16 5 g 1 1 2 1 #df0{ g 0 -1 0 2 #08f[]{}; MoveRow [tag=move]; MoveRow 1[tag=move]; g 4 0 0 0 #0000[offset=0 -1]{ TagAction[Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; }; }; g 6 0 0 0 #0000[offset=0 -1]{ TagAction[Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; }; }; g 8 0 0 0 #0000[offset=0 -1]{ TagAction[Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; }; }; g 10 0 0 0 #0000[offset=0 -1]{ TagAction[Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; g 0 -1 1 1 #0000[]{}; MoveRow []; MoveRow 1[]; }; }; }; g 1 3 3 1 #df0{ g 0 -1 0 2 #08f[]{}; MoveRow [tag=move]; MoveRow 1[tag=move]; TagAction 2[tag=move]; g 4 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=move]; g 0 1 3 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; MoveRow []; MoveRow 1[]; g 2 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; MoveRow []; MoveRow 1[]; g 2 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; MoveRow []; MoveRow 1[]; g 2 0 0 0 #0000[offset=0 -1]{ TagAction[offset_opacity=0,Tag=move]; g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ g 0 -1 0 2 #08f[]{}; MoveRow []; MoveRow 1[]; g -6 -4 1 5 #0000[]{}; }; }; }; }; }; }; }; }; TagAction 12[]; }; ``` > 禁用标签不一定会立马停止运行,而是会让最后一次标签事件执行完,所以禁用事件一般需要略微提前。 ## 筛选事件 当事件栏里的事件数量大到一定程度的时候,想要再从中寻找到想编辑修改的那个事件有时就会煞费时间。编辑器仍然为我们提供了一种寻找事件的方式,那就是筛选仅显示特定的事件,将其余的隐藏。 ![](../images/tag-actionfilter.png) 点击图中的“**显示:全部**”按钮,即可打开筛选界面。接下来点击左上角的“**不选**”按钮,所有紫色版块中的事件就都会被隐藏,此时在列表里寻找你只想要的事件并点击按钮,那么这个事件就取消隐藏了。如果想要所有的事件全都恢复显示,则再点击一次左上角的“**全选**”按钮。 ## 让事件摆放更有条理 考虑到还是会有一些情况下事件并非都是重复的,而是零零散散真的有一大堆。这种情况下把事件摆放清楚会在作谱的过程中事倍功半。 1. 每一行放些什么事件最好能由明确的区分,方便后期梳理自己设计了一些什么。比如把贯穿全程的浮动文字歌词都放在同一行,把移动轨道都放在同一行等。 ```rdview 19 4 g 0 0 19 1 #f00[]{ Comment [color=ffff00]; FloatingText 0.5[outlineColor=000000]; FloatingText 1[outlineColor=000000]; FloatingText 1.5[outlineColor=000000]; FloatingText 2[outlineColor=000000]; FloatingText 2.5[outlineColor=000000]; FloatingText 3[outlineColor=000000]; FloatingText 3.5[outlineColor=000000]; FloatingText 4[outlineColor=000000]; AdvanceText 4.5[]; AdvanceText 5[]; AdvanceText 5.5[]; AdvanceText 6[]; AdvanceText 6.5[]; AdvanceText 7[]; AdvanceText 7.5[]; FloatingText 8[outlineColor=000000]; FloatingText 8.75[outlineColor=000000]; Comment 9.75[tab=Actions]; FloatingText 11.75[outlineColor=000000]; FloatingText 12.5[outlineColor=000000]; FloatingText 13.5[outlineColor=000000]; FloatingText 14[outlineColor=000000]; FloatingText 14.5[outlineColor=000000]; FloatingText 15[outlineColor=000000]; FloatingText 15.5[outlineColor=000000]; FloatingText 16[outlineColor=000000]; FloatingText 16.5[outlineColor=000000]; FloatingText 17[outlineColor=000000]; FloatingText 17.5[outlineColor=000000]; }; g 0 1 6.25 1 #08f[]{ MoveCamera []; MoveCamera 0.5[]; MoveCamera 1[]; MoveCamera 1.5[]; MoveCamera 2[]; MoveCamera 2.5[]; MoveCamera 3[]; MoveCamera 3.5[]; MoveCamera 4[]; MoveCamera 5[]; SetForeground 5.25[]; }; Comment 6.25 1[tab=Actions]; MoveRow 7.75 1[]; MoveRow 8 1[]; MoveRow 8.75 1[]; MoveCamera 12 1[]; SetForeground 12.25 1[]; FloatingText 14.5 1[outlineColor=000000]; FloatingText 15 1[outlineColor=000000]; FloatingText 15.5 1[outlineColor=000000]; FloatingText 16 1[outlineColor=000000]; FloatingText 16.5 1[outlineColor=000000]; SetVFXPreset 18 1[]; g 0 2 13.875 1 #06f[]{ MoveRow []; MoveRow []; Comment 1.75[tab=Actions]; MoveRow 2.75[]; MoveRow 3[]; MoveRow 4.5[]; MoveRow 4.75[]; MoveRow 5[]; MoveRow 5.25[]; MoveRow 6.75[]; MoveRow 7[]; MoveRow 7.5[]; MoveRow 7.75[]; MoveRow 8.5[]; MoveRow 10[]; MoveRow 10.25[]; HideRow 11.5[]; HideRow 11.5[]; MoveRow 12.5[]; MoveRow 12.75[]; }; Comment 14 2[tab=Actions]; g 0 3 18 1 #f80[]{ FloatingText 0.5[outlineColor=000000]; AdvanceText 1[]; AdvanceText 1.5[]; AdvanceText 2.5[]; AdvanceText 3[]; AdvanceText 4.5[]; AdvanceText 5[]; AdvanceText 5.5[]; AdvanceText 6[]; AdvanceText 6.5[]; AdvanceText 7[]; AdvanceText 8[]; AdvanceText 10.5[]; AdvanceText 11.5[]; AdvanceText 12[]; AdvanceText 12.5[]; AdvanceText 13[]; AdvanceText 13.5[]; AdvanceText 14[]; AdvanceText 14.5[]; AdvanceText 15[]; AdvanceText 15.5[]; AdvanceText 16[]; AdvanceText 16.5[]; AdvanceText 17[]; AdvanceText 17.5[]; }; ``` 2. 如果有一串同类型的事件紧密排布,例如每1/4格或者1/2格放一个,那么可以考虑不放在同一行,而是上下交错排开。 ```rdview 16 4 MoveRow []; MoveRow 1[]; MoveRow 2[]; MoveRow 4[]; MoveRow 5[]; MoveRow 6[]; MoveRow 8[]; MoveRow 9[]; MoveRow 10[]; MoveRow 12[]; MoveRow 13[]; MoveRow 14[]; MoveRow 0.5 1[]; MoveRow 1.5 1[]; MoveRow 3 1[]; MoveRow 4.5 1[]; MoveRow 5.5 1[]; MoveRow 7 1[]; MoveRow 8.5 1[]; MoveRow 9.5 1[]; MoveRow 11 1[]; MoveRow 12.5 1[]; MoveRow 13.5 1[]; MoveRow 15 1[]; Comment 4 3[tab=Actions]; ``` 3. 对于事件总体数量不太高的情况,如果有操作房间和轨道类型的特效,可以考虑把他们放在对应数量的行里,找起来会更加方便。 4. 如果你发现在音乐初始位置需要叠放大量特效来给各个轨道和主题等做初始化,那么也最好把同类特效叠在一起。这分为两种情况:一种是相同的特效叠在一起;另一种是操作相同的对象的叠在一起。这两种都是非常直观的。 5. 如果需要花费一个比较长的时间跨度来制作一个谱面,那么最好放置一些注释来解释每一个小段的设计思路,以免在咕咕了一阵子之后完全失去了方向。**注释**事件在可以在红色、紫色、绿色、黄色的版块里找到。 ![](../images/tag-comment.png)