Unity3D实现鼠标选中“高亮”显示功能

一、简介


  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”这个类来作为高亮显示的特效。其他特效以及其他功能如图:
Highlighting System插件的主要特效脚本和功能脚本
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)根据自己要求进行自定义改动.
将闪烁速度设为0,颜色根据自己要求进行自定义改动
(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、使用其他选中特效

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值