1. 程式人生 > >Unity實現通用的物體高亮閃爍的方法(輪廓或整體高亮閃爍)

Unity實現通用的物體高亮閃爍的方法(輪廓或整體高亮閃爍)

 

一、匯入DoTween或DoTweenPro外掛到專案中

二、編寫一個控制物體輪廓高亮閃爍的指令碼,如下圖所示:

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放置的位置)改變。