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

通过各种 Humanoid 属性,您可以修改以下内容:
- 用户可以在其自身角色的 humanoid 相对的范围内查看其他 humanoid 的名称/健康的 距离。
- 在 humanoid 上方显示的 显示名称。
- humanoid 的 健康条 是否始终出现、从不出现或仅在 humanoid 受伤时出现。
- 当摄像机与另一个 humanoid 之间的视线被阻挡时,名称和健康条是否被 遮挡(隐藏)。
显示属性
显示距离类型
Humanoid.DisplayDistanceType 属性设置用户如何在其自身角色的相对范围内查看其他角色的名称/健康。
观察者
当 humanoid 的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Viewer 时,它可以在其自身的 NameDisplayDistance 和 HealthDisplayDistance 范围内看到其他 humanoid 的名称/健康。您可以将其视为最低优先级,因为它不考虑其他配置为 subject 或 none 的 humanoid。
在以下场景中,用户的角色(观察者)的 NameDisplayDistance 大于 HealthDisplayDistance,如圆圈所示。因此,用户可以看到 Watchman 和 Octavia 的角色名称,但只看到 Watchman 的健康条。

主题
当 humanoid 的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.Subject 时,通过其 NameDisplayDistance 和 HealthDisplayDistance 值,它对自己的名称和健康显示进行 完全控制。实际上,其他 humanoid 只有在距离 主体 humanoid 的这些距离内才能看到其名称/健康。
在以下场景中,Watchman 和 Octavia 都设置为 主体,它们的 NameDisplayDistance 范围由圆圈表示。只有名称 Octavia 被站在她范围内但处于 Watchman humanoid 范围之外的用户看到。

无
当 humanoid 的 DisplayDistanceType 设置为 HumanoidDisplayDistanceType.None 时,其名称和健康条在任何情况下都不会出现。在以下场景中,Watchman 和 Octavia 都设置为 无,因此其他角色在范围内也看不到他们的名称或健康。

健康显示类型
Humanoid.HealthDisplayType 属性进一步控制角色健康条的可见性。该条反映 humanoid 的 Health 作为其 MaxHealth 的因子,随着 humanoid 健康的减少而变为绿色、黄色和红色。
始终启用
当 humanoid 的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOn 时,其健康条始终出现。

受伤时显示
具有 HealthDisplayType 设置为 HumanoidHealthDisplayType.DisplayWhenDamaged 的 humanoid 仅在其 Health 小于其 MaxHealth 时显示健康条。在以下场景中,Watchman 健康满值未显示健康条,而 Octavia 受损 50% 并显示黄色健康条。

始终不显示
当 humanoid 的 HealthDisplayType 设置为 HumanoidHealthDisplayType.AlwaysOff 时,其健康条在任何情况下都不会出现。

遮挡
通过角色的 Humanoid.NameOcclusion 属性可以控制 humanoid 名称是否被墙壁或其他物体遮挡。
无遮挡
当 humanoid 隐藏在可见物体后,并且其 NameOcclusion 设置为 NameOcclusion.NoOcclusion 时,其名称和健康从可见的 humanoid 视角中永远不会被遮挡。
在以下场景中,Watchman 和 Octavia 都设置为 无遮挡。尽管两者都足够隐藏在石柱后,但可视的 humanoid 仍然可以看到他们的名称/健康显示。

遮挡全部
当 humanoid 隐藏在可见物体后,并且其 NameOcclusion 设置为 NameOcclusion.OccludeAll 时,其名称和健康永远不会被可视的 humanoid 看到。
在以下场景中,Watchman 和 Octavia 都足够隐藏在石柱后。Watchman 被设置为 遮挡全部,因此其名称和健康对可视的 humanoid 隐藏。然而,Octavia 被设置为 无遮挡,她的名称/健康仍然对可视的 humanoid 可见。

敌人遮挡
当 humanoid 隐藏在可见物体后,并且其 NameOcclusion 设置为 NameOcclusion.EnemyOcclusion 时,其名称和健康仅对敌方 humanoid(属于不同 Team 的玩家)被遮挡。
在以下场景中,Watchman 和 Octavia 都足够隐藏在石柱后,并且都设置为 敌人遮挡。可视的 humanoid 和 Watchman 在同一个 Team 上,因此不会发生名称/健康遮挡。然而,处于对立团队的 Octavia 的名称和健康被遮挡。

修改角色显示
用户头像
要修改游戏中每个进入的头像的名称或健康显示,请连接 Players.PlayerAdded 和 Player.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 对其名称/健康显示距离的完全控制
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Subject
-- 设置名称显示距离为 20 个单位
humanoid.NameDisplayDistance = 20
-- 设置健康条显示距离为 15 个单位
humanoid.HealthDisplayDistance = 15
-- 仅在 humanoid 受伤时显示健康条
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 角色,您可以在 属性 窗口中直接编辑名称/健康。


重写显示名称
默认情况下,humanoid 的显示名称与用户的 Roblox 账户 显示名称 相匹配,该名称是唯一的,并且与其账户 用户名 分开。要显示一个与用户账户无关的完全自定义名称,您可以重写 Humanoid.DisplayName 属性。
直接设置
您可以设置任何 Humanoid 实例的 DisplayName 属性,该实例通过 Script 获得引用,例如 团队 自定义 示例,或直接在 NPC 角色的 Humanoid 对象上。
通过用户输入设置
在某些类型的游戏中,例如角色扮演或战斗,您可能希望提供一种方式,让用户输入他们自己的角色名称、宠物角色名称等,这些名称与体验特定,并且不与他们的账户显示名称相关。您可以通过 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)