首页 > 其他分享 >25. 制作血条的 UI Document

25. 制作血条的 UI Document

时间:2024-03-05 23:45:27浏览次数:26  
标签:25 血条 healthBar UI position healthBarTransform Document healthBarDocument

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 之后,血条位置也是不一样的。暂时无解

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240305_2244

标签:25,血条,healthBar,UI,position,healthBarTransform,Document,healthBarDocument
From: https://www.cnblogs.com/hellozjf/p/18055562

相关文章

  • 257. 二叉树的所有路径c
    很好的题目,让我的sprintf旋转/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*......
  • B-核心交换机-1-C-06-CSW-RGS6250-01U40
    设备编码:SHDXYQB4-108-C-06-CSW-RGS6250-M1-01U40_37带外地址:10.30.0.41hostnameSHDXYQB4-108-C-06-CSW-RGS6250-M1-01U40_37#ACLipaccess-listextended200010permitiphost10.30.0.136any15permitiphost10.30.0.137any1000denyipanyanylist-remarkFor......
  • B-万兆业务接入-C-07-ASW-RGS6250-01U37 leaf-2
    设备编码:SHDXYQB4-108-C-07_C-07-ASW-RGS6250-M2-01U40_37带外地址:10.30.0.44hostnameSHDXYQB4-108-C-07_C-07-ASW-RGS6250-M2-01U40_37novrfglobal-vrf!vrfdefinitionNET-managedescriptionFor_NetworkManagerd1:1address-familyipv4exit-address-familyad......
  • B-核心交换机-2-C-06-CSW-RGS6250-01U37
    设备编码:SHDXYQB4-108-C-06-CSW-RGS6250-M2-01U40_37带外地址:10.30.0.42hostnameSHDXYQB4-108-C-06-CSW-RGS6250-M2-01U40_37#ACLipaccess-listextended200010permitiphost10.30.0.136any15permitiphost10.30.0.137any1000denyipanyanylist-remarkFor......
  • B-万兆业务接入-C-07-ASW-RGS6250-01U40 leaf-1
    设备编码:SHDXYQB4-108-C-07_C-07-ASW-RGS6250-M1-01U40_37带外地址:10.30.0.43hostnameSHDXYQB4-108-C-07_C-07-ASW-RGS6250-M1-01U40_37novrfglobal-vrf!vrfdefinitionNET-managedescriptionFor_NetworkManagerd1:1address-familyipv4exit-address-familyad......
  • CF1925D Good Trip 题解
    Solution不好做的地方在于每一对朋友的友谊值是不同的,于是考虑将其统一为一个数。比较好想的就是将他们的初始友谊值提前计算,即对于每一次远足,设总情况为\(S=\frac{n\times(n-1)}{2}\),总的初始友谊值为\(w=\sum_{i=1}^{m}f_i\),假设友谊值不变,获得的期望友谊值为\(\frac{w}{......
  • ABC259Ex 题解
    Solution首先考虑暴力:枚举同种颜色的格子,假设两点为\((i,j),(x,y)\),那么从\((i,j)\)到\((x,y)\)的方案数即为\(C_{x-i+y-j}^{x-i}\)。考虑当前颜色有\(B\)个,枚举的时间复杂度为\(O(B^2)\)。考虑枚举每一种颜色,算出这种颜色到其他格子方案数,有递推方程:\(f_{i,j}=f_......
  • C++ 职工信息管理系统项目的二次开发 2252423 ywx
    来源:同学大二下的期末大作业:网上购书系统项目。运行环境:VisualStudio2022①项目结构:②运行结果截图:主菜单界面:功能选择界面:工资总额输出界面:平均工资输出界面:显示输出界面:增加正式员工界面:增加临时员工界面:修改数据界面:③主要问题:查询功能未完善,有时会出现......
  • 《Document-level Relation Extraction as Semantic Segmentation》论文阅读笔记
    原文代码摘要本文研究的是文档级关系抽取,即从文档中抽取出多个实体之间的关系。现有的方法主要是基于图或基于Transformer的模型,它们只考虑实体自身的信息,而忽略了关系三元组之间的全局信息。为了解决这个问题,本文提出了一种新的方法,它通过预测一个实体级关系矩阵来同时捕获局......
  • C++网上购书系统项目的二次开发 2252416 hzx
    1、来源:同学大二下的期末大作业:网上购书系统项目。2、运行环境:VisualStudio2019代码:点击查看代码#include"StdAfx.h"#include<iostream>#include"person.h"#include<string.h>#include"globalfunction.h"#include"book.h"#include"adm.h&......