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

Unity 2d UI 实时跟随场景3d物体

2d UI 实时跟随场景3d物体位置,显示 3d 物体头顶信息,看起来像是场景中的3dUI,实质是2d UI

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
/// <summary>
/// 2d UI 实时跟随场景3d物体位置,显示 3d 物体头顶信息,看起来像是场景中的3dUI,实质是2d UI
/// </summary>
public class UIFollow3DGameObject : MonoBehaviour
{public Vector3 targetPos;private Camera mainCamera;private CanvasGroup canvas;bool _isInCamera = true; //是否在摄像机视野范围内void Awake(){mainCamera = Camera.main;canvas = GetComponent<CanvasGroup>();if (canvas == null){canvas = gameObject.AddComponent<CanvasGroup>();}_isInCamera = IsInCamera(mainCamera,targetPos);}/// <summary>/// 判断是否在摄像机视野范围内/// </summary>/// <returns></returns>bool IsInCamera(Camera camera,Vector3 pos){//转化为视角坐标Vector3 viewPos = camera.WorldToViewportPoint(pos);// z<0代表在相机背后if (viewPos.z < 0) return false;//太远了!看不到了!if (viewPos.z > camera.farClipPlane)return false;// x,y取值在 0~1之外时代表在视角范围外;if (viewPos.x < 0 || viewPos.y < 0 || viewPos.x > 1 || viewPos.y > 1) return false;return true;}void LateUpdate(){if (IsInCamera(mainCamera, targetPos) != _isInCamera){Debug.Log("改变是否在视野范围内");_isInCamera = IsInCamera(mainCamera, targetPos);MaskableGraphic[] childs = GetComponentsInChildren<MaskableGraphic>();foreach (var item in childs){item.enabled = _isInCamera;}if (_isInCamera == false) return;}if (targetPos != null && mainCamera != null){ResetPos();if (Time.frameCount % 5 == 0){ResetAlpha();}}}void ResetPos(){transform.position = mainCamera.WorldToScreenPoint(targetPos);}void ResetAlpha(){if (transform.position.z > 0f && canvas.alpha < 0.1f){canvas.alpha = 1f;}else if (transform.position.z < 0f && canvas.alpha > 0.9f){canvas.alpha = 0f;}}}

http://www.lryc.cn/news/465499.html

相关文章:

  • 全方面熟悉Maven项目管理工具(二)坐标、pom.xml文件的解读!
  • php常用设计模式之单例模式
  • 一文搞懂Android主题和样式
  • 360与重庆科技大学战略携手,为数字中国建设输送实战人才
  • 基于异常合成的图像异常检测方法
  • 机器学习方向在算法优化上有哪些创新点?
  • 基于yolov8的道路交通事故检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • HttpUtils 详解
  • 云计算第四阶段: cloud二周目 07-08
  • 智能合约开发工具Remix
  • YYF桌面 1.2 | 个性化桌面体验,清爽美观。
  • 【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)
  • uni-app录音功能
  • C语言【调试】(个人笔记版)
  • 连锁收银系统
  • 5.2024.10.21
  • 前端Socket互动小游戏开发体验分享
  • react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:
  • 双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐
  • 比亚迪车机安装第三方应用教程
  • 移动零---双指针法
  • MoeCTF 2024 ---Misc方向WP
  • 【我的 RT 学习手札】信息收集
  • CMake变量:CMAKE_FIND_LIBRARY_SUFFIXES
  • 在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例
  • ARM在嵌入式开发中的作用有哪些?
  • -webkit-box-orient属性丢失?
  • openKylin系统SSH服务配置结合cpolar轻松实现开放麒麟远程连接
  • 我的世界之合成
  • java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)