UI跟随物体的关键是什么?重要吗?

在这里插入图片描述

引言

UI的跟随效果

在游戏开发中,UI的跟随效果是提高用户体验和交互性的重要组成部分。

本文将深入介绍如何创建一个高效且可定制的UI跟随目标组件,并分享一些最佳实践。

本文源工程在文末获取,小伙伴们自行前往。

UI跟随物体的关键

UI跟随物体的关键在于确保UI元素能够根据物体的位置和状态进行实时调整,以保持二者的相对关系。

以下是实现UI跟随物体的关键要点:

  1. 实时更新位置信息: UI元素需要获取物体的实时位置信息。在游戏引擎中,通常通过获取物体的世界坐标来实现。这确保了UI元素能够跟随物体的移动、旋转和缩放等变换。

  2. 坐标转换: 物体的位置信息通常是在游戏世界坐标系中表示的,而UI元素则通常在UI坐标系中进行布局。因此,需要进行坐标转换,将物体的世界坐标转换为UI坐标,以正确定位UI元素。

  3. 灵活的偏移和调整: 提供一定的灵活性,允许开发者根据需要设置偏移、调整或添加其他参数,以确保UI元素的位置与物体之间的相对关系满足特定设计或交互需求。

  4. 优化性能: 对UI跟随逻辑进行性能优化是关键。使用合适的更新频率、异步更新机制来确保性能良好。

  5. 考虑遮挡关系: 在某些情况下,物体与UI元素之间可能存在遮挡关系。考虑使用高级的碰撞检测算法或遮挡剔除策略,以确保UI元素在显示时不会被物体遮挡。

  6. 添加动画和缓动效果(可选): 为了提高用户体验,可以考虑在UI跟随过程中添加动画或缓动效果。这使得UI元素在跟随物体的过程中更加平滑和自然。

代码解析

import { _decorator, Component, Node, CameraComponent, v3 } from 'cc';
const { ccclass, property } = _decorator;@ccclass('UIFollowTarget')
export class UIFollowTarget extends Component {@property({ type: Node })target: Node | null = null;@property({ type: CameraComponent })gameCamera: CameraComponent | null = null;private _targetPos = v3();private _lastUpdateTime = Date.now();update(deltaTime: number) {let now = Date.now();if (now - this._lastUpdateTime < 100) {return;}this._lastUpdateTime = now;this.target.getWorldPosition(this._targetPos);this.gameCamera.convertToUINode(this._targetPos, this.node.parent, this._targetPos);this.node.position = this._targetPos;}
}

导入模块

import { _decorator, Component, Node, CameraComponent, v3 } from 'cc';
const { ccclass, property } = _decorator;

在这一部分,我们从Cocos Creator的模块中导入了一些基本的类和对象,包括 _decoratorComponentNodeCameraComponentv3 等。这些模块提供了在Cocos Creator中创建组件和进行游戏开发所需的基本工具。

组件定义与属性声明

@ccclass('UIFollowTarget')
export class UIFollowTarget extends Component {@property({ type: Node })target: Node | null = null;@property({ type: CameraComponent })gameCamera: CameraComponent | null = null;

在这一部分,我们使用装饰器 @ccclass 来声明一个名为 UIFollowTarget 的组件,并继承自 Component。同时,通过 @property 装饰器声明了两个属性:targetgameCamera。这些属性将在编辑器中以可视化的方式进行配置,target 表示UI要跟随的目标节点,而 gameCamera 表示游戏中的摄像机。

组件私有变量和更新方法

private _targetPos = v3();
private _lastUpdateTime = Date.now();update(deltaTime: number) {let now = Date.now();if (now - this._lastUpdateTime < 100) {return;}this._lastUpdateTime = now;this.target.getWorldPosition(this._targetPos);this.gameCamera.convertToUINode(this._targetPos, this.node.parent, this._targetPos);this.node.position = this._targetPos;
}

这部分代码定义了组件的私有变量 _targetPos_lastUpdateTime_targetPos 用于存储目标节点的世界坐标,而 _lastUpdateTime 记录上一次更新的时间戳。

update 方法是一个在每一帧被调用的方法,用于更新UI元素的位置。通过控制更新的频率,确保不会过于频繁地执行UI的位置更新逻辑。

update 方法中,首先获取目标节点的世界坐标,然后使用摄像机的 convertToUINode 方法将目标坐标转换为UI坐标。最后,将UI元素的位置设置为转换后的坐标,实现UI的跟随效果。

效果演示

在这里插入图片描述

结语

通过以上代码解析,我们了解了在Cocos Creator中如何实现一个简单的UI跟随目标组件。

这个组件通过获取目标节点的世界坐标,并利用摄像机的坐标转换功能,将目标坐标转换为UI坐标,从而实现了UI元素与目标物体的关联效果。

本文源工程可通过私信UIFollowTarget获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MQ回顾之kafka速通

不定期更新 官网概念自查 官网&#xff1a;Apache Kafka kafka结构 和kafka相关的关键名词有&#xff1a;Producer、Broker、Topic、Partition、Replication、Message、Consumer、Consumer Group、Zookeeper。 各名词解释已经泛滥&#xff0c;如果你想看点不一样的&#xf…

A 股承担着一个什么功能?

​A 股&#xff1a;中国资本市场的核心角色 A 股&#xff0c;即人民币普通股票&#xff0c;在中国资本市场中扮演着至关重要的角色。它不仅是投资者买卖交易的场所&#xff0c;更是中国经济发展的重要引擎。 首先&#xff0c;A 股为中国的企业提供了融资平台。中国有着庞大的…

从Elasticsearch来看分布式系统架构设计

从Elasticsearch来看分布式系统架构设计 - 知乎 分布式系统类型多&#xff0c;涉及面非常广&#xff0c;不同类型的系统有不同的特点&#xff0c;批量计算和实时计算就差别非常大。这篇文章中&#xff0c;重点会讨论下分布式数据系统的设计&#xff0c;比如分布式存储系统&…

Zookeeper3.5.7源码分析

文章目录 一、Zookeeper算法一致性1、Paxos 算法1.1 概述1.2 算法流程1.3 算法缺陷 2、ZAB 协议2.1 概述2.2 Zab 协议内容 3、CAP理论 二、源码详解1、辅助源码1.1 持久化源码(了解)1.2 序列化源码 2、ZK 服务端初始化源码解析2.1 启用脚本分析2.2 ZK 服务端启动入口2.3 解析参…

鸿蒙入门学习的一些总结

前言 刚开始接触鸿蒙是从2023年开始的&#xff0c;当时公司在调研鸿蒙开发板能否在实际项目中使用。我们当时使用的是OpenHarmony的&#xff0c;基于DAYU/rk3568开发板&#xff0c;最开始系统是3.2的&#xff0c;API最高是API9&#xff0c;DevecoStudio 版本3.1的。 鸿…

excel统计分析——Duncan法多重比较

参考资料&#xff1a;生物统计学 Duncan法又称新复极差检验法&#xff0c;是对S-N-K法的改进&#xff0c;根据秩次距m对临界值的显著水平α进行调整&#xff0c;是最常用的多重比较方法。最小显著极差表示如下&#xff1a; 其中&#xff0c;m为秩次距&#xff0c;df为方差分析中…

【软件测试】学习笔记-制定一份有效的性能测试方案

什么是性能测试方案&#xff1f; 性能测试方案&#xff0c;通俗一点说就是指导你进行性能测试的文档&#xff0c;包含测试目的、测试方法、测试场景、环境配置、测试排期、测试资源、风险分析等内容。一份详细的性能测试方案可以帮助项目成员明确测试计划和手段&#xff0c;更…

第二集《闻法仪轨》

请大家打开讲义第三面&#xff0c;甲二、于法、法师发起承事。 我们身为一个大乘的佛弟子&#xff0c;我们这一念明了的心&#xff0c;在一生当中&#xff0c;会遇到很多很多的佛法&#xff0c;也会遇到很多很多的法师&#xff0c;但不是所有的法师跟佛法对我们都是帮助的&…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

概念性——数据库简介

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 概念性——数据库简介 介绍 数据对于当今许多应用程序和网站的运行至关重要。对热门视频的评论、多人游戏中分…

centos手动下载配置redis并自启动

有些服务器不能自动安装配置redis&#xff0c;仓库找不到之类的问题&#xff0c;就需要手动下载配置redis&#xff0c;记录下&#xff0c;方便以后使用&#xff08;ps&#xff0c;如果报错可能是gcc缺失&#xff09; 1、下载 Redis 源码包&#xff1a;访问 Redis 官网或可信的…

基于时空模型的视频异常检测

假设存在一个运动区域&#xff0c;规则要求只能进行特定的运动项目。 出于安全原因或因为业主不喜欢而禁止进行任何其他活动:)。 我们要解决的问题是&#xff1a;如果我们知道正确行为的列表&#xff0c;我们是否可以创建一个视频监控系统&#xff0c;在出现不常见的行为发出通…

37、Flink 的CDC 格式:debezium部署以及mysql示例(1)-debezium的部署与示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

UE5 Chaos系统 学习笔记

记得开插件&#xff1a; 1、锚点场 在锚点场范围内的物体静止且不被其他力场损坏 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止模拟物理 4、ForceAndStrain 破裂效果的力 5、ForceAndStrainFallOff 破裂效果的力&#xff0c;但是…

浅析Redis②:命令处理之epoll实现(中)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库&#xff0c;其重要性不言而喻&#xff0c;作为普通开发者&#xff0c;我们在日常开发中使用Redis&#xff0c;主要聚焦于Redis的基层数据结构的命令使用&#xff0c;很少会有人对Redis的内部实现机制进行了解&#xff0c…

HarmonyOS应用模型概述

应用模型的构成要素 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。 HarmonyOS应用模型的构成要…

leetcode:2859. 计算 K 置位下标对应元素的和(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位 。 例如&#xf…

Vulnhub靶机:FunBox 7

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 7&#xff08;10.0.2.34&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/funb…

Ubuntu apt update提示:GPG 缺少公钥解决方法

Ubuntu 运行: sudo apt update #or sudo apt-get update提示&#xff1a;GPG 缺少公钥以及404 Not Found&#xff0c;如下面所示&#xff0c;有mirror.bwbot.org 和ppa.launchpadcontent.net两个源出现问题。 好多网友用后面的方法解决 真正解决&#xff1a;gpg --verify sig:…

vue超链接传值、查看页面以及父子传值

<el-table-column label"电表编码" align"center" width"120" prop"electricalNum" ><template slot-scope"scope"><div style"text-align: left"><router-link :to"/equipment/electr…