25. 制作血条的 UI Document
UI Toolkit
本项目使用 UI Toolkit 进行
HealthBar
通过 Create -> UI Toolkit -> UI Document 创建一个 HealthBar
在 HealthBar 里面,我们可以添加一个 Progress Bar 用于表示血条,然后将 ProgressBar 改成下面的样子,Anchors 向左 150 像素,向上 20 像素,宽度 300 像素
Panel Settings
Create -> UI Toolkit -> Panel Setting Asset,起名叫 Panel Settings
然后我们让它的 Scale Mode 为 Scale With Screen Size,分辨率改为 1920 x 1080,Match 改为 0.5
Player 添加插件
在 Player 上面,添加 UI Document 插件,其中 Panel Settings 和 Source Asset 是之前 UI Tookit 里创建好的资源
然后在 Player 下面添加一个子节点,用于表示血条的位置
最后在 Player 上面添加 HealthBarController 组件
HealthBarController 组件的代码如下
using UnityEngine;
using UnityEngine.UIElements;
public class HealthBarController : MonoBehaviour
{
[Header("Elements")]
public Transform healthBarTransform;
private UIDocument healthBarDocument;
private ProgressBar healthBar;
private void Awake()
{
healthBarDocument = GetComponent<UIDocument>();
healthBar = healthBarDocument.rootVisualElement.Q<ProgressBar>("HealthBar");
Debug.Log($"{healthBarTransform.position}");
MoveToWorldPosition(healthBar, healthBarTransform.position, Vector2.zero);
}
private void OnEnable()
{
healthBarDocument = GetComponent<UIDocument>();
healthBar = healthBarDocument.rootVisualElement.Q<ProgressBar>("HealthBar");
Debug.Log($"{healthBarTransform.position}");
MoveToWorldPosition(healthBar, healthBarTransform.position, Vector2.zero);
}
private void MoveToWorldPosition(VisualElement element, Vector3 worldPosition, Vector2 size)
{
Rect rect = RuntimePanelUtils.CameraTransformWorldToPanelRect(element.panel, worldPosition, size, Camera.main);
Debug.Log($"{rect.position}");
element.transform.position = rect.position;
}
[ContextMenu("Get UI Position")]
public void Test()
{
healthBarDocument = GetComponent<UIDocument>();
healthBar = healthBarDocument.rootVisualElement.Q<ProgressBar>("HealthBar");
Debug.Log($"{healthBarTransform.position}");
MoveToWorldPosition(healthBar, healthBarTransform.position, Vector2.zero);
}
}
这段代码中
在 Awake 的时候,获取 UIDocument 里面的 HealthBar,然后把它移动到 HealthBarTransform 所在的位置
为了方便调试,我们增加了 Test 方法,这样可以在没有运行的时候,也能在 HealthBarController 组件上面右键选择 Get UI Position 来显示血条的位置
但是这个方法好像有问题,群里的小伙伴都说 Awake 时的血条位置和 Test 时的血条位置不一致。老师让我在 OnEnable 里试试,我发现把 Player Disable 再 Enable 之后,血条位置也是不一样的。暂时无解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?