当前位置: 首页 > 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.lryc.cn/news/594586.html

相关文章:

  • 【VASP】机器学习势概述
  • 智能合约安全 - 重入攻击 - 常见漏洞(第一篇)
  • taro微信小程序的tsconfig.json文件说明
  • Taro 本地存储 API 详解与实用指南
  • Typecho目录树插件开发:从后端解析到前端渲染全流程
  • 使用pymongo进行MongoDB的回收
  • Kali MSF渗透Windows 11电脑
  • Taro 路由相关 API 详解与实战
  • taro+pinia+小程序存储配置持久化
  • 微美全息(WIMI.US)聚焦多元哈希锁机制,为链上链下数据可信交互按下加速键
  • 快速入门SwiftUI
  • 【大模型】结构化提示词:让AI高效完成复杂任务的“编程语言”
  • JavaEE初阶第十期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(八)
  • 经典神经网络(vgg resnet googlenet)
  • LiteCoT:难度感知的推理链压缩与高效蒸馏框架
  • Apache IoTDB(2):时序数据库 IoTDB 集群安装部署的技术优势与适用场景分析
  • 卫朋:华为流程体系拆解系列之高阶流程L1-L3分解三阶七步法
  • 深入详解随机森林在放射治疗计划优化中的应用及实现细节
  • 【Elasticsearch】BM25的discount_overlaps参数
  • Qt中的网络通信
  • Lua:小巧而强大的脚本语言,游戏与嵌入式的秘密武器
  • 搭建前端页面,介绍对应标签
  • wordle game(猜词游戏)小demo【react + ts】
  • 搭建种草商城框架指南
  • Protein FID:AI蛋白质结构生成模型评估新指标
  • MCP协议解析:如何通过Model Context Protocol 实现高效的AI客户端与服务端交互
  • 基础神经网络模型搭建
  • 【Linux】3. Shell语言
  • 双8无碳小车“cad【17张】三维图+设计说名书
  • XTTS实现语音克隆:精确控制音频格式与生成流程【TTS的实战指南】