unity3d 点击选中高亮_unity3d选中物体高亮 - CSDN
精华内容
参与话题
  • 当我们把鼠标移动到Button上或者点击一个Button后会使他触发高亮状态。可是当我们鼠标离开时Button应当回到默认状态。可是事实并非如此。 冷静分析,是导航导致,当你点击按钮一次之后会把焦点放在按钮上,所以点击...

    当我们把鼠标移动到Button上或者点击一个Button后会使他触发高亮状态。可是当我们鼠标离开时Button应当回到默认状态。可是事实并非如此。

    冷静分析,是导航导致,当你点击按钮一次之后会把焦点放在按钮上,所以点击完之后就是HighteLighted 状态。导航改成None就好了。

    展开全文
  • Unity3D实现鼠标选中高亮”显示功能

    万次阅读 多人点赞 2016-08-26 15:05:07
    基于Highlighting System插件的鼠标选中物体时,使物体高亮显示。在这个插件的基础上,改动小部分功能,使物体可以高亮显示。 在网上有很多这鼠标高亮显示的相关资料,要么不符合自己的要求,要么符合的效果不满意。...

    一、简介


    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、使用其他选中特效

    展开全文
  • Unity3D鼠标点击物体高亮显示

    热门讨论 2020-07-30 23:32:14
    基于Highlighting System插件的鼠标选中物体时,使物体高亮显示。在这个插件的基础上,改动部分没必要的功能,使物体可以高亮显示。直接调用该脚本里的方法就可实现物体高亮显示。
  • 一 新建材质球 二 导入 高亮效果

    一 新建材质球
    在这里插入图片描述
    二 导入
    在这里插入图片描述在这里插入图片描述

    高亮效果在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Unity3d 高亮描边插件

    热门讨论 2020-07-30 23:32:24
    一个Unity3d高亮描边插件,可以直接使用,类似游戏中人物被选中高亮描边效果
  • 一、导入HighlightingSystem高亮插件到项目中 二、编写一个控制物体轮廓高亮闪烁的脚本,如下图所示: using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Global { ...

     

    一、导入HighlightingSystem高亮插件到项目中

     

    二、编写一个控制物体轮廓高亮闪烁的脚本,如下图所示:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    namespace Global
    {
    	public class Global_CtrlHightLighting : MonoBehaviour
    	{
            public HighlightableObject m_ho;                                        //持有当前外发光需要的组件
            private float shineTime = 1F;                                           //持续发光时间
    
    
    
            /// <summary>
            /// 高亮闪烁设置
            /// </summary>
            public void HighLightSettings()
            {
                //循环往复外发光开启(参数为:颜色1,颜色2,切换时间)
                m_ho.FlashingOn(Color.cyan, Color.grey, shineTime);
    
                //关闭循环往复外发光
                m_ho.FlashingOff();
    
    
                //持续外发光开启(参数:颜色)
                m_ho.ConstantOn(Color.blue);
    
                //关闭持续外发光
                m_ho.ConstantOff();
            }
    
            /// <summary>
            /// 启用高亮
            /// </summary>
            public void EnableHighLight()
            {
                //开启外发光
                m_ho.FlashingOn(Color.cyan, Color.grey, shineTime);
            }
    
            /// <summary>
            /// 禁用高亮
            /// </summary>
            public void DisableHighLight()
            {
                //关闭外发光
                m_ho.FlashingOff();
            }
    
        }//class_end
    }
    

    三、编写通用的实现物体轮廓或者整体高亮闪烁的脚本,如下所示:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using Global;
    using kernal;
    using Control;
    
    namespace View
    {
    	public class View_SingleEquipmentPartControl : MonoBehaviour
    	{
            #region   添加的控制组件
            private HighlightableObject _HighlightableObject;                       //物体发光必要组件
            private Global_CtrlHightLighting _CtrlHightLighting;                    //物体发光控制组件
            private GameObjectDisplayUI _GameObjectDisplayUI;                       //面板显示在部件对应位置的控制组件
    
            #endregion
    
    
          
            #region   鼠标移入移出参数
            public bool isMouseEnter = false;                                       //鼠标是否进入
            public bool isMouseArea = false;                                        //鼠标是否在区域内
            private string _MouseEnterEquipmentPartName;                            //鼠标移入的设备部件名称
    
            #endregion
    
            #region   使用Shader实现高亮效果参数
            public GameObject[] equipmentParts = new GameObject[10];                //需要改变颜色的设备部件
            private Dictionary<string, Material> _EquipmentPartsOriginalMatDic;     //设备拆分部件原本材质球字典
            private Material _HighlightMat;                                         //高亮效果材质球
            private Material[] _HighlightMats;                                      //高亮效果材质球集合
    
    
    
            #endregion
    
            #region   设备部件详细信息参数
            public Transform equipmentPartControl;
            private View_EquipmentPartInfo _EquipmentPartInfo;
    
            #endregion
    
            void Start()
    		{
                           
                //给该部件添加必要的控制组件
                AddControlComponet();
    
                //实例化
                _EquipmentPartsOriginalMatDic = new Dictionary<string, Material>();
    
             }
             
    
            #region   鼠标事件方法
    
            /// <summary>
            /// 鼠标进入设备部件高亮
            /// </summary>
            private void OnMouseEnter()
            {
    
                isMouseEnter = true;
    
                if (_HighlightableObject != null && _CtrlHightLighting != null)
                {
                    //开启高亮
                    IsEquipmentPartHighlight(0, true);
    
                 
                    _MouseEnterEquipmentPartName = this.gameObject.name;
                    //print("_MouseEnterEquipmentPartName=" + _MouseEnterEquipmentPartName);
                }
    
            }
    
            //鼠标在设备部件区域内
            private void OnMouseOver()
            {
                print("鼠标在区域内");
                isMouseArea = true;
    
            }
    
    
            /// <summary>
            /// 鼠标退出设备部件
            /// </summary>
            private void OnMouseExit()
            {
    
                isMouseEnter = false;
                isMouseArea = false;
    
                if (_HighlightableObject != null && _CtrlHightLighting != null)
                {
    
                    //不开启高亮
                    IsEquipmentPartHighlight(0);
    
                    //清空鼠标移入的部件名称
                    _MouseEnterEquipmentPartName = "";
                }
            }
    
            #endregion
    
    
            #region   私有方法
    
            /// <summary>
            /// 给该部件添加必要的控制组件
            /// </summary>
            private void AddControlComponet()
            {
                _HighlightableObject = new HighlightableObject();
                if (this.gameObject.GetComponent<HighlightableObject>() == null)
                {
                    _HighlightableObject = this.gameObject.AddComponent<HighlightableObject>();
                }
                else
                {
                    _HighlightableObject = this.gameObject.GetComponent<HighlightableObject>();
                }
                
                
                _CtrlHightLighting = new Global_CtrlHightLighting();
                if (this.gameObject.GetComponent<Global_CtrlHightLighting>()==null)
                {
                    _CtrlHightLighting = this.gameObject.AddComponent<Global_CtrlHightLighting>();
                    _CtrlHightLighting.m_ho = _HighlightableObject;
                }
                else
                {
                    _CtrlHightLighting = this.gameObject.GetComponent<Global_CtrlHightLighting>();
                    _CtrlHightLighting.m_ho = _HighlightableObject;
                }
    
            }
    
    
            /// <summary>
            /// 设备部件实现高亮方法
            /// </summary>
            /// <param name="number">高亮实现的方法类型</param>
            /// <param name="isEnableHighlight">是否开启高亮(默认不开启)</param>
            private void IsEquipmentPartHighlight(int number,bool isEnableHighlight=false)
            {
                switch (number)
                {
                    case 0:
                       
                        if (isEnableHighlight)
                        {
                            //部件高亮设置(shader)
                            EnbaleEquipmentHighLightOfShader(equipmentParts);
                        }
                        else
                        {
                            //禁用高亮(shader)
                            DisbaleEquipmentHighLightOfShader(equipmentParts);
                        }
                        
                        break;
                    case 1:
                        if (isEnableHighlight)
                        {
                            //部件高亮设置(Highlight System 插件方式)
                            EnableEquipmentHighligtOfPlugins();
                        }
                        else
                        {
                            //禁用设备高亮插件Highlight System 插件方式)
                            DisableEquipmentHighlightOfPlugins();
                        }
                       
                        break;
    
                    default:
    
                        break;
                }
            }
    
    
            #region   设备部件实现高亮(Shader方式)
            /// <summary>
            /// 启用设备部件高亮(shader实现)
            /// </summary>
            /// <param name="go">需要改变颜色的设备部件</param>
            private void EnbaleEquipmentHighLightOfShader(GameObject[] go)
            {
                _HighlightMat = Resources.Load("Prefabs/HighlightMat/HightBlue") as Material;
                
                int number = go.Length;
                _HighlightMats = new Material[number];
    
                //print("需要改变颜色的部件数量="+number);
                if (number>=1)
                {
                    for (int i=0;i<number;i++)
                    {
                        _HighlightMats[i] = _HighlightMat;
                        //print("部件="+go[i]);
                        if (go[i].GetComponent<MeshRenderer>() != null)
                        {
                            if (!_EquipmentPartsOriginalMatDic.ContainsKey(go[i].name))
                            {
                                Material mat = go[i].GetComponent<Renderer>().material;
                                //print("材质球=" + mat);
                                _EquipmentPartsOriginalMatDic.Add(go[i].name, mat);
                              
                            }
                            go[i].GetComponent<MeshRenderer>().material = _HighlightMats[i];
    
                        }
                    }
                   
                }
    
            }
            /// <summary>
            /// 禁用设备部件高亮(shader实现)
            /// </summary>
            /// <param name="go">需要改变颜色的设备部件</param>
            private void DisbaleEquipmentHighLightOfShader(GameObject[] go)
            {
                int number = go.Length;
                if (number>=1)
                {
                    for (int i=0;i<number;i++)
                    {
                        if (_EquipmentPartsOriginalMatDic.ContainsKey(go[i].name))
                        {
                            Material mat;
                            _EquipmentPartsOriginalMatDic.TryGetValue(go[i].name, out mat);
                            go[i].GetComponent<Renderer>().material = mat;
    
                        }
                    }
                }
            }
    
            #endregion
    
            #region  设备部件实现高亮(Highlight System 插件方式)
    
            /// <summary>
            /// 启用高亮插件
            /// </summary>
            private void EnableEquipmentHighligtOfPlugins()
            {
                //高亮设置
                _CtrlHightLighting.HighLightSettings();
                //启用高亮
                _CtrlHightLighting.EnableHighLight();
            }
    
            /// <summary>
            /// 禁用设备高亮插件
            /// </summary>
            private void DisableEquipmentHighlightOfPlugins()
            {
                //高亮设置
                _CtrlHightLighting.HighLightSettings();
                //禁用高亮
                _CtrlHightLighting.DisableHighLight();
            }
    
            #endregion
    
    
         
    
           
    
        }//class_end
    }
    

    四、将 View_SingleEquipmentPartControl脚本添加给需要实现轮廓或者整体高亮闪烁的物体(这里默认使用整体高亮闪烁),给该物体添加碰撞体、指定对应的需要实现整体高亮闪烁的物体,如下图所示:

    五、运行测试、鼠标移入到该物体,该物体高亮、鼠标移出该物体则该物体恢复为正常,如下图所示:

    六、实现物体整体高亮的Shader链接如下:

    https://download.csdn.net/download/xiaochenxihua/10662546

    注意: private Material _HighlightMat;                                         //高亮效果材质球 的加载路径根据自身的项目(实现物体整体高亮的Shader放置的位置)改变。

     

     

     

     

     

     

    展开全文
  • 点击怪物头像后,头像高亮。(限制:高亮值只能一样) 方法 复制Unlit - Transparent Colored.shader,进行修改 1、 Shader "Unlit/Transparent Colored" 改为 Shader "Unlit/Transparent Colored (Bright)" 2、 ...
  • 在上一篇文章中,我们通过自定义着色器实现了一个简单的在3D游戏中选取、显示物体轮廓的实例。在文章最后,博主给大家留下了一个问题,就是我们的这种方法存在一定的问题,无法运用到复杂的模型上。原因是什么呢?...
  • ![图片说明](https://img-ask.csdn.net/upload/201707/15/1500125841_153312.png)不应该是正常颜色吗?
  • 需求:点选物体时,高亮显示,以示用户选中了这个物件。 官方教程:http://deepdreamgames.com/highlighting-system/ 翻译整理如下: 1、安装插件 2、在Main Camera增加HighlightingRenderer component ...
  • 在之前的一篇博文中描述了Unity3D应用嵌入WPF应用的具体实现方式,但仅仅是解决了最基本的技术问题,想要将其具体的应用到项目中还需要具体的细化。经过近期在项目中的实践进行了细化,现将本人最近的一些过程整理...
  • Unity3d场景快速烘焙【2019】

    万次阅读 多人点赞 2019-12-26 19:09:28
    很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,...
  • 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在Unity中创建和使用Shader,为后面...
  • Unity3d编辑器的使用

    千次阅读 2019-06-24 19:24:43
    第一步:双击Unity3d,点击New 第二步:填写项目信息,注意:工程必须放在空文件夹下 第三步:点击创建 第四步:工程创建完毕 文件夹介绍: Assets:放项目所有资源的文件夹 Library:文件资源库 ...
  • Unity3D UGUI下拉菜单/Dropdown组件用法、总结 Unity3D中UGUI实现下拉菜单 Chinar-本文提供全流程,中文翻译。 助力快速使用 UGUI 实现 下拉菜单 UGUI 最初是没有下拉菜单的组件的 动态添加监听事件 后来更新...
  • 插件分享: 链接:https://pan.baidu.com/s/1huncAc0 ... 或者如下 ... ...//插件导入时如若报错,将错误行代码注释掉即可 ...1.在场景摄像机上挂载 Highlighting Effect 脚本,用于渲染外发光 ...2.在需要外发光效...
  • Unity3D 5.5.5f1 Windows 10 背景 以前在使用Unity4.x的时候,如果想要把某个物体移动到屏幕中心,只需要在窗口”Hierarchy”窗口中选中这个物体,按下F按键就可以,但是这个操作在使用了5.5.5的时候变得没有用...
  • 正常情况下,unity界面编辑时可以选择在Hierarchy视图或Scene视图中选择要调整的物体。 若希望只允许在Hierarchy视图选择物体: 1.只需在Layers中将不想在Scene View 中被选中的层加锁即可。 2.通过代码实现: ...
  • 按钮点击事件重写: Button btn ; btn.onClick.AddListener(onClickEvent); private void onClickEvent() { ...... } 按钮选中事件重写: 首先要先创建一个新的按钮类,这个类要继承Unity自带的Button类 using ...
  • Unity选中物体实现描边效果(方法3:结合方法1的外轮廓渲染、方法2的选择网格) Unity选中物体实现描边效果(方法1:指定layer的外轮廓渲染) Unity选中物体实现描边效果(方法2:对物体网格顶点的外扩...
1 2 3 4 5 ... 17
收藏数 323
精华内容 129
关键字:

unity3d 点击选中高亮