Selectable是Button、InputField、Toggle、ScrollBar、Slider、Dropdown的基类。

Selectable的继承的类与接口如下:

    public class Selectable
:
UIBehaviour,
IMoveHandler,
IPointerDownHandler, IPointerUpHandler,
IPointerEnterHandler, IPointerExitHandler,
ISelectHandler, IDeselectHandler

继承自UIBehaviour的函数:

Awake:获取了一个Graphic组件赋值给m_TargetGraphic。在选择的Transition是Color Tint时,当Selectable的状态变化,会调用Graphic的CrossFadeColor函数,使颜色渐变。在选择的Transition是Sprite Swap时,当Selectable的状态变化,会获取Image(m_TargetGraphic as Image),修改其sprite。

OnEnable:把本实例加入到一个静态的List<Selectable > s_List中,然后设置实例状态,最后调用InternalEvaluateAndTransitionToSelectionState函数(会判断是否是禁用状态,然后调用DoStateTransition函数,根据m_Transition执行对应的过渡效果)。

OnDisable:把本实例从s_List中移除,并且调用InstantClearState函数清除状态。

OnDidApplyAnimationProperties:调用OnSetProperty函数,OnSetProperty函数里最终还是调用InternalEvaluateAndTransitionToSelectionState函数。

OnCanvasGroupChanged:CanvasGroup变化时,会判断CanvasGroup的Interactable是否为false,如果是则break。如果CanvasGroup的ignoreParentGroups为true的话,也break。那么表示Selectable被禁用了。然后调用OnSetProperty函数。

继承自IMoveHandler的函数:

OnMove:根据移动方向,导航到下一个Selectable组件。

继承自IPointerDownHandler的函数:OnPointerDown:调用EventSystem.current.SetSelectedGameObject(gameObject, eventData)(在EventSystem文字中讲到过这个函数)函数将自身设为选中对象,将isPointerDown设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。

继承自IPointerUpHandler的函数:

OnPointerUp:将isPointerDown设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。

继承自IPointerEnterHandler的函数:OnPointerEnter:将isPointerInside设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。

继承自IPointerExitHandler的函数:

OnPointerExit:将isPointerInside设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。

继承自ISelectHandler的函数:

OnSelect:将hasSelection设为true,调用EvaluateAndTransitionToSelectionState函数更新状态。

继承自OnDeselect的函数:

OnDeselect:将hasSelection设为false,调用EvaluateAndTransitionToSelectionState函数更新状态。

讲一下EvaluateAndTransitionToSelectionState和InternalEvaluateAndTransitionToSelectionState函数

      private void EvaluateAndTransitionToSelectionState(BaseEventData eventData)
{
if (!IsActive() || !IsInteractable())
return; UpdateSelectionState(eventData);
InternalEvaluateAndTransitionToSelectionState(false);
}

通过UpdateSelectionState决定当前状态m_CurrentSelectionState。然后调用InternalEvaluateAndTransitionToSelectionState函数。

     private void InternalEvaluateAndTransitionToSelectionState(bool instant)
{
var transitionState = m_CurrentSelectionState;
if (IsActive() && !IsInteractable())
transitionState = SelectionState.Disabled;
DoStateTransition(transitionState, instant);
}

会判断是否是禁用状态,然后调用DoStateTransition函数。在DoStateTransition中会根据m_Transition执行对应的过渡效果。

     protected virtual void DoStateTransition(SelectionState state, bool instant)
{
Color tintColor;
Sprite transitionSprite;
string triggerName; switch (state)
{
case SelectionState.Normal:
tintColor = m_Colors.normalColor;
transitionSprite = null;
triggerName = m_AnimationTriggers.normalTrigger;
break;
case SelectionState.Highlighted:
tintColor = m_Colors.highlightedColor;
transitionSprite = m_SpriteState.highlightedSprite;
triggerName = m_AnimationTriggers.highlightedTrigger;
break;
case SelectionState.Pressed:
tintColor = m_Colors.pressedColor;
transitionSprite = m_SpriteState.pressedSprite;
triggerName = m_AnimationTriggers.pressedTrigger;
break;
case SelectionState.Disabled:
tintColor = m_Colors.disabledColor;
transitionSprite = m_SpriteState.disabledSprite;
triggerName = m_AnimationTriggers.disabledTrigger;
break;
default:
tintColor = Color.black;
transitionSprite = null;
triggerName = string.Empty;
break;
} if (gameObject.activeInHierarchy)
{
switch (m_Transition)
{
case Transition.ColorTint:
StartColorTween(tintColor * m_Colors.colorMultiplier, instant);
break;
case Transition.SpriteSwap:
DoSpriteSwap(transitionSprite);
break;
case Transition.Animation:
TriggerAnimation(triggerName);
break;
}
}
}

UGUI源码之Selectable的更多相关文章

  1. 【UGUI源码分析】Unity遮罩之Mask详细解读

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

  2. 【UGUI源码分析】Unity遮罩之RectMask2D详细解读

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

  3. UGUI源码之EventSystem

    今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...

  4. uGUI源码调试

    uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...

  5. UGUI源码之Graphic

    Graphic是用来显示图像的一个抽象类,是MaskableGraphic的父类,而MaskableGraphic是Image.RawImage.Text的父类. Graphic继承于UIBehavi ...

  6. Unity UGUI图文混排源码(一)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  7. [UGUI]图文混排(二):Text源码分析

    UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...

  8. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  9. Unity UGUI图文混排源码(二)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

随机推荐

  1. 使用基于Apache Spark的随机森林方法预测贷款风险

    使用基于Apache Spark的随机森林方法预测贷款风险   原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...

  2. git分支合并及冲突解决

    小明在愉快的敲代码 vim ok 他在ok里敲了simachanping git commit -am "commit first version by xiaoming" 然后这 ...

  3. uni-app学习记录02-属性绑定.for循环

    <template> <view class="content"> <text> 我是首页 </text> <!-- 输出纯字 ...

  4. Appium + python 自动化测试环境配置

    -------------------------------------------------------------- 1. jdk-8u121-window(32位的就下载32位的,64位的就 ...

  5. Python--day28--面试题

  6. H3C ACL包过滤配置任务

  7. linux如何查看nginx是否启动

    Nginx是一个高性能的反向代理服务器,现在一般作为我们网站或其他Web服务的第一层代理,用户在浏览器请求首先经过的就是Nginx服务. 如果Nginx服务没有启动或异常结束,将会影响Web服务的正常 ...

  8. [转]Redis和Memcache区别,优缺点对比

    1. Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等. 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供li ...

  9. 对input输入框日期显示格式化

    先:导入fmt标签 在对input框进行属性设置 <input type="text" name="createtime"  value="&l ...

  10. Nginx的三种应用场景介绍

    配置虚拟主机 就是在一台服务器启动多个网站. 如何区分不同的网站: 1.域名不同 2.端口不同 1.1. 通过端口区分不同虚拟机 Nginx的配置文件: /usr/local/nginx/conf/n ...