Title 与 ActionBar
屏幕上的文字显示——居中大字标题(Title)和物品栏上方的提示条(ActionBar)。1.12.2 起 Bukkit 提供了直接 API,不必再像旧版那样靠 NMS 发包。
Title(大字标题)
Player.sendTitle 直接发,可分别设主标题、副标题、淡入/停留/淡出时间:
java
player.sendTitle(
ChatColor.GOLD + "欢迎归来", // 主标题
ChatColor.YELLOW + "祝您游戏愉快", // 副标题
10, // 淡入(tick)
60, // 停留
10 // 淡出
);时间单位是 tick
20 tick = 1 秒。10, 60, 10 即淡入 0.5 秒、停留 3 秒、淡出 0.5 秒。
只发主标题、不要副标题时,副标题传 null:
java
player.sendTitle(ChatColor.RED + "危险区域", null, 5, 40, 10);ActionBar(物品栏上方提示)
ActionBar 是显示在物品栏上方的短文字,不挡视线、几秒后自动消失,适合做提示。
Spigot API
用 player.spigot().sendMessage,指定 ChatMessageType.ACTION_BAR:
java
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
player.spigot().sendMessage(
ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.GREEN + "+10 金币")
);Paper API(更简洁)
Paper 提供了直接的 sendActionBar:
java
player.sendActionBar(ChatColor.GREEN + "+10 金币");跨核心兼容
sendActionBar 是 Paper 独有方法,Spigot 没有。若你的插件要同时支持 Spigot,用上面的 spigot().sendMessage 方案。只跑 Paper 就用 sendActionBar,简洁。
实战:技能冷却提示
玩家释放技能后用 ActionBar 显示冷却倒计时(配合调度器):
java
new BukkitRunnable() {
int cd = 5;
@Override
public void run() {
if (cd <= 0) {
player.spigot().sendMessage(
ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.GREEN + "技能就绪")
);
cancel();
return;
}
player.spigot().sendMessage(
ChatMessageType.ACTION_BAR,
TextComponent.fromLegacyText(ChatColor.RED + "技能冷却:" + cd + "s")
);
cd--;
}
}.runTaskTimer(this, 0L, 20L); // 每秒一次Title vs ActionBar 怎么选
| 类型 | 位置 | 时长 | 适合 |
|---|---|---|---|
sendTitle | 屏幕中央 | 手动控制 | 重要提示、过场动画、区域标题 |
| ActionBar | 物品栏上方 | 自动消失 | 实时反馈(金币、冷却、坐标) |
sendMessage | 聊天框 | 留存 | 常规消息 |
别滥用 Title
Title 居中且挡视线,频繁弹出会打扰玩家。重要节点用 Title,日常反馈用 ActionBar 或聊天消息。
关于旧版本的 NMS 发包
1.8~1.11 期间 Bukkit 还没有 Title API,开发者得自己用 NMS 发 PacketPlayOutTitle 数据包。现在高版本直接用 sendTitle 即可,不必再碰 NMS——这也呼应底层内容的忠告:能用 API 就别用 NMS。
进阶内容到此结束。接下来进入底层内容——NMS 与发包,那是最后的手段。
