0


Unity实现游戏里鼠标悬停在物体处显示UI提示(介绍、名称等信息)的一种方法(可配置的xml文件形式)

Unity实现鼠标悬停物体处显示UI提示

思路

这里主要是通过xml文件的形式保存物体的信息,再编写代码去解析这些个物体的信息,如xml中的一个节点MouseOver节点保存了一个物体的路径和物体的名称,那么解析的时候我们就可以通过GameObject.Find()方法找到这个物体,并给它添加鼠标事件,当鼠标悬停在物体处时,触发鼠标事件函数,就可以显示该物体的名称了,这里使用到了Unity中三个鼠标事件函数:OnMouseEnter()、OnMouseOver()和OnMouseExit()。

搭建demo场景和配置xml文件

在这里插入图片描述
添加一张Image作为底图,并添加一个Text文本作为子物体用来显示物体的信息的。Image初始时设置为隐藏,即在Inspector取消勾选;GameObject下存放三个物体,必须要添加碰撞体,可视物体情况选择添加不同的碰撞体,否则无法触发鼠标事件!

xml文件节点格式如下:
在这里插入图片描述
Path鼠标表示该物体在Hierarchy上的路径,InnerText表示该物体名称。

脚本实现

ModelEventListen脚本:

usingUnityEngine;usingSystem;publicclassModelEventListen:MonoBehaviour{//鼠标事件的委托publicAction<GameObject> onEnter;publicAction<GameObject> onOver;publicAction<GameObject> onExit;/// <summary>/// 鼠标停留/// </summary>publicvoidOnMouseOver(){if(onOver!=null){onOver(gameObject);}}/// <summary>/// 鼠标停留/// </summary>publicvoidOnMouseEnter(){if(onEnter!=null){onEnter(gameObject);}}/// <summary>/// 鼠标移出/// </summary>publicvoidOnMouseExit(){if(onExit!=null){onExit(gameObject);}}/// <summary>/// Get方法,给物体添加鼠标监听的脚本/// </summary>/// <param name="obj"></param>/// <returns></returns>publicstaticModelEventListenGet(GameObject obj){if(obj ==null)returnnull;ModelEventListen listener = obj.GetComponent<ModelEventListen>();if(listener==null){
            listener = obj.AddComponent<ModelEventListen>();}return listener;}}

Panel_MouseOver脚本:

usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingSystem.Xml;usingUnityEngine.UI;publicclassPanel_MouseOver:MonoBehaviour{staticTransform showImg;//显示的UI底图privatevoidStart(){
        showImg = transform.Find("Image");string filePath ="file://"+Application.dataPath +"/XML/MouseOver.xml";//xml文件路径StartCoroutine(LoadingXml(filePath));}IEnumeratorLoadingXml(string path){yieldreturnnull;using(WWW www=newWWW(path)){yieldreturn www;XmlDocument doc =newXmlDocument();
            doc.LoadXml(www.text);for(int i =0; i < doc.FirstChild.ChildNodes.Count; i++){newMouseOver(doc.FirstChild.ChildNodes[i]);//遍历为每个节点的物体添加鼠标事件}}}publicclassMouseOver{privatestring showText;publicMouseOver(XmlNode node){GameObject obj = GameObject.Find(node.Attributes["Path"].InnerText);if(obj !=null){//为物体添加鼠标监听函数的脚本,并注册回调函数
                ModelEventListen.Get(obj).onEnter = OnEnter;
                ModelEventListen.Get(obj).onOver = OnOver;
                ModelEventListen.Get(obj).onExit = OnExit;}
            showText = node.InnerText;}//鼠标进入事件privatevoidOnEnter(GameObject obj){//判断是否点击到UI上,点击到UI返回if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())return;
            showImg.gameObject.SetActive(true);//显示UI提示框
            showImg.GetComponentInChildren<Text>().text = showText;//更新UI上显示的内容为当前物体的信息}//鼠标悬停事件privatevoidOnOver(GameObject obj){//更新UI的位置,并让它等于鼠标的位置加上一个Y轴上的偏移
            showImg.transform.position = Input.mousePosition+newVector3(0,100,0);
            showImg.GetComponentInChildren<Text>().text = showText;}//鼠标移出事件privatevoidOnExit(GameObject obj){
            showImg.gameObject.SetActive(false);}}}

将该脚本挂载到Panel_MouseOver物体上。

效果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签: unity 游戏 ui

本文转载自: https://blog.csdn.net/qq_42437783/article/details/122697913
版权归原作者 周周的Unity小屋 所有, 如有侵权,请联系我们删除。

“Unity实现游戏里鼠标悬停在物体处显示UI提示(介绍、名称等信息)的一种方法(可配置的xml文件形式)”的评论:

还没有评论