赞
踩
之前做过一个选择物体的功能,
使用的是射线检测方法,
大概原理是射线返回物体的信息,改变该物体的层,
是使用的一个Outline System插件,这个插件就是把设定层里面的物体的轮廓,显示成指定颜色,这次的功能同样需要使用这个插件.下面是这个插件的脚本属性
可以看到Ourline的层默认为最大层也就是31层,而物体默认的层是0层.同时将摄像机绑定到Main Camera位置.
这次使用的方法是在一个脚本里实现IPointerEnterHandler和IPointerExitHandler两个接口,是用来判断鼠标在UI元素上移入和移出的方法,但在对应的摄像机上添加Physics Raycaster组件就可以使用在3D物体上了.
具体实现:
1,创建一个cube作为观察对象,确保在摄像机的视野中
2,在cube上创建脚本,任意命名
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class checkBooks : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler { public void OnPointerEnter(PointerEventData eventData) { SelectWidthHighlightControl(transform.gameObject); isShowInfo = true; Info = transform.name; } public void OnPointerExit(PointerEventData eventData) { SafeClear(); isShowInfo = false; } #region 边框线 Transform SelectObject; public void SelectWidthHighlightControl(GameObject go) { SafeClear(); SelectObject = go.transform; Transform[] allTransform = SelectObject.transform.GetComponentsInChildren<Transform>(); if (allTransform != null) { for (int i = 0; i < allTransform.Length; i++) { SetHighLight(allTransform[i].gameObject); } } } /// <summary> /// 清除选择设备 /// </summary> public void SafeClear() { if (SelectObject != null) { Transform[] allTransform = SelectObject.transform.GetComponentsInChildren<Transform>(); if (allTransform != null) { for (int i = 0; i < allTransform.Length; i++) { SetUnHighLight(allTransform[i].gameObject); } } SelectObject = null; } } /// <summary> /// 设置物体高亮 供全局调用 /// </summary> public void SetHighLight(GameObject go) { go.layer = 31; } //取消设置物体高亮 供全局调用 public void SetUnHighLight(GameObject go) { go.layer = 0; } #endregion #region 物体名 bool isShowInfo; //信息样式 public GUIStyle _GUIStyle; //偏移距离 float Offset = 15; //物体名称 string Info = "名字"; void OnGUI() { _GUIStyle.normal.textColor = Color.red; _GUIStyle.fontSize = 24; //标签 位置大小,信息,样式 if(isShowInfo) GUI.Label(new Rect(Input.mousePosition.x + Offset, Screen.height - Input.mousePosition.y, 100, 100), Info, _GUIStyle); } #endregion }
创建UI RawImage,如下图
从插件的预制体里复制组件拷贝到Canvas画布里
然后设置组件参数
画框的位置是选择层新建一个31层就行,然后选择你新建的层,最好是31层,要不然就该代码.
最后,在main camera里面添加组件Physics Raycaster,参数不用调整,
测试一下,当鼠标移入cube时显示高亮和名称,移出时消失,成功
总结一下
使用射线方法时,优点是挂一个脚本在摄像机上,其余想要高亮显示的物体统一添加一个标签就行,缺点是写起来较乱,方法调用麻烦.
使用IPointerEnterHandler和IPointerExitHandler方法缺点是需要在每个要高亮的物体上挂载一个,优点是方便管理,无需其他调用,代码清晰.
最后,感谢我杰哥!!!
这个是他的ID:
JayW就是我
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。