当前位置: 首页 > news >正文

cocos中实现3d人物角色头顶信息跟随功能,UI跟随3D/2D对象移动,例如昵称血条跟随人物移动

这次没有使用cocos自己的UICoordinateTracker,而是使用了自己写的逻辑,因为cocos的组件问题真的挺多的,就最开始使用角色控制器的时候,检测碰撞墙壁有时候竟然碰到墙之后不会动了.....这次使用UICoordinateTracker这个组件也是很不灵活,就像上篇文章写的那样,偏差很大,这次索性也自己写了一个,效果如图所示。

添加UI节点

创建一个label的ui节点,用于显示昵称,要显示血条等也是一样的,添加一个Sprite节点

创建跟随脚本

脚本逻辑如下:

获取3D对象的世界坐标(World Position)

将3D坐标转换为屏幕坐标(Screen Position)

将屏幕坐标转换为UI坐标(通常是Canvas下UI节点坐标)

设置UI节点位置,实现UI跟随3D对象移动

import {_decorator,Camera,Component,Node,UITransform,Vec3,
} from 'cc'
const { ccclass, property } = _decorator@ccclass('follow')
export class follow extends Component {@property({ type: Node })playerNode: Node = null@property({ type: Node })uiNode: Node = null // 血条/昵称UI节点@property({ type: Camera })mainCamera: Camera = null // 3D摄像机@property({ type: Node })canvasNode: Node = null // Canvas节点// 头顶偏移private _offset: Vec3 = new Vec3(0, 2, 0)update(dt: number) {if (!this.playerNode ||!this.uiNode ||!this.mainCamera ||!this.canvasNode)return// 1. 计算头顶世界坐标const headWorldPos = this.playerNode.getWorldPosition().add(this._offset)// 2. 世界坐标转屏幕坐标const screenPos = new Vec3()this.mainCamera.worldToScreen(headWorldPos, screenPos)console.log('screenPos', screenPos)// 3. 屏幕坐标转UI坐标const canvasUITrans = this.canvasNode.getComponent(UITransform)const widgetPos = canvasUITrans.convertToNodeSpaceAR(new Vec3(screenPos.x, screenPos.y, 0))console.log('widgetPos', widgetPos)// 4. 设置UI节点位置this.uiNode.setPosition(widgetPos)}
}

关联到节点

将节点关联到脚本上,PlayerNode就是你的角色节点,UINode就是昵称或血条节点,Main Camera就是主摄象机,CancasNode就是Canvas节点

特别注意

还有非常重要的一点就是屏幕分辨率,一定不要设置缩放,不然就会有移动偏差,这个问题困扰了我好久........后面还需要优化适配不同的分辨率

http://www.dtcms.com/a/290394.html

相关文章:

  • 开启PHP编程之旅:从基础语法到项目实践
  • QT6 源,七章对话框与多窗体(6) 颜色对话框 QColorDialog :本类的属性,信号函数,静态成员函数,以及源代码
  • 什么是GNN?——聚合、更新与循环
  • 时间管理的视觉艺术 《时间格子计算器》H5案例赏析
  • 图立得-html纯前端图片拾色器V202507
  • js迭代器
  • 【前端状态更新与异步协调完全指南:React、Vue架构原理与复杂业务场景实战】
  • React-useEffect的闭包陷阱(stale closure)
  • MySQL的在线模式学习笔记
  • HarmonyOS之UIAbility简介
  • redis 如何优雅地进行键设计?
  • 【Spark征服之路-3.6-Spark-SQL核心编程(五)】
  • Spring @RequestBody注解详解与实践
  • oracle 数据库中,将几张表的数据按指定日期范围实时同步至同一个数据库的备份表中。
  • Oracle 数据库共享池与大池调优指南
  • 深度学习 -- 梯度计算及上下文控制
  • HTTP性能优化实战技术详解(2025)
  • day058-docker常见面试题与初识zabbix
  • SpringDoc 基本使用指南
  • 三维空间中的向量与坐标系变换:数学原理与C++实现
  • 安装pytorch(cpu版)
  • k8s知识点
  • WSL如何安装docker?
  • 低代码/无代码平台如何重塑开发生态
  • 141 个 LangChain4j Maven 组件分类解析、多场景实战攻略
  • 飞算科技:以原创技术为翼,赋能产业数字化转型
  • 前端,demo操作,增删改查,to do list小项目
  • 笼子在寻找一只鸟:解读生活的隐形陷阱
  • delphi disqlite3 操作sqlite
  • Go语言实战案例-简易日志记录器