Unity中实现鼠标移动到三维物体上显示信息提示标签

一、实现功能

实现鼠标移动到三维物体上显示带有该物体名称的标签;且标签显示时点击标签或者点击鼠标右键都可以显示该三维物体的详细信息面板;鼠标移除三维物体时关闭标签。项目工程(采用Unity2019.3.06f1开发)

效果图如下:

二、实现思路

①准备信息提示标签,实现标签显示在三维物体顶部居中位置;且给该标签添加鼠标点击事件显示该三维物体的详细信息面板。

②准备详细信息面板,实现显示三维物体的详细信息。

②编写鼠标触发事件(移入、覆盖、移除)分别对应显示、显示、关闭标签。

三、实现内容

/***
*	Title:"三维可视化" 项目
*		主题:【视图层】信息标签
*	Description:
*		功能:
*		    1、显示信息标签在三维物体上
*		    2、关闭信息标签
*	Date:2020
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace View
{
	public class View_InfoLable : MonoBehaviour
	{
        #region   基础参数

        #region   UI参数
        //信息标签面板
        private static Transform _Image_InfoLable;
        //信息标签的触发区域
        private static Transform _TriggerArea;
        //信息标签文本
        private static Text _Text_Name;


        //信息标签整体偏移量
        private static float _OffsetY = 0;

        #endregion

        #region   信息参数
        //设备名称
        public static string eqName = null;
        //设备类型名称
        public static string eqTypeNumber = null;

        #endregion

        #endregion

        #region   Unity自带方法

        void Start()
        {
            //初始化
            Init();

            //注册按钮事件
            RegisterBtnEvent();

        }

        #endregion


        #region   公有方法

        /// <summary>
        /// 显示信息标签在三维物体上
        /// </summary>
        /// <param name="tra">三维物体</param>
        /// <param name="objName">物体名称</param>
        public static void ShowInfoLable(Transform tra, string objName)
        {
            if (tra != null)
            {
                Camera mainCamera = GameObject.Find("Main Camera")?.GetComponent<Camera>();
                Vector3 screenPos = mainCamera.WorldToScreenPoint(tra.position);
                Vector3 offsetPos = new Vector3(0, _OffsetY, 0);
                screenPos += offsetPos;
                _Image_InfoLable.transform.GetComponent<RectTransform>().anchoredPosition3D = screenPos;
                _Text_Name.text = objName;
                _Image_InfoLable.gameObject.SetActive(true);
            }

        }


        /// <summary>
        /// 关闭信息标签
        /// </summary>
        public static void CloseInfoLable()
        {
            _Image_InfoLable.gameObject.SetActive(false);
        }

        #endregion


        #region   私有方法

        /// <summary>
        /// 初始化
        /// </summary>
        private void Init()
        {
            _Image_InfoLable = this.transform;
            _OffsetY = _Image_InfoLable.GetComponent<Image>().mainTexture.height / 2f;
            foreach (Transform child in this.transform)
            {
                switch (child.name)
                {
                    case "TriggerArea":
                        _TriggerArea = child;
                        child.gameObject.SetActive(true);
                        break;
                    case "Text_Name":
                        _Text_Name = child.GetComponent<Text>();
                        child.gameObject.SetActive(true);
                        break;

                    default:
                        break;
                }

            }

            //关闭该信息标签
            this.gameObject.SetActive(false);
        }

        /// <summary>
        /// 注册按钮事件
        /// </summary>
        private void RegisterBtnEvent()
        {
            if (_TriggerArea!=null)
            {
                Button triggerBtn = _TriggerArea.GetComponent<Button>();
                if (triggerBtn==null)
                {
                    _TriggerArea.gameObject.AddComponent<Button>();
                }
                _TriggerArea.gameObject.GetComponent<Button>().onClick.RemoveAllListeners();
                _TriggerArea.gameObject.GetComponent<Button>().onClick.AddListener(LaleBtnOnClick);
            }
        }

        /// <summary>
        /// 标签按钮点击事件
        /// </summary>
        private void LaleBtnOnClick()
        {
            //显示物体详细信息面板
            View_DetailInfoPanel.ShowDetailPanel(View_MouseTriggerEventOfObj.objName);
        }


        #endregion





    }//Class_end
}
/***
*	Title:"三维可视化" 项目
*		主题:【视图层】设备信息面板
*	Description:
*		功能:
*		    1、初始化设备信息面板
*		    2、显示不同物体的信息内容
*	Date:2020
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace View
{
	public class View_DetailInfoPanel : MonoBehaviour
	{
        #region   基础参数
        //详细信息面板
        private static Transform _Image_DetailInfo;
        //标题名称
        private static Text _Text_TitleName;

        #endregion


        #region   Unity自带方法
        void Start()
		{
            //初始化
            Init();
		}

        #endregion


        #region   公有方法

        /// <summary>
        /// 显示详细信息面板
        /// </summary>
        /// <param name="titleName">标题名称</param>
        public static void ShowDetailPanel(string titleName)
        {
            _Image_DetailInfo.gameObject.SetActive(true);
            _Text_TitleName.text = titleName;
        }

        /// <summary>
        /// 关闭详细信息面板
        /// </summary>
        public static void CloseDetailPanel()
        {
            _Image_DetailInfo.gameObject.SetActive(false);
        }

        #endregion


        #region   私有方法
        /// <summary>
        /// 初始化
        /// </summary>
        private void Init()
        {
            _Image_DetailInfo = this.transform;
            _Image_DetailInfo.gameObject.SetActive(false);

            foreach (Transform chid in this.transform)
            {
                switch (chid.name)
                {
                    case "Text_TitleName":
                        _Text_TitleName = chid.GetComponent<Text>();
                        chid.gameObject.SetActive(true);
                        break;

                    default:
                        break;
                }
            }
        }


        #endregion



    }//Class_end
}
/***
*	Title:"三维可视化" 项目
*		主题:【视图层】鼠标触发事件
*	Description:
*		功能:(注意:三维物体需要有碰撞体)
*		    1、鼠标移入、覆盖、移除物体事件检测
*		    2、鼠标移入三维物体显示信息标签和该物体的名称
*		    3、鼠标覆盖三维物体,点击信息标签或点击鼠标右键显示物体的详细信息面板
*	Date:2020
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace View
{
	public class View_MouseTriggerEventOfObj : MonoBehaviour
	{
        #region   基础参数
        //鼠标停留开关
        private bool mouseStay = false;


        //物体名称
        public static string objName;
        #endregion


        #region   Unity自带方法
        //鼠标进入
        private void OnMouseEnter()
        {
            mouseStay = true;

            //指定物体名称
            GetCurObjName();

            //显示标签
            View_InfoLable.ShowInfoLable(this.transform, this.name);
        }

        //鼠标覆盖
        private void OnMouseOver()
        {
            mouseStay = true;
            //指定物体名称
            GetCurObjName();
        }

        //鼠标退出
        private void OnMouseExit()
        {
            mouseStay = false;
            //关闭标签
            View_InfoLable.CloseInfoLable();
        }

        private void Update()
        {
            if (mouseStay)
            {
                //按下鼠标左键
                if (Input.GetMouseButtonDown(1))
                {
                    //显示物体详细信息面板
                    View_DetailInfoPanel.ShowDetailPanel(this.name);

                }
            }
        }
        #endregion


        #region   公有方法

        #endregion


        #region   私有方法
        /// <summary>
        /// 指定物体名称
        /// </summary>
        private void GetCurObjName()
        {
            objName = this.name;
        }

        #endregion

    }//Class_end
}

最后分别把对应的脚本添加在面板上即可如下所示:

 

 

 

 

 

 

  • 10
    点赞
  • 74
    收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 13

打赏作者

牛奶咖啡13

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值