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

标签预制体上的组件

using UnityEngine;
using UnityEngine.UI;// 挂载在标签预制体上的组件
public class LabelItem : MonoBehaviour
{[Header("组件引用")]public Text textComponent;public RectTransform rectTransform;public CanvasGroup canvasGroup;[Header("目标对象")]public Transform targetTransform;public MeshRenderer targetRenderer;public LabelTarget labelTarget;private void Awake(){// 自动获取组件引用if (rectTransform == null)rectTransform = GetComponent<RectTransform>();if (textComponent == null)textComponent = GetComponentInChildren<Text>();if (canvasGroup == null)canvasGroup = GetComponent<CanvasGroup>();}/// <summary>/// 初始化标签/// </summary>public void Initialize(Transform target, MeshRenderer renderer = null, LabelTarget labelTarget = null, string labelText = ""){targetTransform = target;targetRenderer = renderer;this.labelTarget = labelTarget;string finalText = labelText;Color textColor = Color.white;// 如果存在LabelTarget,使用其设置if (labelTarget != null){finalText = labelTarget.GetLabelText();textColor = labelTarget.labelColor;}else if (target != null && string.IsNullOrEmpty(finalText)){finalText = target.name;}if (textComponent != null){textComponent.text = finalText;textComponent.color = textColor;}}/// <summary>/// 更新标签位置/// </summary>/// <summary>/// 更新标签位置/// </summary>public void UpdatePosition(Camera camera, Vector3 globalOffset, bool shouldShowByDistance = true){if (targetTransform == null || camera == null) return;Vector3 finalOffset = globalOffset;Vector2 screenOffset = Vector2.zero;// 如果存在LabelTarget,使用其偏移设置if (labelTarget != null){finalOffset += labelTarget.GetWorldOffset();screenOffset = labelTarget.screenOffset;}Vector3 worldPosition = targetTransform.position + finalOffset;Vector3 screenPosition = camera.WorldToScreenPoint(worldPosition);// 检查点是否在相机前方且不在相机裁剪平面之后if (screenPosition.z > 0 && screenPosition.z < camera.farClipPlane){// 正确应用屏幕偏移screenPosition.x += screenOffset.x;screenPosition.y += screenOffset.y;// 获取RectTransform的尺寸用于边界计算Vector2 labelSize = rectTransform != null ? rectTransform.sizeDelta : Vector2.zero;// 限制标签在屏幕边界内,考虑标签自身大小float halfWidth = labelSize.x * 0.5f;float halfHeight = labelSize.y * 0.5f;screenPosition.x = Mathf.Clamp(screenPosition.x, halfWidth, Screen.width - halfWidth);screenPosition.y = Mathf.Clamp(screenPosition.y, halfHeight, Screen.height - halfHeight);}else{// 点在相机后方或超出远裁剪面,移到屏幕外screenPosition = new Vector3(-1000, -1000, 0);}if (rectTransform != null){rectTransform.position = screenPosition;}// 更新标签可见性(淡入淡出效果)UpdateVisibility(camera, globalOffset, shouldShowByDistance);}/// <summary>/// 更新标签可见性/// </summary>private void UpdateVisibility(Camera camera, Vector3 globalOffset, bool shouldShowByDistance){if (canvasGroup == null) return;bool shouldShow = shouldShowByDistance;// 检查LabelTarget的显示条件(除了距离)if (labelTarget != null && shouldShow){// 临时禁用距离检查,因为我们已经从外部处理了bool originalDistanceCheck = labelTarget.useDistanceCheck;labelTarget.useDistanceCheck = false;shouldShow = labelTarget.ShouldShowLabel(camera, globalOffset);// 恢复原始设置labelTarget.useDistanceCheck = originalDistanceCheck;}// 平滑过渡float targetAlpha = shouldShow ? 1f : 0f;canvasGroup.alpha = Mathf.Lerp(canvasGroup.alpha, targetAlpha, Time.deltaTime * 5f);//  canvasGroup.blocksRaycasts = shouldShow=false;canvasGroup.blocksRaycasts =false;canvasGroup.interactable = shouldShow;}/// <summary>/// 检查目标渲染器是否可见(根据设置)/// </summary>public bool IsRendererVisible(bool includeInactive){if (targetRenderer == null) return false;return includeInactive || targetRenderer.enabled;}/// <summary>/// 设置标签文本/// </summary>public void SetText(string text){if (textComponent != null){textComponent.text = text;}}/// <summary>/// 设置标签激活状态/// </summary>public void SetActive(bool active){gameObject.SetActive(active);if (!active){Reset();}else if (canvasGroup != null){canvasGroup.alpha = 1f;}}/// <summary>/// 重置标签状态/// </summary>public void Reset(){targetTransform = null;targetRenderer = null;labelTarget = null;if (textComponent != null){textComponent.text = "";textComponent.color = Color.white;}if (canvasGroup != null){canvasGroup.alpha = 1f;}}
}
http://www.dtcms.com/a/471109.html

相关文章:

  • cms免费企业网站湖南网站模板建站
  • 【流氓软件】流氓软件及处理方法
  • 网站开发职业怎么经营网店生意才会好
  • 自动化脚本矩阵运营
  • 《Effective Java》第一条:用静态工厂方法代替构造器
  • 怎么做可以访问网站连接加密互联网营销模式
  • Diff-Shadow阴影去除
  • 怎么去接网站来做天津手机网站建设制作
  • 引擎搜索入口aso优化重要吗
  • 做外贸 需要做网站吗知名网站定制报价
  • 四川刚刚发布的最新新闻seo标题优化
  • 一文读懂 Flink Exactly-Once 保证机制深度解析
  • wordpress批量发布内容好的seo平台
  • Unity框架YouYouFramework学习第1篇:游戏入口
  • 专业的建设网站服务公司.网站建设课程设计
  • lnmp利用wordpress网站内链优化策略
  • 宁波做网站的哪个好logo设计多少钱
  • 昂瑞微:科创板逐浪者,射频“芯”征程的领航旗舰
  • Cyanine5.5-PEG-OH,在近红外区发射可用于活体成像
  • 网站注册建设外网代理服务器网站
  • Python文件访问
  • 静态网站设计找国外公司做网站
  • 建网站安全大型科技网站建设
  • Mysql初阶第六讲:Mysql内置函数
  • 怒江州建设局网站企业备案网站花溪村镇建设银行网站
  • 网站搭建合同模板2024很有可能再次封城吗
  • Terminal-Bench:AI 代理终端任务基准测试框架正式发布
  • 国测开始整顿CISP乱价现象,对我们有什么影响呢
  • vps搭建asp网站如何做营销型手机网站优化
  • kanass入门到实战(15) - 如何管理项目集