一、简介


  1. 基于Highlighting System插件的鼠标选中物体时,使物体高亮显示。在这个插件的基础上,改动小部分功能,使物体可以高亮显示。
  2. 在网上有很多这鼠标高亮显示的相关资料,要么不符合自己的要求,要么符合的效果不满意。所以基于这个插件,虽然也有些功能不符合本人的需求,不过可以进行少许改动,下次做项目时,在使用到鼠标选中功能时,直接引用这个脚本和插件就OK了。
  3. 该文章仅供学习,记录。不喜勿喷!
    demo效果图:

    实际项目效果图1:

    实际项目效果图2:

二、准备工作


1、导入Highlighting System插件,或者不导入直接下载本人做好的demo也可以。
2、在摄像机中添加Highlighting Effect脚本,该脚本必须添加否则Game视口如何显示物体的高亮,具体如下:

MouseHighlight脚本是本人自己写的,功能就是选中物体高亮,不选中就取消高亮。
3、在场景中随便拖入几个物体,如Cube等,必须有碰撞器的物体,为什么要加碰撞器那就是射线的相关知识了

4、上述工作做完后,就开始看看主要脚本MouseHighlight.cs了。

三、实现鼠标选中高亮

1、在这个插件用有很多显示高亮的特效,如:SpectrumController.cs、FlashingController.cs等,不过无需使用这么多,只采用一种即可,我采用的是“SpectrumController.cs”这个类来作为高亮显示的特效。其他特效以及其他功能如图:

2、创建MouseHighlight.cs类或者随意创建一个类

****2.1 定义一个变量gameCheck,用于存储选中的物体

public GameObject gameCheck;

****2.2在Update()里执行的代码
主要实现思路是当按下鼠标左键时,发射一条射线,当射线照射到物体时,获取到该物体的对象。然后执行SetObjectHighlight(GameObject obj);该方法下面会讲。

void Update () {if(Input.GetMouseButtonDown(0)) {var ray = Camera.main.ScreenPointToRay(Input.mousePosition);//鼠标的屏幕坐标转化为一条射线RaycastHit hit;//距离为5//if(Physics.Raycast(ray, out hit, 5)) {//    var hitObj = hit.collider.gameObject;//    Debug.Log(hitObj);//}//无距离限制if(Physics.Raycast(ray, out hit)) {var hitObj = hit.collider.gameObject;SetObjectHighlight(hitObj);Debug.Log(hitObj);}}}

****2.3 设置物体高亮
这个方法很好理解,如果gameCheck这个变量为空,表示没有物体被选中,直接使该物体处于高亮状态;如果gameCheck这个变量与选中的这个变量是一样的,则使选中的这个物体取消高亮显示状态;gameCheck这个变量与选中的物体不一样的话,把gameCheck这个物体取消高亮显示,把选中的物体设置为高亮。(如果是多选的话,后面会给出思路介绍)

/// <summary>/// 设置物体高亮/// </summary>/// <param name="obj"></param>public void SetObjectHighlight(GameObject obj){if(gameCheck == null) {AddComponent(obj);}else if(gameCheck == obj) {RemoveComponent(obj);}else {RemoveComponent(gameCheck);AddComponent(obj);}}

****2.4 取消高亮显示/添加高亮显示
**(1)添加高亮显示
使物体高亮根据这个插件的Demo,只需要为该物体添加SpectrumController.cs类即可使物体高亮(也可添加其他类,具体可看该插件的demo),但是显示高亮之后还不行,因为根据该脚本的代码,他还有闪烁、颜色改变等功能,不过对于我们来说,并没有必要。

/// <summary>/// 添加高亮组件/// </summary>/// <param name="obj"></param>public void AddComponent(GameObject obj){if(obj.GetComponent<SpectrumController>() == null) {obj.AddComponent<SpectrumController>();}gameCheck = obj;}

改动下SpectrumController.cs类中的部分参数,将闪烁(speed)速度设为0,颜色(col)根据自己要求进行自定义改动.

(2)取消高亮显示
取消高亮显示也很简单,只需要将SpectrumController.cs脚本和HighlightableObject.cs脚本移出掉即可。HighlightableObject.cs脚本是执行SpectrumController.cs脚本时会添加HighlightableObject.cs脚本。该脚本具体功能就是使物体高亮。
//Destroy(obj.GetComponent());功能是移出物体的某个组件

/// <summary>/// 移出组件/// </summary>/// <param name="obj"></param>public void RemoveComponent(GameObject obj){if(obj.GetComponent<SpectrumController>() != null) {Destroy(obj.GetComponent<SpectrumController>());}if(obj.GetComponent<HighlightableObject>() != null) {Destroy(obj.GetComponent<HighlightableObject>());}gameCheck = null;}

demo下载链接

四、扩展思路


1、实现多选
**如果要实现多选功能的话,就不能只定义gameCheck变量了,需要定义一个泛型变量List或者数组,当选中物体时,判断该泛型是否存在此选中的物体对象,如果不存在则执行高亮功能,并且加入到该泛型中。一般多选都是按住Ctrl键+鼠标左键,所以你需要设置一个参数,该参数可能对demo并没有什么影响,但是在真正的项目中就可能会产生影响。
在Edit->Project Settings->Input下

将下面选中的这个删除掉,或者不删除但是自己要清楚有这么个东西。这个Positive Button的值为left ctrl表示的是按左Ctrl也可实现鼠标左键功能。

2、使用其他选中特效

Unity3D实现鼠标选中“高亮”显示功能相关推荐

  1. java鼠标进入高亮效果_鼠标选中文本划词高亮、再次选中划词取消高亮效果

    当我们需要鼠标选中文本后,文本高亮.当再次将选中的文本选中后,取消高亮效果时该如何实现呢? 一.介绍 window.getSelection 获取鼠标选中内容,主要是利用了window.getSele ...

  2. 【ubuntu】vim中鼠标选中时变成 可视模式,不能复制的解决方法

    1.问题描述 配置好vim后,打开一个文件,鼠标选中文本时,选中的内容变成可视模式. 可视模式,不能将选中内容复制到剪切板 2.解决方法 在用户根目录下,打开 .vimrc ~$ vi .vimrc ...

  3. VUE预览PDF文件并利用pdf.js获取鼠标选中的文字和搜索,在iframe中获取选中文字,监听鼠标事件,右键菜单

    一.VUE预览PDF文件并利用pdf.js获取鼠标选中的文字和搜索 需求实现:vue实现预览pdf文件,获取到鼠标选中的文字数据.调用pdf.js自带的搜索方法实现搜索功能(后期可以调用该接口满足其他 ...

  4. STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

    文章目录 前言 一.LCD上的坐标 这个坐标是怎么确定的? X轴 Y轴 二.高亮显示类型 三.部分真题要求解析 四.如何高亮显示选中数据 五.代码分析 总结 前言 相关说明: 开发板:CT117E-M ...

  5. echarts图例板块默认高亮与鼠标移入高亮实现

    主要先设置 emphasis.scale= true 开启鼠标移入高亮动画,利用dispatchAction方法设置默认高亮组 块, 再检测鼠标的mouseover时间,当检测到鼠标悬停事件,取消默认 ...

  6. css选中后的背景,css怎么实现鼠标选中文字后改变背景色

    css中可以使用"::selection"选择器来实现鼠标选中文字后改变背景色效果,只需给文字元素E添加"E::selection{background: 背景色值;}& ...

  7. opencascade 获取鼠标选中对象

    opencascade 获取鼠标选中对象 #include <AIS_Shape.hxx> //这边主要也是用AIS_Shape类,这一篇是接上一篇 <鼠标交互 设置选择模式> ...

  8. labelimg选中高亮

    设置线的粗细:scale是放大尺度,这样才能保证放大后框不变大 print("scale", self.scale)painter.setPen(QPen(color, 1.0 / ...

  9. 表格隔行变色_CSS实现鼠标悬停高亮

    <!doctype html> <html> <head><meta http-equiv="content-type" content= ...

最新文章

  1. 项目实践|如何在较暗环境进行人脸检测?
  2. Hibernate 笔记1
  3. Qt调用word 例子
  4. STM8L探索套件学习笔记(转)
  5. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  6. Winform—C#读写config配置文件
  7. 利用前中,后中建立二叉搜索树和二叉树的镜像翻转
  8. 新传要不要学计算机,传媒计算机实在性:真实性表象和新传媒
  9. python实现英文新闻摘要自动提取_Python实现英文新闻摘要自动提取
  10. 恩尼格玛模拟器_用C语言编的恩格尼码模拟器
  11. 【线性代数】n阶行列式
  12. 量化交易入门阶段——MACD的背离用法(一)——DIFF背离
  13. 使用RestTemplate  对接微信付款码支付接入问题记录
  14. HOW to BECOME a GOOD THEORETICAL PHYSICIST(转载的)
  15. 第十一届蓝桥杯省赛第一场原题
  16. Fortran矩阵运算
  17. Nodejs+socket.io 搭建个人的网页聊天室
  18. 让lebel和radio/checkbox水平对齐
  19. 什么是局域网唤醒? 如何启用局域网唤醒?
  20. 假设检验/T检验/F检验/Z检验/卡方检验

热门文章

  1. python矩阵定义_python矩阵定义
  2. 自然数的公理化理论体系定义的新方法
  3. Spring Boot 中一行代码搞定Http请求!
  4. Eclipse Theia vs. VS Code:“ Theia是最多样化,最活跃的项目之一”
  5. 阿里云商标注册教程:新手自助申请步骤
  6. 微型计算机的三类接口,微型计算机及接口技术 微机原理与接口技术试题库(含答案)...
  7. 随机生成任意个数 带小数位的 列表(python)
  8. 设计模式之禅-命令模式
  9. 44Echarts - 柱状图(阶梯瀑布图)
  10. 2021下半年软考网络工程师上午真题(一)