|  |  | 
 |  |  | //-------------------------------------------------------- | 
 |  |  | //    [Author]:           第二世界 | 
 |  |  | //    [Author]:           玩个游戏 | 
 |  |  | //    [  Date ]:           Tuesday, October 31, 2017 | 
 |  |  | //-------------------------------------------------------- | 
 |  |  | using UnityEngine; | 
 |  |  | 
 |  |  |  | 
 |  |  | using System; | 
 |  |  |  | 
 |  |  | namespace vnxbqy.UI | 
 |  |  |  | 
 |  |  | //关联游戏玩法功能按钮,如升星功能 | 
 |  |  | public class FunctionButton : Button | 
 |  |  | { | 
 |  |  |  | 
 |  |  |      | 
 |  |  |     public class FunctionButton : Button | 
 |  |  |     { | 
 |  |  |         [SerializeField] int m_Order = 0; | 
 |  |  |         public int order { | 
 |  |  |             get { return m_Order; } | 
 |  |  |             set { | 
 |  |  |                 m_Order = value; | 
 |  |  |             } | 
 |  |  |     [SerializeField] int m_Order = 0; | 
 |  |  |     public int order { | 
 |  |  |         get { return m_Order; } | 
 |  |  |         set { | 
 |  |  |             m_Order = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] int m_FunctionId = -1; | 
 |  |  |         public int functionId { | 
 |  |  |             get { return m_FunctionId; } | 
 |  |  |             set { | 
 |  |  |                 m_FunctionId = value; | 
 |  |  |                 OnFunctionUnLockStateChange(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] TitleBtnState m_State = TitleBtnState.Normal; | 
 |  |  |         public TitleBtnState state { | 
 |  |  |             get { return m_State; } | 
 |  |  |             set { | 
 |  |  |                 if (m_State != value) | 
 |  |  |                 { | 
 |  |  |                     m_State = value; | 
 |  |  |                     OnStateChange(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] Button m_Button; | 
 |  |  |         public Button button { | 
 |  |  |             get { return m_Button; } | 
 |  |  |             set { m_Button = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] ImageEx m_Icon; | 
 |  |  |         public ImageEx icon { | 
 |  |  |             get { return this.m_Icon; } | 
 |  |  |             set { this.m_Icon = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] TextEx m_Title; | 
 |  |  |         public TextEx title { | 
 |  |  |             get { return this.m_Title; } | 
 |  |  |             set { this.m_Title = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] RedpointBehaviour m_Redpoint; | 
 |  |  |         public RedpointBehaviour redpoint { | 
 |  |  |             get { return m_Redpoint; } | 
 |  |  |             set { m_Redpoint = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] Shadow m_Shadow; | 
 |  |  |         public Shadow shadow { | 
 |  |  |             get { return this.m_Shadow; } | 
 |  |  |             set { this.m_Shadow = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] Transform m_Locked; | 
 |  |  |         public Transform locked { | 
 |  |  |             get { return this.m_Locked; } | 
 |  |  |             set { this.m_Locked = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] int m_Audio = 1; | 
 |  |  |         public int clickAudio { | 
 |  |  |             get { return this.m_Audio; } | 
 |  |  |             set { this.m_Audio = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] bool m_UseDefaultConfig = true; | 
 |  |  |         public bool useDefaultConfig { | 
 |  |  |             get { return this.m_UseDefaultConfig; } | 
 |  |  |             set { this.m_UseDefaultConfig = value; } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         [SerializeField] FunctionButtonConfig m_AlternativeConfig; | 
 |  |  |         public FunctionButtonConfig alternativeConfig { get { return m_AlternativeConfig; } set { m_AlternativeConfig = value; } } | 
 |  |  |  | 
 |  |  |         [SerializeField] | 
 |  |  |         FunctionButtonGroup m_Group; | 
 |  |  |         public FunctionButtonGroup group { | 
 |  |  |             get { return m_Group; } | 
 |  |  |             set { | 
 |  |  |                 if (m_Group != null) | 
 |  |  |                 { | 
 |  |  |                     m_Group.UnRegister(this); | 
 |  |  |                 } | 
 |  |  |                 m_Group = value; | 
 |  |  |                 if (m_Group != null) | 
 |  |  |                 { | 
 |  |  |                     m_Group.Register(this); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public event Action<string> OnPointClickLockFunc; | 
 |  |  |         public event Action repeatClickFunc; | 
 |  |  |  | 
 |  |  |         protected override void Awake() | 
 |  |  |         { | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |             if (!Application.isPlaying) return; | 
 |  |  | #endif | 
 |  |  |             OnFunctionUnLockStateChange(); | 
 |  |  |             FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionUnLockStateChange; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         protected override void OnEnable() | 
 |  |  |         { | 
 |  |  |             base.OnEnable(); | 
 |  |  |  | 
 |  |  |             if (group != null) | 
 |  |  |             { | 
 |  |  |                 group.Register(this); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             OnStateChange(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         protected override void OnDisable() | 
 |  |  |         { | 
 |  |  |             base.OnDisable(); | 
 |  |  |  | 
 |  |  |             if (group != null) | 
 |  |  |             { | 
 |  |  |                 group.UnRegister(this); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         protected override void OnDestroy() | 
 |  |  |         { | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |             if (!Application.isPlaying) return; | 
 |  |  | #endif | 
 |  |  |             FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionUnLockStateChange; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         bool invokeForce = false; | 
 |  |  |  | 
 |  |  |         public void Invoke(bool _force) | 
 |  |  |         { | 
 |  |  |             invokeForce = _force; | 
 |  |  |             OnPointerClick(null); | 
 |  |  |             invokeForce = false; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public override void OnPointerClick(PointerEventData eventData) | 
 |  |  |         { | 
 |  |  |             if (state == TitleBtnState.Locked) | 
 |  |  |             { | 
 |  |  |                 if (OnPointClickLockFunc != null) | 
 |  |  |                 { | 
 |  |  |                     OnPointClickLockFunc(this.gameObject.name); | 
 |  |  |                 } | 
 |  |  |                 else | 
 |  |  |                 { | 
 |  |  |                     FuncOpen.Instance.ProcessorFuncErrorTip(functionId); | 
 |  |  |                 } | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (!invokeForce && state == TitleBtnState.Click) | 
 |  |  |             { | 
 |  |  |                 if (repeatClickFunc != null) | 
 |  |  |                 { | 
 |  |  |                     repeatClickFunc(); | 
 |  |  |                 } | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (base.onClick != null) | 
 |  |  |             { | 
 |  |  |                 base.onClick.Invoke(); | 
 |  |  |                 if (eventData != null) | 
 |  |  |                 { | 
 |  |  |                     SoundPlayer.Instance.PlayUIAudio(clickAudio); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             state = TitleBtnState.Click; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private void OnStateChange() | 
 |  |  |         { | 
 |  |  |             var config = useDefaultConfig ? FunctionButtonConfig.GetDefault() : m_AlternativeConfig; | 
 |  |  |             if (Application.isPlaying) | 
 |  |  |             { | 
 |  |  |                 icon.SetSprite(config.GetIconKey(state)); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             title.color = config.GetFontColor(state); | 
 |  |  |             title.fontSize = config.GetFontSize(state); | 
 |  |  |  | 
 |  |  |             if (shadow != null) | 
 |  |  |             { | 
 |  |  |                 shadow.enabled = state == TitleBtnState.Locked || state == TitleBtnState.Normal; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (locked != null) | 
 |  |  |             { | 
 |  |  |                 locked.SetActive(state == TitleBtnState.Locked); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (group != null && state == TitleBtnState.Click) | 
 |  |  |             { | 
 |  |  |                 group.NotifyToggleOn(this); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private void OnFunctionUnLockStateChange(int _functionId) | 
 |  |  |         { | 
 |  |  |             if (m_FunctionId == _functionId) | 
 |  |  |             { | 
 |  |  |                 OnFunctionUnLockStateChange(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private void OnFunctionUnLockStateChange() | 
 |  |  |         { | 
 |  |  |             if (m_FunctionId == 0) | 
 |  |  |             { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             var isOpen = m_FunctionId == -1 || FuncOpen.Instance.IsFuncOpen(m_FunctionId); | 
 |  |  |             state = isOpen ? state == TitleBtnState.Click ? TitleBtnState.Click : TitleBtnState.Normal : TitleBtnState.Locked; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |         protected override void OnValidate() | 
 |  |  |         { | 
 |  |  |             base.OnValidate(); | 
 |  |  |             OnStateChange(); | 
 |  |  |         } | 
 |  |  | #endif | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] int m_FunctionId = -1; | 
 |  |  |     public int functionId { | 
 |  |  |         get { return m_FunctionId; } | 
 |  |  |         set { | 
 |  |  |             m_FunctionId = value; | 
 |  |  |             OnFunctionUnLockStateChange(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] TitleBtnState m_State = TitleBtnState.Normal; | 
 |  |  |     public TitleBtnState state { | 
 |  |  |         get { return m_State; } | 
 |  |  |         set { | 
 |  |  |             if (m_State != value) | 
 |  |  |             { | 
 |  |  |                 m_State = value; | 
 |  |  |                 OnStateChange(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] Button m_Button; | 
 |  |  |     public Button button { | 
 |  |  |         get { return m_Button; } | 
 |  |  |         set { m_Button = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] ImageEx m_Icon; | 
 |  |  |     public ImageEx icon { | 
 |  |  |         get { return this.m_Icon; } | 
 |  |  |         set { this.m_Icon = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] TextEx m_Title; | 
 |  |  |     public TextEx title { | 
 |  |  |         get { return this.m_Title; } | 
 |  |  |         set { this.m_Title = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] RedpointBehaviour m_Redpoint; | 
 |  |  |     public RedpointBehaviour redpoint { | 
 |  |  |         get { return m_Redpoint; } | 
 |  |  |         set { m_Redpoint = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] Shadow m_Shadow; | 
 |  |  |     public Shadow shadow { | 
 |  |  |         get { return this.m_Shadow; } | 
 |  |  |         set { this.m_Shadow = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] Transform m_Locked; | 
 |  |  |     public Transform locked { | 
 |  |  |         get { return this.m_Locked; } | 
 |  |  |         set { this.m_Locked = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] int m_Audio = 1; | 
 |  |  |     public int clickAudio { | 
 |  |  |         get { return this.m_Audio; } | 
 |  |  |         set { this.m_Audio = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] bool m_UseDefaultConfig = true; | 
 |  |  |     public bool useDefaultConfig { | 
 |  |  |         get { return this.m_UseDefaultConfig; } | 
 |  |  |         set { this.m_UseDefaultConfig = value; } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     [SerializeField] FunctionButtonConfig m_AlternativeConfig; | 
 |  |  |     public FunctionButtonConfig alternativeConfig { get { return m_AlternativeConfig; } set { m_AlternativeConfig = value; } } | 
 |  |  |  | 
 |  |  |     [SerializeField] | 
 |  |  |     FunctionButtonGroup m_Group; | 
 |  |  |     public FunctionButtonGroup group { | 
 |  |  |         get { return m_Group; } | 
 |  |  |         set { | 
 |  |  |             if (m_Group != null) | 
 |  |  |             { | 
 |  |  |                 m_Group.UnRegister(this); | 
 |  |  |             } | 
 |  |  |             m_Group = value; | 
 |  |  |             if (m_Group != null) | 
 |  |  |             { | 
 |  |  |                 m_Group.Register(this); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public event Action<string> OnPointClickLockFunc; | 
 |  |  |     public event Action repeatClickFunc; | 
 |  |  |  | 
 |  |  |     protected override void Awake() | 
 |  |  |     { | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |         if (!Application.isPlaying) return; | 
 |  |  | #endif | 
 |  |  |         OnFunctionUnLockStateChange(); | 
 |  |  |         FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionUnLockStateChange; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     protected override void OnEnable() | 
 |  |  |     { | 
 |  |  |         base.OnEnable(); | 
 |  |  |  | 
 |  |  |         if (group != null) | 
 |  |  |         { | 
 |  |  |             group.Register(this); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         OnStateChange(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     protected override void OnDisable() | 
 |  |  |     { | 
 |  |  |         base.OnDisable(); | 
 |  |  |  | 
 |  |  |         if (group != null) | 
 |  |  |         { | 
 |  |  |             group.UnRegister(this); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     protected override void OnDestroy() | 
 |  |  |     { | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |         if (!Application.isPlaying) return; | 
 |  |  | #endif | 
 |  |  |         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionUnLockStateChange; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     bool invokeForce = false; | 
 |  |  |  | 
 |  |  |     public void Invoke(bool _force) | 
 |  |  |     { | 
 |  |  |         invokeForce = _force; | 
 |  |  |         OnPointerClick(null); | 
 |  |  |         invokeForce = false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public override void OnPointerClick(PointerEventData eventData) | 
 |  |  |     { | 
 |  |  |         if (state == TitleBtnState.Locked) | 
 |  |  |         { | 
 |  |  |             if (OnPointClickLockFunc != null) | 
 |  |  |             { | 
 |  |  |                 OnPointClickLockFunc(this.gameObject.name); | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 FuncOpen.Instance.ProcessorFuncErrorTip(functionId); | 
 |  |  |             } | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (!invokeForce && state == TitleBtnState.Click) | 
 |  |  |         { | 
 |  |  |             if (repeatClickFunc != null) | 
 |  |  |             { | 
 |  |  |                 repeatClickFunc(); | 
 |  |  |             } | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (base.onClick != null) | 
 |  |  |         { | 
 |  |  |             base.onClick.Invoke(); | 
 |  |  |             if (eventData != null) | 
 |  |  |             { | 
 |  |  |                 SoundPlayer.Instance.PlayUIAudio(clickAudio); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         state = TitleBtnState.Click; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void OnStateChange() | 
 |  |  |     { | 
 |  |  |         var config = useDefaultConfig ? FunctionButtonConfig.GetDefault() : m_AlternativeConfig; | 
 |  |  |         if (Application.isPlaying) | 
 |  |  |         { | 
 |  |  |             icon.SetSprite(config.GetIconKey(state)); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         title.color = config.GetFontColor(state); | 
 |  |  |         title.fontSize = config.GetFontSize(state); | 
 |  |  |  | 
 |  |  |         if (shadow != null) | 
 |  |  |         { | 
 |  |  |             shadow.enabled = state == TitleBtnState.Locked || state == TitleBtnState.Normal; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (locked != null) | 
 |  |  |         { | 
 |  |  |             locked.SetActive(state == TitleBtnState.Locked); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (group != null && state == TitleBtnState.Click) | 
 |  |  |         { | 
 |  |  |             group.NotifyToggleOn(this); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void OnFunctionUnLockStateChange(int _functionId) | 
 |  |  |     { | 
 |  |  |         if (m_FunctionId == _functionId) | 
 |  |  |         { | 
 |  |  |             OnFunctionUnLockStateChange(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void OnFunctionUnLockStateChange() | 
 |  |  |     { | 
 |  |  |         if (m_FunctionId == 0) | 
 |  |  |         { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         var isOpen = m_FunctionId == -1 || FuncOpen.Instance.IsFuncOpen(m_FunctionId); | 
 |  |  |         state = isOpen ? state == TitleBtnState.Click ? TitleBtnState.Click : TitleBtnState.Normal : TitleBtnState.Locked; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | #if UNITY_EDITOR | 
 |  |  |     protected override void OnValidate() | 
 |  |  |     { | 
 |  |  |         base.OnValidate(); | 
 |  |  |         OnStateChange(); | 
 |  |  |     } | 
 |  |  | #endif | 
 |  |  |  | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  |