角色名称/生命值显示

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

Humanoid 实例用于创建角色模型,既适用于用户虚拟形象也适用于 NPC。当一个 包含一个名为 头部 的部分时, Roblox 在那个部分上方显示一个名称和/或健康条。

Character display information above an in-experience avatar

通过各种 Humanoid 属性,您可以修改以关注中/正在关注内容:

  • 用户可以从 距离 看到其他人形对自己角色人形的名字/生命值的距离。
  • 显示在一个人形上的 显示名称,该名称显示在一个人形上。
  • 无论一个人形怪物的 生命条 是否始终显示、从不显示或仅在人形怪物受损时显示。
  • 无论名称和生命条是否被隐藏(隐藏)(当镜头和另一个人形怪物之间的视线被阻塞时),当镜头和另一个人形怪物之间的视线被阻塞时。

显示属性

显示距离类输入

Humanoid.DisplayDistanceType 属性设置了用户如何看待其他角色与自己角色的名称/生命值关系。

观察者

当一个人形的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Viewer 时,它可以看到自己 NameDisplayDistanceHealthDisplayDistance 范围内其他人形的名称/生命值。你可以将此视为最低优先级,因为它不会被用于其他配置为 主题无主题 的人形被考虑。

在以下场景中,用户的角色(视图器)的大小比视窗大,如图所示。因结果,用户看到了 WatchmanOctavia 的角色名称,但只看到了 Watchman 的健康条。

主题

当一个人形的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Subject 时,它需要 完全控制 自己的名称和生命显示通过其 NameDisplayDistanceHealthDisplayDistance 值。实际上,其他人形只能在那些距离 主题 人形的范围内看到主题的名称/生命值。

在以下场景中, 守望者奥克塔维亚 都设置为 主题 ,其NameDisplayDistance由圆圈表示。只有名称 奥克塔维亚 被其角色站在其范围内但超出 守望者 人形范围的用户看到。

当一个人形怪物的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.None 时,其名称和生命条在任何情况下都不会出现。在以下场景中, WatchmanOctavia 都设置为 ,因此其他角色在范围内时也无法看到名字或生命值。

生命显示类输入

Humanoid.HealthDisplayType 属性提供进一步控制角色的健康条显示。该条反映了人形的 Health 作为其 MaxHealth 的因素,并且随着人形的健康下降,颜色从绿色变为黄色,再变为红色。

始终在线

当一个人形怪物的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOn 时,其生命条总是会出现。

受损时显示

一个具有 HealthDisplayType 设置为 HumanoidHealthDisplayType.DisplayWhenDamaged 的人形只显示生命条当其 Health 小于其 MaxHealth 时在以下场景中, 守望者 拥有完整的生命值且不显示生命值条,但 奥克塔维亚 受到 50% 伤害并显示黄色生命值条。

始终关闭

当一个人形怪物的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOff 时,其生命条在任何情况下都不会出现。

封闭

人形名称在墙壁或其他对象后的隐藏(遮蔽)由角色的 Humanoid.NameOcclusion 属性控制。

无闭塞

当一个人形怪物被隐藏在可见对象后面,其 NameOcclusion 设置为 NameOcclusion.NoOcclusion 时,其名称和生命永远不会被人类形怪物查看。

在以下场景中, both 守望者Octavia 都设置为 NoOcclusion 。虽然两者都足够隐藏在石柱后,但观察人形仍然可以看到他们的名称/生命显示。

包含所有

当一个人形怪物被隐藏在可见对象后面,其 NameOcclusion 设置为 NameOcclusion.OccludeAll 时,其名称和生命值始终被隐藏从查看人形怪物。

在以下场景中, both 守望者奥克塔维亚 都足够隐藏在石柱后面。 守望者 设置为 OccludeAll ,因此其名称和健康状况隐藏于观察人形。 奥克塔维亚 ,但设置为没有遮蔽,她的名字/生命仍然可以看到视觉人形。

敌人遮蔽

当一个人形怪物被隐藏在可见对象后面,其NameOcclusion设置为NameOcclusion.EnemyOcclusion时,其名称和生命只对敌人的人形怪物(不同的Team玩家)被隐藏。

在以下场景中, 守望者奥克塔维亚 都被隐藏在石柱后足够,两者都设置为 敌人遮蔽 。观察人形和守望者在同一个上,因此名称/生命封锁不会发生。然而,对方团队的名称和生命值 Octavia 被隐藏。

修改角色显示

用户虚拟形象

要修改体验中每个进入的虚拟形象的名称或生命显示,请在 Players.PlayerAddedPlayer.CharacterAdded 事件中连接 Script 并设置 显示属性 在角色的 Humanoid 上。

脚本 - 全球自定义

local Players = game:GetService("Players")
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function(character)
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 给每个人形全部控制其名称/生命显示距离
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Subject
-- 将名称显示距离设置为 20 格
humanoid.NameDisplayDistance = 20
-- 将生命条显示距离设置为 15 格
humanoid.HealthDisplayDistance = 15
-- 仅在人形被损坏时显示生命条
humanoid.HealthDisplayType = Enum.HumanoidHealthDisplayType.DisplayWhenDamaged
end
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)

您还可以根据玩家的 Team 自定义属性,例如将所有“守卫”玩家设置为通用名称,并隐藏所有“忍者”玩家的名称。

脚本 - 团队自定义

local Players = game:GetService("Players")
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function(character)
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 将所有保安的名称设置为通用“保安”
if player.Team.Name == "Guards" then
humanoid.DisplayName = "Guard"
-- 隐藏所有忍者的名称
elseif player.Team.Name == "Ninjas" then
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
end
end
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)

NPC 角色

对于已放置在 3D 世界中的 NPC 角色,您可以在 属性窗口 中直接编辑名称/生命值。

覆盖显示名称

默认情况下,一个人形显示名称与用户的 Roblox 帐户匹配 显示名称 ,这是独一无二且与他们的帐户分开的 用户名 。要显示与用户帐户无关的完全自定义名称,您可以覆盖 Humanoid.DisplayName 属性。

直接设置

您可以通过 DisplayName 设置任何 Humanoid 实例的 Script 属性,例如 团队自定义 示例,或直接在 NPC 角色的 人形对象 上。

通过用户输入设置

在一些角色扮演或战格斗等类型中,您可能想为用户提供输入自己角色名称、宠物角色名称等的方法。这与体验无关,不捆绑到他们的帐户显昵称。您可以通过 TextBox 名称输入在客户端收集此输入。

一旦输入提交,您可以通过 远程事件 将其传递给服务器,然后,在服务器端,监听远程事件并将 过滤 名称分配给用户角色的 Humanoid

本地脚本 - 发射远程事件

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local changeNameEvent = ReplicatedStorage:WaitForChild("ChangeNameEvent")
changeNameEvent:FireServer("Amory")
脚本 - 分配过滤名称

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TextService = game:GetService("TextService")
-- 创建远程事件以接收客户端的文本进行筛选
local changeNameEvent = Instance.new("RemoteEvent")
changeNameEvent.Name = "ChangeNameEvent"
changeNameEvent.Parent = ReplicatedStorage
local function onRequestNameChange(player, newName)
local character = player.Character
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
local filterResult
local success, errorMessage = pcall(function()
filterResult = TextService:FilterStringAsync(newName, player.UserId)
end)
if success then
local filteredName
local success, errorMessage = pcall(function()
filteredName = filterResult:GetNonChatStringForBroadcastAsync()
end)
if success and humanoid then
humanoid.DisplayName = filteredName
end
end
end
changeNameEvent.OnServerEvent:Connect(onRequestNameChange)