UGUI源码之Selectable
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的更多相关文章
- 【UGUI源码分析】Unity遮罩之Mask详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- 【UGUI源码分析】Unity遮罩之RectMask2D详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- UGUI源码之EventSystem
今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...
- uGUI源码调试
uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...
- UGUI源码之Graphic
Graphic是用来显示图像的一个抽象类,是MaskableGraphic的父类,而MaskableGraphic是Image.RawImage.Text的父类. Graphic继承于UIBehavi ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- [UGUI]图文混排(二):Text源码分析
UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
随机推荐
- redux【react】
首先介绍一下redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 一.设计思想: (1).web应用就是一个状态机,视图和状态一一对应 (2).所有的状态保存在一个对象 ...
- Python--day23--面向对象思想求正方形面积
- pycharm下的多个python版本共存(二)
上一篇博文介绍了在windows下同时安装python2和python3.而在工作的过程中,我习惯于用pycharm作为IDE.本文将记录如何在pycharm中选择python版本,并给相应的版本安装 ...
- Vue的路由Router之导航钩子和元数据及匹配
一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接 h ...
- React MVC框架 <某某后台商品管理开源项目> 完成项目总结
**百货后台商品信息开源项目 1.利用React app脚手架 2.封装打包 buid 3.更偏向于后台程序员开发思维 4.利用的 react -redux react-router-dom ...
- PhpStorm terminal无法输入命令的解决方法
下面小编就为大家带来一篇PhpStorm terminal无法输入命令的解决方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在使用PhpStorm时,点击下面的 ...
- 原生Js 实现等比缩放页面
针对1920*1080 分配率缩放 window.addEventListener('load', adaptation); window.addEventListener('resize', ada ...
- 2019-8-31-C#-如何写-DEBUG-输出
title author date CreateTime categories C# 如何写 DEBUG 输出 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 ...
- Cannot destructure property `createHash` of 'undefined' or 'null'(next服务端渲染引入next-less错误).
next中引入@zeit/next-less因next版本过低(webpack4之前的版本)无法执行next-less内置的mini-css-extract-plugin mini-css-extra ...
- SPOJ VLATTICE (莫比乌斯反演)
传送门:https://www.spoj.com/problems/VLATTICE/en/ 题意: 在三维坐标系下,你在点(0,0,0),看的范围是(n,n,n)以内,求你可以看见多少个点没有被遮挡 ...