Humanoid 实例用于创建角色模型,包括用户头像和 NPC。当 Humanoid 存在于包含名为 Head 的部件的 Model 内时,Roblox 会在该部件上方显示名称和/或生命值条。

通过各种 Humanoid 属性,您可以修改以下内容:
- 用户可见其他人类的名称/生命值与其自身角色的人类的 距离。
- 显示在一个人类上方的 显示名称。
- 人类的 生命值条 是否始终显示、从不显示,或仅在其受损时显示。
- 当相机与其他人类之间的视线受阻时,名称和生命值条是否被 遮挡(隐藏)。
显示属性
显示距离类型
Humanoid.DisplayDistanceType 属性设置用户在与其自身角色有关的情况下如何查看其他角色的名称/生命值。
观察者
当一个人类的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Viewer 时,它可以看到范围内其他人类的名称/生命值,范围为它自身的 NameDisplayDistance 和 HealthDisplayDistance。可以认为这是优先级最低的,因为它不考虑其他被配置为 主体 或 无 的人类。
在下面的场景中,用户的角色 (Viewer) 的 NameDisplayDistance 大于 HealthDisplayDistance,如图中的圆圈所示。因此,用户能够看到 Watchman 和 Octavia 的角色名称,但仅能看到 Watchman 的生命值条。

主体
当一个人类的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Subject 时,它通过其 NameDisplayDistance 和 HealthDisplayDistance 值对其自身的名称和生命值显示 完全控制。实际上,其他人类仅会在距离 主体 人类的指定范围内看到该主体的名称/生命值。
在下面的场景中,Watchman 和 Octavia 都设置为 Subject,它们的 NameDisplayDistance 范围由圆圈指示。只有名称 Octavia 被用户看到,用户的角色站在她的范围内,但在 Watchman 人类的范围外。

无
当一个人类的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.None 时,它的名称和生命值条在任何情况下都不会出现。在下面的场景中,Watchman 和 Octavia 都设置为 None,因此另一个角色即使在范围内也看不到它们的名称或生命值。

生命值显示类型
Humanoid.HealthDisplayType 属性进一步控制角色的生命值条的可见性。该条反映人类的 Health 与其 MaxHealth 的比例,并随着人类健康的减少而从绿色变为黄色再变为红色。
始终显示
当一个人类的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOn 时,其生命值条总是显示。

受伤时显示
将一个人类的 HealthDisplayType 设置为 HumanoidHealthDisplayType.DisplayWhenDamaged,该人类仅在其 Health 低于其 MaxHealth 时显示生命值条。在下面的场景中,Watchman 的生命值满,但不显示生命值条,而 Octavia 受了 50% 的伤害并显示了黄色的生命值条。

从不显示
当一个人类的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOff 时,其生命值条在任何情况下都不会出现。

遮挡
人类名称被墙壁或其他物体遮挡(隐藏)由角色的 Humanoid.NameOcclusion 属性控制。
无遮挡
当一个人类被可见物体遮挡且其 NameOcclusion 设置为 NameOcclusion.NoOcclusion 时,其名称和生命值永远不会被观看的人类遮挡。
在下面的场景中,Watchman 和 Octavia 都设置为 NoOcclusion。虽然两者都被石柱足够遮挡,但观察的人类仍然看到了它们的名称/生命值显示。

遮挡所有
当一个人类被可见物体遮挡且其 NameOcclusion 设置为 NameOcclusion.OccludeAll 时,其名称和生命值总是被观察的人类遮挡。
在下面的场景中,Watchman 和 Octavia 都被石柱足够遮挡。Watchman 被设置为 OccludeAll,因此它的名称和生命值被观察的人类遮挡。然而,Octavia 被设置为 NoOcclusion,她的名称/生命值对观察的人类仍然可见。

敌人遮挡
当一个人类被可见物体遮挡且其 NameOcclusion 设置为 NameOcclusion.EnemyOcclusion 时,其名称和生命值仅对敌方人类(在不同 Team 的玩家)遮挡。
在下面的场景中,Watchman 和 Octavia 都被石柱足够遮挡,并且两者都设置为 EnemyOcclusion。观察的人类和 Watchman 在同一个 Team,因此没有发生名称/生命值遮挡。然而,Octavia 的名称和生命值被遮挡,因为她在对方队伍中。

修改角色显示
用户头像
要修改体验中每个即将到来的头像的名称或生命值显示,请在 Script 中连接 Players.PlayerAdded 和 Player.CharacterAdded 事件,并设置角色的 Humanoid 上的 显示属性。
脚本 - 全局自定义
local Players = game:GetService("Players")
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function(character)
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 赋予每个 humanoid 对其名称/生命值显示距离的完全控制
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Subject
-- 设置名称显示距离为 20 个 Stud
humanoid.NameDisplayDistance = 20
-- 设置生命值条显示距离为 15 个 Stud
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
-- 将所有守卫的名称设置为通用的 "Guard"
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 账户 Display Name 匹配,该名称是唯一的且独立于其账户 Username。要显示一个与用户账户无关的完全自定义名称,您可以覆盖 Humanoid.DisplayName 属性。
直接设置
您可以设置任何 Humanoid 实例的 DisplayName 属性,该实例通过 Script 获得引用,例如 团队自定义 示例,或直接在 NPC 角色的 Humanoid 对象上。
通过用户输入设置
在一些以角色扮演或战斗为主的类型中,您可能想提供一种方法,让用户输入他们自己的角色名称、宠物角色名称等,这些名称与他们的账户显示名称无关。您可以通过 TextBox 名称输入在客户端收集这些输入。

一旦输入提交,您可以通过 远程事件 将其传递给服务器,然后在服务器端监听远程事件并将 过滤后的 名称分配给用户角色的 Humanoid。
LocalScript - 触发远程事件
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)