【UGUI】2D头顶血条制作

2023-11-20

前言:

近期因为需要制作玩家和敌人头顶的2D血条,查找了很多博客,发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace-Overlay,还有应该是版本原因(我的是unity2019.1.11f1)用RecttTransform.position去获得赋值,而不用anchoredPosition的疑惑;

思路:把角色身上的血条位置转化为屏幕坐标,赋值给血条UI

实现:获得血条的放置位置,可以在玩家或敌人预制体来预作血条节点,通过Camera.main.WorldToViewportPoint()得到视窗坐标,这一步是为了解决角色消失在视野之外,而血条还在视野内;通过Camera.main.WorldToScreenPoint()得到屏幕坐标,赋值给血条UI即可;

1.设置Canvas,这是我的Canvas的RenderMode和UI ScaleMode的选择

需要注意的是Scale With Screen Size屏幕自适应性,等下计算屏幕坐标你需要用到缩放因子ScaleFactor

如果不是很清楚Render Mode 和UI Scale Mode建议先了解

2.代码实现:

​using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class hpCanvas : MonoBehaviour
{
    private RectTransform Hprect;   //UI血条
    private Transform Target;   //需要血条的目标玩家/敌人
    private Canvas canvas;  //UI血条的根节点Canvas

    private Vector3 Head_topPos = Vector3.zero; //血条节点坐标
    private Vector2 screenPos = Vector2.zero;   //转换得到的屏幕坐标

    private void Start()
    {
        Hprect = GameObject.Find("HpBar").GetComponent<RectTransform>();
        Target = GameObject.FindGameObjectWithTag("Player").transform;
        canvas = Hprect.transform.parent.GetComponent<Canvas>();
    }

    private void Update()
    {
        if (Target == null) return;
        Head_topPos = Target.Find("head_top").transform.position;
        var viewPos = Camera.main.WorldToViewportPoint(Head_topPos);//得到视窗坐标

        if (viewPos.z > 0f && viewPos.x > 0f && viewPos.x < 1f && viewPos.y > 0f && viewPos.y < 1f)
        {
            screenPos = Camera.main.WorldToScreenPoint(Head_topPos) * 1f / canvas.scaleFactor;
        }
        else
        {
            screenPos = Vector3.up * 3000f;//目标不在视野内,把它移到视野之外
        }
        Hprect.anchoredPosition = screenPos;//为血条UI的坐标赋值
    }

}
​

3.代码解释:

HpCanvas脚本是放任意物体上都可,为了方便在Start里我直接使用GameObject.Find,当然这种方式不好,你们可以通过public直接拖拽,因为UI Scale Mode我选的是Scale With Screen Size,所以当屏幕缩放后你需要相应的乘以缩放因子1f / canvas.scaleFactor;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UGUI】2D头顶血条制作 的相关文章

  • 跟随画布光标的放大镜

    我正在为我的客户设计 T 恤 我使用 html5 canvas 制作了它 衬衫设计师现在已经完成了 但他要求我添加一个放大镜 如下所示 http mlens musings it http mlens musings it 我发现了很多类似
  • delphi 文本矩形 自动换行

    我在 Delphi 7 中使用 Canvas TextRect 在屏幕上输出一些内容 我需要将文本包裹在矩形中 您需要使用带有 DT WORDBREAK 标志的 DrawText 或 DrawTextEx 请参阅中的示例
  • 如何为网页上的文本绘制添加动画效果?

    我想要一个网页 其中有一个居中的单词 我希望用动画绘制这个单词 以便页面以与我们相同的方式 写 出该单词 即它从一个点开始 随着时间的推移绘制直线和曲线 以便最终结果是一个字形 我不在乎这是否完成
  • 测量缩放画布上的文本

    我一直在努力处理文本测量和缩放画布 当画布未缩放时 getTextBounds 和measureText 可提供准确的结果 但是 当缩放画布时 这两种方法都无法提供与打印文本的实际大小相匹配的结果 为了进行测试 我使用以下 onDraw 方
  • 使用 css 和 javascript 在 div 背景中创建透明窗口

    我正在尝试在网页中实现效果 网页必须完全被带有透明窗口的背景覆盖 该窗口基本上会突出显示页面的某些页面以吸引用户的注意力 窗口的大小事先是未知的 效果必须在前端实现 所以我可以自由地使用html css和js 我不知道如何仅使用 css 来
  • 如何在两个动画画布元素之间进行通信?

    我想在两个动画画布元素之间进行通信 我使用 Adob e Animate CC 制作了两个 html5 canvas js 动画 我已将这两个元素放入一个 html 页面中 我可以成功地从这些动画中调用函数 在下面的代码中成功触发了警报 我
  • 如何防止双击时选择 HTML5 画布外部的文本?

    在我尝试过的每个浏览器中 双击 HTML5 画布会选择紧跟在画布元素后面的任何文本 我更愿意将点击次数限制在画布上 注意 我不想完全禁用文本选择 例如 像this https stackoverflow com questions 8805
  • 在 SVG 中使用变换模拟枢轴旋转

    我在 SVG 中有一个矩形 需要从特定点绕轴旋转 我能想到的最好方法是变换到枢轴的 xy 旋转角度 然后再次变换 问题是第二个变换的 xy 我认为它会在某种程度上采用 cos 和 sin 只是不确定在哪里或为什么 会旋转 90度到 也许我以
  • 为什么 Chart.js 画布不考虑容器元素的填充?

    我将 Chart js 与简单的折线图一起使用 但 Chart js 计算的宽度和高度属性似乎基于父元素的总宽度和高度 忽略填充 var options maintainAspectRatio false responsive true v
  • 使用 PixelWriter 在 JavaFX Canvas 上进行透明绘图

    有谁知道为什么使用drawImage 在Canvas上进行透明度绘制工作得很好 但在PixelWriter上却根本不起作用 我最初认为这可能与画布 上下文上的混合或其他模式 设置有关 但还没有任何运气 我需要每个像素的可变透明度 而不是整个
  • html5 canvas贝塞尔曲线获取所有点

    我喜欢从贝塞尔曲线中得到一些点 我发现 在javascript中查找三次贝塞尔曲线的所有点 https stackoverflow com questions 15397596 find all the points of a cubic
  • 如何检测形状是否被单击(HTML5 画布)?

    我正在使用画布绘制不同的形状 如矩形 三角形 六边形等lineTo方法如这个博客 http blog riacode in 2011 03 03 drawing regular polygons in html5 canvas 我只是想要一
  • HTML5 - 创建画布视口

    我有一个 2D 数组 宽 30 下 20 然而 视口仅绘制横向 15 和向下 10 的内容 我最初有一个这样的游戏 我一直在努力实现这样的目标 这是我的小提琴 http jsfiddle net sTr7q http jsfiddle ne
  • html画布绘图显示出来

    我确信这个问题在我还找不到答案之前就已经被问过 我想通过在顶部绘制另一个白色矩形来擦除黑色矩形的一部分 但是许多原始黑色矩形显示出来 就像正在平均一样 canvas document getElementById canvas contex
  • 从 url 加载图像并绘制到 HTML5 Canvas

    我在从 javascript 中的 url 加载图像时遇到问题 下面的代码可以工作 但我不想从 html 加载图像 我想使用纯 JavaScript 从 url 加载图像 var c document getElementById myCa
  • 使用画布矩形裁剪图像

    裁剪图像无法正常工作 我哪里错了 我的Xaml
  • Three.js canvas.toDataURL 有时为空

    我正在尝试使用 html2canvas js 渲染 THREE js 场景 一些覆盖的 HTML 元素 有用大多数时候 但并非一直如此 在失败的情况下 将渲染 HTML 元素 背景 覆盖层等 但不会渲染其他元素 THREE js 场景表现得
  • 无法在“CanvasRenderingContext2D”上执行“drawImage”

    我收到以下错误 未捕获的类型错误 无法在 CanvasRenderingContext2D 上执行 drawImage 提供的值不是 HTMLImageElement或HTMLVideoElement或HTMLCanvasElement或I
  • 有没有办法从画布上清除一个元素而不消除其他元素?

    我正在使用画布构建页面加载器 并使用 es6 类 虽然目前我无法使其正常工作 原因之一是我找不到清除画布的方法进展 到目前为止 这是我的代码 class Loader constructor width height this width
  • 获取 byte[]

    我有一个 html 画布 如下所示 output is a base64string of image data var oldImage new Image oldImage onload function var resizeRatio

随机推荐

  • Spring Bean的三种注入方式

    Spring Bean的三种注入方式 setter 方法 属性 注入 构造方法注入 注解注入 Resource和 Autowired 自动装配 Autowired 和 Resource Autowired Spring提供的注解 byTyp
  • SQL语言---视图操作

    文章目录 前言 一 视图 1 什么是视图 2 建立视图 3 删除视图 二 定义视图 1 建立视图 1 语法格式 2 举例讲解 例子1 建立房间视图 例子2 基于多表建立视图 例子3 基于视图建立视图 例子4 基于表达式的视图 2 删除视图
  • SpringBoot实现前端传入数值Controller层接收为枚举

    定义枚举 import com fasterxml jackson annotation JsonCreator import com fasterxml jackson annotation JsonFormat import lombo
  • ​第一本 Compose 图书上市,联想大咖教你学会 Android 全新 UI 编程

    朱江 现任联想 北京 有限公司 Android 开发工程师 从事 Android 开发工作多年 有丰富的项目经验 负责和参与开发过多款移动应用程序 同时还是多个开源项目的作者 2017 年开始在 CSDN 发表 Android 技术相关博文
  • VLAN技术原理和配置方法

    一 VLAN产生的背景 虚拟局域网 VLAN 是英文Virtual Local Area Network的缩写 随着网络规模不断扩大 网络中的广播报文也随之增加 结果就是使交换机的负担不停的加重 并且一些终端设备也会收到不希望收到的报文 V
  • 12306验证码分割

    首先要从12306上面将验证码爬取下来 保存到C images 下 from PIL import Image import os def get sub img im x y 截出方格图片 assert 0 lt x lt 3 asser
  • HTML+CSS3 5个炫酷的loading

    为了方便大家方便CV 每个loading对应一个html文件 文件下载压缩包 下载地址 https download csdn net download m0 48850204 20432352 spm 1001 2014 3001 550
  • 解决Glide加载图片闪烁的问题(感觉加载了两遍 !!!)

    今天由于项目需求的原因 需要把原来的ViewPager的长方形图片转成圆角图片 一直觉得Glide很强大 应该可以直接设置圆角图片 但是输入 之后并没有找到这个方法 顿时一大片问号飘过 下面来说说遇到的问题 1 之前Glide 3 0 都是
  • 层次聚类在MATLAB中实现

    层次聚类在MATLAB中实现 By Yang Liu 1 第一种方法 1 输入要聚类的数据 2 计算各个样本之间的欧氏距离 3 把距离化成矩阵 矩阵中的元素 X i j X ij Xij 表示第i个样本和第j个样
  • python深度学习之用lightgbm算法实现鸢尾花种类的分类任务实战源码

    本代码以sklearn包中自带的鸢尾花数据集为例 用lightgbm算法实现鸢尾花种类的分类任务 参考来源 https lightgbm readthedocs io en latest Python Intro html usr bin
  • 用户偏好分析

    1 量化用户偏好 首先将用户分类 设定用户对于产品 喜爱 的标准 比如一天浏览产品5次 计算不同分类用户 喜爱 不同产品的人数 例如 分类 A类用户 B类用户 产品1 10 40 产品2 40 10 用户偏好指某类用户更偏好某产品 例如表中
  • 机器学习实战笔记-01概览

    机器学习的主要挑战 1 数据问题 数据量不足 训练数据不具有代表性 需要可泛化的案例 注意采样偏差 数据质量差 错误 异常 缺失 形成了噪音 无关特征 特征工程 选取 提取 创建特征 2 算法问题 过拟合 噪音 模型过于复杂参数过多 欠拟合
  • 2023华为笔试机考题库【等和子数组的最小和/动态规划】

    题目描述 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • 2023-02-21 好用的一款十六进制编辑器软件Hex Editor Neo ,以十六进制字节形式查看文件有字节

    一 Hex Editor Neo是一款十六进制编辑器软件 可以在几秒钟内处理大文件的操作 能够帮助用户编辑ASCII 十六进制 十进制 float double和二进制数据的应用程序 感觉比notepad的hex查看功能更强大 用notep
  • 音视频开发开发核心知识+新手入门必看基础知识

    音视频开发是一个广泛的领域 它涉及到多个技术领域 包括音频编解码 视频编解码 媒体容器格式 流媒体传输 音视频处理等 以下是音视频开发的一些基础知识 音频编解码器 音频编解码器是将数字音频信号编码成一种压缩格式 并且能够解码压缩的音频数据以
  • android华为手机开启蓝牙耳机,华为手机如何连接蓝牙耳机? 华为手机连接蓝牙耳机方法教程介绍!...

    我们现在在用手机的时候经常会用到耳机 听歌接电话看视频都离不开耳机 但是有的时候如果觉得耳机插来插去很麻烦就可以尝试用蓝牙耳机 那么知道华为手机怎么连接蓝牙耳机吗 具体的连接方法是怎么样的呢 下面小编就给大家简单介绍一下具体的连接方法吧 连
  • 大数据面试之SQL面试题

    一 提要 作为一名数据工作人员 SQL是日常工作中最常用的数据提取 简单预处理语言 因为其使用的广泛性和易学程度也被其他岗位比如产品经理 研发广泛学习使用 本篇文章主要结合经典面试题 给出通过数据开发面试的SQL方法与实战 二 解题思路 简
  • vue3 通过自定义指令在table中滚动加载数据

    1 在utils文件中新建一个loadMore ts文件 import type Directive App from vue const debounce function func any delay any let timer any
  • Source insight 4.0 暗色主题,模仿Atom one-darkv配色方案

    我是在MAC OS 10 12下使用crossover安装的 在wine环境下装4 0有个无法解决的bug是toolbar非常的宽 所以我取消了 反正用快捷键可以代替 关于wine安装之后界面模糊的问题请参考我这个帖子http blog c
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo