Unity實現通用的物體高亮閃爍的方法(輪廓或整體高亮閃爍)
阿新 • • 發佈:2018-11-07
一、匯入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放置的位置)改變。